[python] 계산 결과 응답하는 텔레그램 봇(telegram bot)만들기

이번 글에서는 파이썬으로 텔레그램 봇을 만들어 보겠습니다. 글의 순서대로 진행하는걸 추천드립니다.(참고 링크)

봇 만들기

코딩을 하기전에 우선 텔레그램 봇 토큰을 할당 받아야 합니다. BotFahter에 대화를 걸어서 /newbot 을 입력합니다.

BotFather 검색 및 /newbot 입력

BotFather 검색 및 /newbot 입력

정상적으로 /newbot을 입력했으면 BotFather가 봇의 호출 이름을 정하라고 합니다. 작당히 이름을 만들어 줍니다. 저는 test_3001ssw_bot으로 했습니다.

봇 이름 설정

정상적으로 진행되었으면 그 다음으로 봇의 사용자명을 입력하라고 합니다. 여기서는 규칙이 있는데 사용자명의 마지막은 ‘bot’ 으로 끝나야한다는 것입니다. 저는 위와 똑같이 test_3001ssw_bot을 입력하였습니다.

이렇게 봇 이름과 봇의 사용자명을 입력하면 아래와 같은 문구가 나옵니다.

봇 링크, 액세스 토큰

t.me/test_3001ssw_bot은 봇의 링크고, 5929053018:AAHoy5TW422UiNUxQr8ziN1-sIdYLQh1Rlc는 봇의 토큰 입니다.
봇의 토큰은 개발할 때 다시 필요하므로 메모장에 따로 적어둡니다.

모듈 설치

파이썬에서 텔레그램 봇을 만들기 위해서는 python-telegram-bot 모듈을 설치해야합니다.

# pip
$pip install python-telegram-bot --upgrade

# 직접 설치
$git clone https://github.com/python-telegram-bot/python-telegram-bot
$cd python-telegram-bot
$python setup.py install
코드 입력

아래와 같이 모듈을 import 합니다.

import telegram
from telegram import Update
from telegram.ext import Updater, MessageHandler, Filters, CommandHandler, CallbackContext

아래와 같이 코딩합니다.

if __name__ == "__main__":
    my_token = '5929053018:AAHoy5TW422UiNUxQr8ziN1-sIdYLQh1Rlc' # 토큰
    telegram_bot = telegram.Bot(token=my_token) # 봇 객체 생성
    updates = telegram_bot.getUpdates() # 봇의 업데이트 내용을 얻음
    
    updater = Updater(my_token, use_context=True) # 봇의 업데이트

    updater.start_polling(timeout=3, drop_pending_updates=True)
    updater.idle() # 스크립트를 멈추기 위해 사용

여기까지만 하면 봇은 생성만 되고 아무런 작동을 하지 않습니다.

메세지를 입력했을 때 응답을 하기 위해서는 Updater에 메시지 MessageHandler, CommandHandler등 핸들러를 입력해야합니다.
명령어를 입력할 땐 CommandHandler 객체를 생성한 뒤 Updater에 핸들러를 추가해야합니다.
/start 명령어에 대한 응답을 하기 위해서 아래와 같이 코딩을 합니다. 

# "/start" 입력할 때 메세지 핸들러
def start_command(update:Update, context:CallbackContext):
    try:
        update.message.reply_text("계산식을 입력하세요")
    except Exception as e:
        print(e)
        
# ....

if __name__ == "__main__":
    # ....
    
    updater = Updater(my_token, use_context=True) # 봇의 업데이트

	# 아래 두줄 입력
    start_handler = CommandHandler("start", start_command) # 사용자가 /start 입력했을때 핸들러
    updater.dispatcher.add_handler(start_handler)
    
    # ....

실행 후 봇에 /start를 입력하면 아래와 같이 응답을 합니다.

그 다음 사용자가 일반 텍스트를 입력했을 땐 MessageHandler를 등록해야 합니다.
MessageHandler도 아래와 같이 입력해줍니다.

# 일반 텍스트 메세지 핸들러
def get_message(update:Update, context:CallbackContext):
    calc = update.message.text
    result = eval(calc)
    msg = f"{calc} 계산 결과는 {result} 입니다."
    try:
        update.message.reply_text(msg)
    except Exception as e:
        print(e)
        
# ....

if __name__ == "__main__":
    # ....
    
    updater = Updater(my_token, use_context=True) # 봇의 업데이트

	# 아래 두줄 추가
    message_handler = MessageHandler(Filters.text & (~Filters.command), get_message) # 사용자가 일반적인 텍스트를 눌렀을때 처리할 핸들러
    updater.dispatcher.add_handler(message_handler)
    
    # ....

실행 하면 아래와 같이 계산을 할 수 있습니다.

위 코드에서는 명확하게 계산식을 입력하지 않으면 에러가 발생합니다.
계산기을 해주는 봇을 만들기 위해서 코드를 최대한 코드를 간략히 했습니다.

봇이라고 하면 BotFather처럼 여러 개의 명령어를 등록하고 사용자에게 그 명령어 중에 하나를 선택하게 하여 사용자의 사용 범위를 제한하는게 일반적인 방식입니다.

샘플로 만든 봇은 삭제할테니 직접 봇을 만들고, 명령어 하나 하나 만들어가며 작동하는 방식에 대해 이해를 하는 것이 좋을것 같습니다.