코딩/파이썬

파이썬으로 텔레그램 봇 만들기 [5]-DEX 가격 가져오기

몽당. 2023. 2. 8. 12:00

요즘 이것저것 많이 하느라 텔레그램 봇 시리즈를 못 올렸었네요ㅠ

 

최근 ㄹㅇ 코창인생 사는중..(코인+코딩)

지금까지는 거래소에서 코인 가격을 받아와서 김프, 가격 알림 봇을 만들어봤었습니다.

 

그런데 고수들은 덱스를 이용해서도 아비트라지 봇을 만드는데 이건 어떻게 하는건지 궁금해서 DEX에서 가격 받아오는 방법을 공부해봤습니다!

 

뭐 따로 API가 있는건가? 해서 찾아보니 뭔가 다른 방법도 여러가지 있을거 같긴 합니다만 저는 모든 덱스 가격을 한번에 모아서 볼 수 있는 개꿀 사이트인 DEX Screener를 활용해 보았습니다.

 

인터넷에 찾아보니 덱스 스크리너 API가 있더라구용

DEX SCREENER API를 이용해 정보 받아오기

 

dex screener API

DOCS 읽어보니까 저런 형식으로 검색하면 그 토큰의 정보가 나오는 것 같습니다.

 

예시로 현재 홀딩중인 SWISE 토큰을 검색해보겠습니다. (이더리움 상하이 포크 때문에 이쪽 섹터가 뜨는중)

 

위의 형식처럼 검색하려면 토큰의 컨트랙트 주소를 알아야하므로 코인마켓캡, 코인게코에서 주소를 가져와서 검색해줍시다.

https://api.dexscreener.com/latest/dex/tokens/:tokenAddreses

 

이 주소에서 tokenAddreses에 SWISE 컨트랙 주소를 넣어주고 검색 고고

 

https://api.dexscreener.com/latest/dex/tokens/0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2

 

이렇게 검색해주면

이렇게 다소 어질어질한 텍스트와 함께 결과가 나옵니다.

 

이 텍스트에 해당 코인의 dex 정보가 담겨있습니다.

 

잘 읽어보시면 어떤 체인인지(이더리움,BSC,아비트럼 등등), 토큰 주소가 뭔지, 현재 가격, 최근 가격 변화율, 최근 buy/sell 등등 여러가지 정보들을 찾아볼 수 있습니다.

 

우리는 토큰의 가격 정보를 받아오고 싶기 때문에 이 여러가지 정보중 "priceUsd" 파트의 값을 가져와야겠죠?

 

요건 크롤링으로 간단하게 할 수 있습니다.

 

저번에 환율정보 가져올 때 해봤었죠?ㅎ

 

그럼 저번 김프 알림 봇 코드를 참고하여 코드를 짜보겠습니다.

DEX 가격 알림 봇 만들기

우선 전체 코드입니다.

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging
from bs4 import BeautifulSoup
import requests

accessToken = "본인 봇 API 토큰" 

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)

def echo(update: Update, context: CallbackContext) -> None:
    text = update.message.text
    information = {"bone" : "0x9813037ee2218799597d83D4a5B6F3b6778218d9",
                  "arbinu":"0xdd8e557c8804d326c72074e987de02a23ae6ef84",
                  "swise":"0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2"}

    url = f"https://api.dexscreener.com/latest/dex/tokens/{information[text]}"
    req = requests.get(url)
    req.raise_for_status()
    soup = BeautifulSoup(req.text,"html.parser")

    infor=str(soup)
    new = infor.split(",")

    
    reply = "원하는 토큰을 입력하세요"
    if "arbinu" in text:
      reply = new[7][:-1] + "\n"+new[12]+ "\n"+new[25][15:]+ "\n"+new[26]+ "\n"+new[27]+ "\n"+new[28][:-1]
    else:
      reply = new[8][:-1] + "\n"+new[13]+ "\n"+new[26][15:]+ "\n"+new[27]+ "\n"+new[28]+ "\n"+new[29][:-1]
      
    update.message.reply_text(reply)

updater = Updater(accessToken)
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text, echo))
updater.start_polling()
updater.idle()
 

텔레그램 봇 코드의 기본틀은 똑같이 떄문에 저번 김프 알림 봇을 참고하여 조금 수정하였습니다.

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext
import logging
from bs4 import BeautifulSoup
import requests
 

우선 import를 통해 여러가지 필요한 모듈들을 불러와줍니다.

text = update.message.text

information = {"bone" : "0x9813037ee2218799597d83D4a5B6F3b6778218d9",
               "arbinu":"0xdd8e557c8804d326c72074e987de02a23ae6ef84",
               "swise":"0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2"}

url = f"https://api.dexscreener.com/latest/dex/tokens/{information[text]}"
req = requests.get(url)
req.raise_for_status()
soup = BeautifulSoup(req.text,"html.parser")

infor=str(soup)
new = infor.split(",")

    
reply = "원하는 토큰을 입력하세요"
if "arbinu" in text:
  reply = new[7][:-1] + "\n"+new[12]+ "\n"+new[25][15:]+ "\n"+new[26]+ "\n"+new[27]+ "\n"+new[28][:-1]
else:
  reply = new[8][:-1] + "\n"+new[13]+ "\n"+new[26][15:]+ "\n"+new[27]+ "\n"+new[28]+ "\n"+new[29][:-1]
 

나머지 부분은 기본틀이라 똑같고 메인인 echo 함수를 뜯어보겠습니다.

information = {"bone" : "0x9813037ee2218799597d83D4a5B6F3b6778218d9",
               "arbinu":"0xdd8e557c8804d326c72074e987de02a23ae6ef84",
               "swise":"0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2"}
 

information 변수에 토큰 이름과 컨트랙트 주소를 딕셔너리 형태로 저장해주었습니다.

 

(현재 홀딩중인 코인들ㅎ 화성 갈끄니까^^)

 

자신이 원하는 토큰을 이렇게 "이름" : "컨트랙트 주소" 형태로 저장해두시면 됩니다.

url = f"https://api.dexscreener.com/latest/dex/tokens/{information[text]}"
req = requests.get(url)
req.raise_for_status()
soup = BeautifulSoup(req.text,"html.parser")
 

텔레그램 봇에게 원하는 토큰 이름을 치면 해당 토큰의 덱스 스크리너 API 정보를 받아와야하므로 주소 url 변수에 기본 주소틀을 넣고,마지막 컨트랙트 주소 부분에 아까 저장해두었던 딕셔너리의 값들과 채팅의 text값을 통해 불러와서 입력되게 해줍니다.

 

딕셔너리에서 : 앞에 나오는게 key 값, : 뒤에 나오는게 value 값입니다.

 

text(채팅) : 딕셔너리의 key 값

토큰 컨트랙트 주소 : 딕셔너리의 value 값

 

채팅(text) 입력 -> information 딕셔너리에서 key값(코인 이름)이 text인 것 찾기 -> 그값의 value값(컨트랙트 주소) 찾아서 검색

infor=str(soup)
new = infor.split(",")
 

그리고 해당 API 페이지의 모든 텍스트를 가져와서 쉼표를 기준으로 잘라주고 new 변수에 넣어줍니다.

reply = "원하는 토큰을 입력하세요"
reply = new[8][:-1] + "\n"+new[13]+ "\n"+new[26][15:]+ "\n"+new[27]+ "\n"+new[28]+ "\n"+new[29][:-1]
 

이제 new 변수에서 이름, 가격, 가격변화를 찾아봅시다.

 

노가다로 하나하나 순서 세면 됩니다^^

 

1. 이름 : 8번째 값 => "symbol":"SWISE"}

-깔끔하게 끝의 }부분을 없애기 위해 인덱싱 [:-1]을 이용해 마지막 문자인 } 을 빼고 출력

 

2. 가격 : 13번째 값 =>"priceUsd":"0.1815"

 

3. 가격 변화 : 26,27,28,29번째 값 =>

"priceChange":{"h24":17.53,"h6":-2.97,"h1":-1.84,"m5":-1.32}

-깔끔하게 시간 정보와 변동 비율만 표시하기 위해 인덱싱 이용

 

이렇게 원하는 코인 이름을 채팅으로 치면 해당 코인의 이름, 현재 가격, 최근 시간별 가격변화를 답장하도록 코드를 짰습니다.

 

+전체 코드에서는 arbinu 코인이 아비트럼 체인이라 달라서 그런지 정보의 순서가 하나씩 앞에 있길래 따로 분리했습니다. (이더리움 체인은 8번째 값이 이름부분인데 아비트럼 체인은 7번째 값이 이름부분임)

 

이렇게하면 간단하게 코인의 덱스 가격 알림 봇 코드 짜기 끝!

 

이제 실행해볼까요?

 

덱스 가격 알림 봇 작동 확인

이렇게 코드를 실행시켜주고 본인의 텔레그램 봇에 들어가봅시다.

 

그리고 본인이 저장해둔 코인 이름을 채팅으로 치면

이렇게 코인 이름, 현재 가격, 최근 가격 변화율이 차례대로 출력되는 것을 확인할 수 있습니다!

 

본인이 관심있는 코인의 이름, 컨트랙트 주소값을 딕셔너리에 차례대로 저장만 해두면 편리하게 봇을 통해 정보를 알 수 있습니다.


이제 서버 돌리면서 24시간 실행시키기만 하면 거래소와 덱스간의 가격차가 발생하면 알림을 주는 기능 정도는 코드를 합치고 좀만 수정하면 만들 수 있을거 같네요ㅎ

 

좀 더 공부하고 응용하면 매수 매도 기능까지 구현해볼 수 있을지도..?

 

근데 지금 제일 만들고 싶은건 바이낸스 마진 빌리는 봇.. ㅂㄷㅂㄷ

 

ㄹㅇ 뭔 이벤트만 나면 봇들이 다 쓸어가버려서 빌릴 수가 없어요 으엉ㅠㅠ

 

개강하기 전에 호딱 공부해봐야겠네요.

 

빠이팅!!

 

✔몽당의 코인 정보 텔레그램✔

https://t.me/mongdangcoin

 

몽당의 코인판 데굴데굴

크립토 정보와 투자일지 :) 블로그 https://blog.naver.com/mungyo7 일기장, 생각들 https://t.me/mongdangcoin

t.me