파이썬 텔레그램 봇(telegram bot) 만들기 2: 간단 채팅봇 만들기
앞선 글에서 잠깐 언급을 했었던 것인데, 텔레그램 봇을 만드는 이유는 전자공시 조회 관련해서 알림을 받고자 하는 것이었습니다. 그전에 내가 봇에게 어떤 메시지나 명령어를 보내면 반응을 하는 봇을 파이썬으로 작성해보겠습니다. 텔레그램 API에는 그림이나 음성을 보낸다던가, bing이나 wiki에서 검색을 한다던가 기능은 많지만, 제가 필요한 것은 우선 단순히 텍스트를 보내고 받는 것이라 단순하게 작성해보았습니다.
우선 파이썬에 python-telegram-bot 패키지를 설치합니다.
pip install python-telegram-bot
설치되는 동안 버전이 몇인지 한번 보시길 바랍니다. 저도 처음에 다른 분들이 설명해놓은 코드로 시작하는데, 자꾸 Warning 메시지가 나오길래 봤더니 api가 버전업 되면서 변경이 좀 있었나 봅니다. 나중에 설명하겠지만 저는 버전 12라서 꼭 넣어야하는 옵션이 있더군요.
채팅 봇에 이용할 것들을 import해줍니다.
from telegram.ext import Updater, MessageHandler, Filters, CommandHandler
아무런 반응 없는 봇이지만 기본적으로 아래 코드가 들어갑니다.
token = 'HTTP API TOKEN'
updater = Updater(token=token, use_context=True)
dispatcher = updater.dispatcher
updater.start_polling()
updater.idle()
Updater는 실질적인 일을 하는 몸통이라 보시면 됩니다. 여기에 옵션으로 use_context = True가 들어가 있는데, 이게 앞에서 잠깐 언급들렸던 버전과 관련한 부분입니다. 버전 13이후에는 디폴트 값이라서 따로 지정해줄 필요는 없는데, 버전12에서는 저 값을 지정하지 않으면 False 값으로 오래된 Handler API를 쓰게 되며 아래와 같은 메시지를 보시게 됩니다.
TelegramDeprecationWarning: Old Handler API is deprecated - see https://git.io/fxJuV for details
실제로 기존 블로그 등의 설명에서 사용된 함수들 인자와 최근 텔레그램 사이트에서 설명된 함수들 인자를 조금씩 다르게 쓰는 것을 보아하니, 텔레그램 사이트 설명으로는 새로운 방식을 쓰라고 하네요. (args가 아닌 context를 넘기라는데, 자세히 보진 않았습니다....)
dispatcher는 updater에 기능을 하나씩 붙여주는 역할을 합니다. 나중에 예시로 보이겠지만, 직접 작성한 함수들을 dispatcher를 통해 추가를 시켜야 합니다.
start_polling()은 텔레그램으로부터 업데이트를 받아오는 일을, idle()은 메시지 입력을 기다리는 일을 한다고 보시면 됩니다.
위의 코드는 실행시켜봐야 아무 반응도 없을 것이고 명령어를 추가해보겠습니다.
from telegram.ext import Updater, CommandHandler
token = 'HTTP API TOKEN'
updater = Updater(token=token)#, use_context=True)
dispatcher = updater.dispatcher
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="자, 게임을 시작하지.")
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)
updater.start_polling()
updater.idle()
start라는 함수를 만들었고, 이 함수가 호출되면 메신저에 "자, 게임을 시작하지."란 메시지를 보냅니다. 이 start함수를 CommandHandler가 다루게 되는데, start 함수가 호출되는 것은 채팅창에 "/start" 명령어가 입력될 때 입니다.
명령어는 "/"를 붙여서 쓰게 되어 있고, CammandHandler()함수에 첫번째 인자로 명령어를 지정할 수 있습니다. 다만 한글은 안됩니다.
함수와 CommandHandler가 지정되면 dispatcher로 handler를 추가하면 됩니다.
무슨 소린가 싶어도 위의 코드를 실행하면 아래와 같습니다.
채팅명은 다 지웠는데, 분홍색이 저이고 파란색이 텔레그램 봇이 됩니다.
이제 간단하게 텍스트 메시지를 받으면 반응하는 코드를 추가하겠습니다.
from telegram.ext import Updater, MessageHandler, Filters, CommandHandler
token = 'HTTP API TOKEN'
updater = Updater(token=token)#, use_context=True)
dispatcher = updater.dispatcher
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text="자, 게임을 시작하지.")
def echo(update, context):
text = "너 지금 \'"+update.message.text+"\'이라 했니?"
context.bot.send_message(chat_id=update.effective_chat.id, text)
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)
echo_handler = MessageHandler(Filters.text & (~Filters.command), echo)
dispatcher.add_handler(echo_handler)
updater.start_polling()
updater.idle()
추가된 echo 함수야 기존 start 함수와는 다를게 없습니다. 다만 Handler가 MessageHandler입니다.
MessageHandler의 첫번째 인자가 "Filters.text & (~Filters.command)"입니다. 그냥 텍스트를 받되 명령어로 지정된 텍스트는 제외한다는 것입니다. "&" 문자부터 뒤의 내용이 붙지 않으면, 명령어를 텍스트로 인식하게 됩니다.
위의 코드를 실행하면 다음과 같습니다.
※ 간혹 자신의 chat_id를 알아야 할 때가 있습니다. 자신의 chat_id를 알고 싶으시면, 위의 코드에서 echo함수 안에 다음 한 줄을 추가해보세요. 그럼 본인의 chat_id를 알 수 있을 겁니다.
context.bot.send_message(chat_id=update.effective_chat.id, text=update.effective_chat.id)
명령어를 받거나 텍스트를 받았을 때 내부적으로 어떠한 일을 해서 정보를 반환할 것인지는 응용하는 분야에 따라 다를 것이고, 단순히 위의 함수들만으로도 메시지를 전달하고 받는 것에 대한 기본적인 것은 다 담고 있습니다.
다음에 시간이 되면 기존에 전자공시 크롤링 하는 코드와 연동해서 실시간으로 체크해서 알림을 주는 코드를 올려보겠습니다.
'컴 & 프로그래밍 > PYTHON' 카테고리의 다른 글
오차/불확도 전파(Error Propagation)을 쉽게 계산하자 (1) | 2020.06.03 |
---|---|
파이썬 보간법(python interpolation) (0) | 2020.06.02 |
파이썬 마우스, 키보드 제어 pyautogui (0) | 2020.05.16 |
파이썬 주식 캔들 스틱 차트 그리기 (3) | 2020.05.10 |
파이썬 텔레그램 봇(telegram bot) 만들기 1: 토큰(token) 받기 (0) | 2020.05.05 |