본문 바로가기
AutoBot

업비트 자동매매 - Upbit Auto Trading No.7 (텔레그램 Bot 셋팅 및 코드 작성)

by zemba 2022. 1. 18.
반응형
SMALL

안녕하세요~ Zemba입니다. 오늘은 지난번 포스팅에서 예고하였듯이 텔레그램의 Bot를 세팅하고 코드를 작성하여 메시지를 전송하는 방법에 대해서 작성해보려고 합니다.
우선 텔레그램을 사용하기 때문에 텔레그램이 설치가 되어있어야 하겠죠? ㅎㅎ
텔레그램은 PC 버전이든 모바일 버전이든 관계 없습니다~ 편하신 대로 사용하시면 됩니다.

봇 파더

텔레그램에 접속해서 친구목록(?)의 아이콘을 선택한 다음에 검색창에 @BotFather라고 검색을 하면 뭔가 차려입은 사람의 아이콘이 보이게 됩니다. ( 로봇인가..... 사람인가... ) 검색된 결과를 선택하여 해당 채팅방으로 이동합니다.
이동하게 되면 start를 통해서 시작을 합니다. 아래와 같이 그럼 사용법에 대해서 BotFather님께서 아주 자세히 설명을 해주시고 있습니다.

저희는 봇을 새로 만들어야 하기때문에 당연히(?) /newbot을 사용해야 하겠죠? ㅎㅎ
메시지 입력 부분에 /newbot을 입력합니다. 그러면 봇 아빠가 다시 물어보게 됩니다. 봇을 무엇이라 부를지 물어보게 됩니다.
그래서 저만의 봇이름을 설정하려고 my_upbit_bot이라고 입력하였더니 잘했다고 칭찬해 줍니다. ㅋㅋㅋㅋ

그다음에는  bot의 username을 입력하라고 알려주네요 ㅎㅎ 그리고 명명규칙을 예시로 보여주고 있습니다.
맨뒤에 Bot을 붙이거나 _bot을 사용하여 username을 입력하라고 알려주고 있습니다. 그래서 보시는 바와 같이 아까 사용한 봇의 명칭을 그대로 입력하니까..... 허허 이미 사용 중인 username이라고 하네요. 결국 보니까 지금 입력하는 이 bot의 이름은 UserId와 같은 개념인 것 같습니다. 그렇기 때문에 유니크해야 하기 때문에 아무도 사용할 것 같지 않은 zemba_upbit_bot으로 다시 입력하였습니다.
그랬더니 축하해주더니 정상적으로 bot이 생성되었다고 봇아빠가 말해주면서 이상한 토큰 정보를 알려주고 있습니다.
저희가 사용해야할 부분은 저 토큰 정보라고 보시면 됩니다. ( 요것은 나중에도 다시 확인이 가능합니다   😁 )

자 그럼 정상적으로 만들었으니 봇을 찾아봐야겠죠? 처음에 BotFather를 검색한 것과 같이 친구 목록(?) 아이콘을 선택하여 검색창에다가 username이라고 사용했던 그 이름을 입력해서 찾아봅니다. 저는 zemba_upbit_bot이라고 만들었으니까 @zemba_upbit로 검색하니까 잘 나오게 되네요 ㅎㅎ ( 참고로 위에 이미지에서 보시는 것과 같이 아까 BotFather방에서 /mybots의 명령을 입력하면 제가 만든 봇이 어떤 것들이 있는지 조회가 가능합니다. 그리고 해당 방의 토큰이나 설정도 변경이 가능합니다. 이점 참고해주셔요~)
그럼 이렇게 조회가 완료되면 동일하게 우리가 만든 봇에 진입합니다. 역시나 start를 해줘야 방이 정상적으로 시작이 되겠죠? ㅎㅎㅎ


자 그럼 Bot 세팅이 거의 다 끝나가고 있습니다. 이쯤에서 그럼 해당 텔레그램을 사용하기 위한 코드를 작성하려고 합니다.
자동매매 봇에서 텔레그램은 내가 어떤 티커를 구매했고 현재 그 구매한 티커의 평균 가는 얼마이며 수익 비율이 얼마인지 등을 알려주는 알람 성 메시지를 전달하기 위하여 텔레그램을 사용하기 때문에 메세지를 받아서 전달하는 역할로만 사용한다고 보시면 됩니다.
그렇기 때문에 Python에서 별도의 Class로 생성하여 메세징 처리를 할 수 있도록 만들도록 하겠습니다.

import telegram


class TelegramSender:
    def __init__(self, telegram_token):
        self.bot = telegram.Bot(token=telegram_token)

    def get_chat_id(self):
        return self.bot.getUpdates()[-1].message.chat.id

    def send(self, chat_id, msg):
        self.bot.sendMessage(chat_id=chat_id, text=msg)

이렇게 코드를 작성해 줍니다. 저도 python을 잘 몰랐는데 이번에 구현하면서 보니까 __init__부분이 해당 Class를 생성할 때 생성자로 동작한다고 하네요~ 저희는 텔레그램을 사용하기 위해서는 아까 힘들게 만든 텔레그램 봇의 토큰 정보가 반드시 필요하기 때문에 생성자 정보에 파라미터로 token정보를 전달받도록 선언하였습니다.
그리고 python telegram모듈을 import 하여 텔레그램 기능을 사용합니다. (없으면 설치해야겠죠? ㅎㅎ 인텔리제이에서는 자동으로 설치하도록 해주긴 하지만 혹시 몰라서 명령어를 첨부합니다. )

pip install telegram

 관련 모듈을 설치하고 나서 telegram.Bot(token="발급받은 token값")이 설정되면서 Bot을 사용할 수 있게 됩니다.
나머지 2개의 함수를 보시면 get_chat_id과, send의 함수가 있습니다. send를 먼저 보게 되면 누가 봐도 메시지를 보내는 기능을 하는 역할을 할 것 같은 sendMessage를 호출하고 있습니다. 그런데 여기서 파라미터 정보를 보시면 message와 chat_id라는 정보를 넘겨줘야 합니다. 그렇기 때문에 이 chat_id를 얻어와야 하는데 봇에서 바로 얻어오기 위해서 get_chat_id의 함수를 사용하여 가져오도록 하였습니다. 그런데 여기서 약간의 문제가 있습니다. ㅎㅎㅎㅎ 그냥 get_chat_id로 가져오려고 시도를 하면 아무것도 받아올 수가 없습니다.
여기저기 리서치를 해보았는데 chat_id를 받아 오기 위해서는 봇에 대화창에 아무 의미 없는 메시지를 최소한 한 개라도 입력을 해야 하더군요 ㅎㅎㅎㅎㅎㅎ 그리고 브라우저에서 확인을 해볼 수 있는데 아래처럼 URL을 입력하면 확인할 수 있습니다.

그럼 결과가 아래처럼 나옵니다. 음? 뭐 없고 ok, result에 아무것도 없이 나옵니다. 아무리 봐도 chat_id를 가져올 수가 없습니다.

그럼 메시지를 입력하고 다시 한번 보겠습니다. 봇으로 이동하여 아무 의미 없는 하이를 입력하고 다시 확인해봅니다.

아까보다 뭔가 많은 내용이 채워져서 결과가 나오게 되었는데 잘 보시면 여기에 message라는 부분이 보이고 chat이란 부분을 볼 수 있습니다. 해당 값을 잘 복사하여 사용하면 됩니다. 마지막 부분에 text에 \ud558\uc774라고 보이는 부분이 하이라는 글자를 유니코드로 표기된 것이라고 보시면 됩니다. 결과적으로 봇에 메시지를 보내게 되어 chat_id를 얻을수 있었습니다.

아까 위의 코드상에서 보시면 봇에 메세지를 보낸 후에 코드상에서 가져오게 되면 문제가 없게 됩니다. 
이 부분은 귀찮지만 절차에 한 가지로 추가를 해야 하는 부분으로만 생각해보면 될 것 같습니다. (이후 설정 파일로 관리할 것이기 때문에 첫 번째만 필요할 것으로 보입니다 ㅎㅎ )

self.bot.getUpdates()[-1].message.chat.id

그럼 텔레그램에 모든 준비가 완료되었습니다.
이번엔 정말 잘 정리해서 코드도 많이 보여드리고 하려고 했지만 결국 설정만 하고 대부분 또 주저리주저리 말이 길어졌네요 ㅎㅎㅎ...
지난번 포스팅에서 config 파일을 사용하여 각종 key들을 관리하도록 하였고 이번 포스팅에서는 텔레그램을 사용할 수 있도록 설정하였습니다. 다음 포스팅에서는 config의 데이터를 불러와서 텔레그램으로 메시지를 보내고 이게 슬슬 자동 매매의 구조를 만들어 보도록 하겠습니다.

저는 전문 투자자도 아니고 그냥 일개 개미에 불과하면 그냥 개발자이기 때문에 전문적인 지식이 없어 실제 투자의 결정은 본인에게 있습니다.

반응형
LIST

댓글