이번엔 저번 편에서 만들어 봤던 환율봇의 살짝 업그레이드 버전?으로 김프봇을 만들어보겠습니다.
거래소에서 정보를 받아오는 건 처음 해봐서 공부하고 코드 고치고 하는데 좀 오래 걸렸습니다..ㅠ
뭔가 이론은 간단한데 코드로 구현하기가 생각보다 쉽지 않더라구요.. 진짜 개발자분들 존경스럽습니다ㄷㄷ
이번에 만들 봇의 결과물은 아래와 같습니다!
이렇게 원하는 코인의 티커를 치면 봇이 거래소에서 정보를 받아와 김프와 코인의 현재 가격을 알려주는 기능입니다 :) 이번 코드에서 살짝만 손보면 김프가 얼마일 때 알림을 보내주는 기능 같은 것을 구현할 수 있습니다.
업비트-바이낸스의 김프를 계산하려면 1. 업비트의 코인 가격 2. 바이낸스의 코인 가격 3. 환율 이렇게 3가지 정보가 필요합니다.
환율 정보 받아오는 것은 지난 편에서 했기 때문에 스킵하고 거래소에서 코인 가격을 받아오는 코드를 먼저 짜보겠습니다. 달러 환율 정보 받아오기는 아래 게시물 참고 바랍니다!
파이썬으로 텔레그램 봇 만들기 [3]
2편에서는 파이썬을 통해 텔레그램 봇에서 메세지를 보내는 기능까지 구현해 보았습니다. 이번에는 저번에 이어 텔레그램 봇에게 어떠한 채팅을 치면 원하는 받아온 데이터를 답장해주는 기능
coingrylls.tistory.com
그럼 시작해봅시다!
업비트에서 코인 가격 정보 받아오기
우선 파이썬을 통해 업비트에서 정보를 받아오려면 'pyupbit' 모듈이 필요합니다.
pip install pyupbit
터미널에 위 코드를 쳐서 모듈을 다운 받아 줍니다.
import pyupbit #모듈 불러오기
coins_upbit = pyupbit.get_tickers(fiat="KRW") #업비트 원화마켓의 모든 코인 티커 가져오기
price_upbit = pyupbit.get_current_price("KRW-티커") #해당 코인의 업비트 가격 가져오기
get_tickers 함수를 통해 업비트에 있는 모든 코인들의 티커를 불러올 수 있으며 fiat="KRW"를 전달하여 원화마켓에 상장되어 있는 코인만 불러와서 coins_upbit 변수에 리스트 형태로 넣어줍니다.
get_current_price 함수는 티커를 전달 받아 그 코인의 현재 가격을 불러옵니다. 그리고 전달 받은 가격 정보는 price_upbit 변수에 넣어줍니다.
바이낸스에서 코인 가격 정보 받아오기
바이낸스에서 정보 받아오기는 업비트보다는 조금 더 복잡쓰합니다.
거래소에서 정보들을 받아오는 CCXT 모듈을 사용하기 때문에 설치해줍니다.
pip install ccxt
이제 모듈 설치는 어떻게 하는지 아시죠?ㅎ
import ccxt
binance = ccxt.binance() #바이낸스의 정보 가져옴
binance.fetch_tickers() #티커의 각종 정보를 딕셔너리로 불러옴
ticker = list(binance.fetch_tickers().keys()) #딕셔너리의 key값만 뽑아내서 리스트로 만들기
ccxt모듈의 binance함수를 통해 바이낸스의 정보를 받아와서 binance 변수에 넣어줍니다.
fetch_tickers() 함수를 통해 각 코인 티커의 정보들을 딕셔너리 형태로 불러온 후, 각 딕셔너리의 key값이 각 코인의 티커 이름이므로 key값만 가져와서 리스트 형태로 ticker 변수에 넣어줍니다.
이렇게 하면 ticker 변수에는 바이낸스의 모든 코인 티커 이름값들이 리스트 형태로 들어가게 됩니다,
coins_binance = [] #빈 리스트 생성
import re #정규식 모듈 불러오기
p = re.compile(r'\w+[/]USDT') # '/USDT'로 끝나는 형태를 찾겠다.
for i in ticker:
if p.match(i) and 'UP' not in i and 'DOWN' not in i: #레버리지토큰 필터링을 위함
coins_binance.append(i) #조건에 해당하는 값들을 빈 리스트에 하나씩 추가
위의 티커에는 바이낸스의 모든 티커가 다 들어가 있기 때문에 이 중에서 USDT 페어의 코인만 뽑아보겠습니다.
먼저 coins_binance 라는 빈 리스트를 만들어주고 정규식 모듈을 불러와줍니다.
정규식이란 조금 설명하기 복잡하긴 한데 어떠한 조건, 형태의 단어?를 찾을 때 사용합니다.
USDT 마켓의 코인 티커들은 모두 '티커/USDT' 이런 형태로 저장되어 있기 때문에 /USDT 로 끝나는 값들만 찾아주면 되겠죠?
for문을 돌려
1. '/USDT'형태로 끝남 2. 값에 'UP' 이라는 글자가 없음 3. 값에 'DOWN' 이라는 글자가 없음
이 3가지 조건을 모두 만족하는 값만 찾아서 coins_binance 리스트에 하나씩 추가해줍니다.
UP, DOWN 필터링은 레버리지 토큰을 빼주기 위해서입니다.
이렇게 하면 coins_binance 에는 '티커/USDT' 형태의 값만 모이게 됩니다.
price_binance = binance.fetch_ohlcv("티커/USDT","1s")[499][4] #바이낸스 현재가격 : 가장 최근 1초봉의 종가
마지막으로 각 티커의 가격 정보를 불러와봅시다!
가격정보를 받아오기 위해 fetch_ohlcv 함수를 사용하는데 이 함수에 티커와 시간 단위를 넣어주면 모든 가격 정보들을 받아옵니다. 'BTC/USDT' 와 '1s' 를 넣어주면 비트코인의 최근 500초간의 1초마다의 [시간, 시가, 최고가, 최저가, 종가, 거래량] 의 정보를 리스트 형태로 받아오게 됩니다.
따라서 가장 최신의 현재 가격을 얻기 위해서는 500번째 데이터의 5번째 값인 종가를 가져와야 합니다.
이렇게 하면 1초전 종가 정보를 받아오니 가장 최신 현재가를 불러올 수 있습니다 :)
그래서 최종 코드는 fetch_ohlcv 함수를 통해 가격 정보 리스트를 불러오고 인덱싱을 통해 [499](500번째 값), [4](5번째 값인 종가 정보)를 받아오면 됩니다.
여기까지 하셨으면 업비트와 바이낸스에서 각각 가격정보 가져오기 성공!
김프 구하는 식 만들기
이제 김프를 구하는 식을 만들어 봅시다.
김프 = ((업비트 가격/(바이낸스 가격*환율))*100-100
위 식을 통해 김프를 구할 수 있습니다.
따라서 김프를 구하는 코드를 짜보면 아래와 같습니다.
gimp = round((price_upbit/(price_binance*dollar))*100-100,2)
round 함수는 소수점 몇째자리까지 나타낼지 정할 수 있습니다.
round(숫자,2) 이렇게 쓰면 숫자를 소수점 둘째 자리까지 나타내줍니다.
즉 gimp 변수는 김프값을 소수점 둘째자리까지 저장하게 됩니다.
이제 최종 코드를 짜봅시다.
최종 코드
import logging
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
ContextTypes,
TypeHandler,
)
import requests
from bs4 import BeautifulSoup
import telegram
import asyncio
import pyupbit
import ccxt
# 로깅
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
logger = logging.getLogger(__name__)
#환율 받아오기
url = "https://wise.com/kr/currency-converter/usd-to-krw-rate?amount=1"
req = requests.get(url)
req.raise_for_status()
soup = BeautifulSoup(req.text,"html.parser")
dollar = soup.find("td",class_="CurrencyConversionTable_CurrencyConversionTable__Cell__7F10V CurrencyConversionTable_CurrencyConversionTable__Value__DqPpm").get_text()[:7]
dollar = float(dollar)
binance = ccxt.binance()
#/START 입력 함수
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
# 어떤 유저인지 받아옵니다.
user = update.effective_user
# 해당 유저에게 mention 하는 메시지를 보냅니다.
await update.message.reply_html(
f"Hi {user.mention_html()}!",
)
#김프 답장해주는 함수
async def track_users(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
#채팅치면 유저 정보 업데이트
fromUser = update.effective_user
chat = update.effective_chat
message = update.effective_message
bot = context.bot
#업비트 티커 가져오기
coins_upbit = pyupbit.get_tickers(fiat="KRW")
#바이낸스 티커 가져오기
binance.fetch_tickers() #티커의 각종 정보를 딕셔너리로 불러옴
ticker = list(binance.fetch_tickers().keys()) #딕셔너리의 key값만 뽑아내서 리스트로 만들기
coins_binance = []
import re
p = re.compile(r'\w+[/]USDT')
for i in ticker:
if p.match(i) and 'UP' not in i and 'DOWN' not in i: #레버리지토큰 필터링을 위함
coins_binance.append(i)
#가격정보 가져오기
price_upbit = pyupbit.get_current_price(f"KRW-{message.text}") #업비트 가격 가져오기
price_binance = binance.fetch_ohlcv(f"{message.text}/USDT","1s")[499][4] #바이낸스 현재가격 : 가장 최근 1초봉 종가
#김프
gimp = round((price_upbit/(price_binance*dollar))*100-100,2)
#조건에 맞게 입력하면 정보 답장
if f"KRW-{message.text}" in coins_upbit and price_binance != 0 and message.text !="REP":
await message.reply_text(f"코인 : {message.text}\n김프 : {gimp}%\n업비트 가격 : {format(price_upbit, ',')}원\n바이낸스 가격 : ${price_binance}")
await message.reply_text("김프를 보려면 티커(대문자)를 입력해주세요.")
print(fromUser)
print(message)
#메인함수
def main() -> None:
# 봇 설정 값 입력
"""Run the bot."""
application = (
Application.builder()
.token("자신의 봇 API 키 값")
.build()
)
# Command 타입 중에 start 명령어를 받으면 start 함수 호출
application.add_handler(TypeHandler(Update, track_users), group=-1)
application.add_handler(CommandHandler("start", start))
application.run_polling()
#코드 실행
if __name__ == "__main__":
main()
최종코드입니다...좀 길고 복잡하죠...?? 저도 죽을 뻔 했습니다..
텔레그램 관련 코드는 코인씨커님의 텔레그램 봇 만들기 포스팅을 참고하였습니다. (킹갓코인씨커님)
파이썬 텔레그램 봇 - 스팸 필터 봇 만들기
안녕하세요. 코인씨커입니다. 이번에 어제 개발 1차 완료한 텔레그램 봇이 하나 있습니다. 별건 아니고 맥...
blog.naver.com
나머지 부분은 주석 부분으로 간략히 설명해놓았고 김프 답장 기능 정도만 알아보겠습니다!
#가격정보 가져오기
price_upbit = pyupbit.get_current_price(f"KRW-{message.text}") #업비트 가격 가져오기
price_binance = binance.fetch_ohlcv(f"{message.text}/USDT","1s")[499][4] #바이낸스 현재가격 : 가장 최근 1초봉 종가
message.text 는 유저가 치는 채팅 내용을 의미합니다. 그래서 유저의 채팅을 입력받으면 그 값을 각각 가격을 가져오는 함수에 넣어 해당 티커의 가격을 받아옵니다.
#조건에 맞게 입력하면 정보 답장
if f"KRW-{message.text}" in coins_upbit and price_binance != 0 and message.text !="REP":
await message.reply_text(f"코인 : {message.text}\n김프 : {gimp}%\n업비트 가격 : {format(price_upbit, ',')}원\n바이낸스 가격 : ${price_binance}")
await message.reply_text("김프를 보려면 티커(대문자)를 입력해주세요.")
이제 마지막으로 if문을 통한 답장 기능을 알아보겠습니다.
만약
1. "KRW-'입력한티커'"가 coins_upbit 안에 들어있고
2. 바이낸스의 가격정보가 0 이 아니고 (없는 코인은 가격이 0으로 뜨는데 파이썬에서 0으로 나누면 에러가 뜨기때문(ZerodivisionError))
3. 입력한 티커가 REP 가 아니면 (왜인지는 모르겠는데 REP는 계속 잘못된 값을 받아오더라구요..바이낸스에 REP가 없는데 있다고 뜸..)
->코인 : '입력한 티커'
김프 : gimp 변수 값
업비트 가격 : format(숫자, ',')=>숫자를 3자리마다 ,로 끊어서 입력 ex.14,000,000
바이낸스 가격 : price_binance 값
그리고 "김프를 보려면 티커(대문자)를 입력해주세요." 답장
이렇게 하면 티커를 입력하면 그 코인의 김프와 현재 가격을 알려주는 봇 완성!
위 코드에 본인의 봇 API 키 값을 넣고 실행시켜주면 두구두구
이렇게 티커를 입력하면 봇이 잘 답장하는 것을 확인할 수 있습니다 :)
이제 이 코드의 if문만 수정하면 김프가 몇퍼 이상일 때 알림 보내기, 현재 가격이 얼마가 되면 알림 보내기 등등 여러가지 기능들을 만들어 볼 수 있습니다!
그럼 다음에 또 새로운 기능을 공부해서 돌아오겠습니다 뿅!
✔몽당의 코인 정보 텔레그램✔
몽당의 코인판 데굴데굴
크립토 정보와 투자일지 :) 블로그 https://blog.naver.com/mungyo7 일기장, 생각들 https://t.me/mongdangcoin
t.me
출처
Methimazole
dndi117.tistory.com
파이썬으로 텔레그램 봇 만들기 [5]-DEX 가격 가져오기 (0) | 2023.02.08 |
---|---|
파이썬으로 유튜브 영상 쉽게 다운로드하기 (0) | 2023.01.06 |
파이썬으로 텔레그램 봇 만들기 [3] (2) | 2023.01.01 |
파이썬으로 텔레그램 봇 만들기 [2] (0) | 2022.12.29 |
파이썬으로 텔레그램 봇 만들기 [1] (0) | 2022.12.28 |
댓글 영역