텔레그램 챗봇 버튼 생성
파이썬에서 python-telegram-bot 라이브러리를 이용하면 편리하게 텔레그램 봇을 활용할 수 있는데요. 이 라이브러리를 활용하여 메시지 발송뿐만 아니라 채팅방에서 버튼을 생성해서 사용자에게 여러 가지 선택지를 제공할 수 있습니다. 이번 포스팅에서는 챗봇의 채팅방에서 버튼을 생성하는 방법에 대해 알아보도록 하겠습니다.
준비물
텔레그램 봇을 활용하시려면 먼저 텔레그램 앱을 설치하시고, BotFather를 통해 봇을 생성하신 뒤 토큰을 발급받아야 하는데요. 아직 준비가 되지 않으신 분들은 이 링크를 통해 챗봇을 생성하고 토큰을 얻으셔서 아래 과정들을 진행하시면 되겠습니다.
게시글 내 코드 복사 방법
우클릭 방지가 적용되어 있어서 코드 복사가 어려우실 것 같습니다. 코드 블록 우측아이콘 중 세 번째 아이콘을 클릭하시면 새창에서 코드가 표시되는데요. 이 창에서 코드를 복사하셔서 활용하시면 되겠습니다.
[목차]
필요 라이브러리 및 클래스 준비
채팅방 버튼을 생성하기 위해서는 InlineKeyboardButton, InlineKeyboardMarkup 클래스와 CallbackQueryHandler 클래스를 활용해야 하는데요. 아래와 같이 클래스들을 임포트 하고 토큰 값을 저장해 줍니다.
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler # 토큰을 bot_token 변수에 저장 bot_token = '토큰을 여기에 입력합니다.'
채팅방 버튼 생성하기
다음은 버튼을 생성해 주는 함수를 작성해 볼 건데요. InlineKeyboardButton 클래스와 InlineKeyboardMarkup 클래스를 이용하여 버튼을 생성해 주시면 됩니다. 아래 코드와 같이 작성하시면 ‘버튼 1’과 ‘버튼 2’가 생성되어 사용자에게 보이게 됩니다.
# start 명령어 함수 async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): # 버튼 생성 keyboard = [ [InlineKeyboardButton("버튼 1", callback_data='button1')], [InlineKeyboardButton("버튼 2", callback_data='button2')], ] reply_markup = InlineKeyboardMarkup(keyboard) # 채팅방으로 버튼 전송 await update.message.reply_text("채팅방 입장을 환영합니다.\n버튼을 선택해 주세요.", reply_markup=reply_markup)
메인함수 작성
위에서 작성한 버튼을 채팅방에 전송해 보기 위해, start 명령어 핸들러를 추가하고 폴링 방식으로 챗봇을 실행하는 코드를 작성해 주시면 됩니다. 명령어 관련 설명은 지난 포스팅에서 명령어 사용 방법에 대해 설명해 드렸으니, 명령어 사용에 익숙하지 않으신 분들은 이 링크를 통해 해당 포스팅을 참고해 보시면 되겠습니다.
if __name__ == '__main__': # 챗봇 application 인스턴스 생성 application = ApplicationBuilder().token(bot_token).build() # start 핸들러 start_handler = CommandHandler('start', start) # start 핸들러 추가 application.add_handler(start_handler) # 폴링 방식으로 실행 application.run_polling()
전체 코드
아래 코드는 지금까지 작성한 코드들을 통합한 코드이며, 코드를 실행해 보니 아래 사진과 같이 start 명령어가 입력되었을 때 버튼을 전송해 주는 것을 확인할 수 있었습니다.
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler # 토큰을 bot_token 변수에 저장 bot_token = '토큰을 여기에 입력합니다.' # start 명령어 함수 async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): # 버튼 생성 keyboard = [ [InlineKeyboardButton("버튼 1", callback_data='button1')], [InlineKeyboardButton("버튼 2", callback_data='button2')], ] reply_markup = InlineKeyboardMarkup(keyboard) # 채팅방으로 버튼 전송 await update.message.reply_text("채팅방 입장을 환영합니다.\n버튼을 선택해 주세요.", reply_markup=reply_markup) if __name__ == '__main__': # 챗봇 application 인스턴스 생성 application = ApplicationBuilder().token(bot_token).build() # start 핸들러 start_handler = CommandHandler('start', start) # start 핸들러 추가 application.add_handler(start_handler) # 폴링 방식으로 실행 application.run_polling()
만약 버튼의 배열을 세로로 표시하는 것이 아닌 가로로 배치하고 싶으시다면, 아래 코드와 같이 버튼 리스트를 바깥으로 변경하시고 코드를 실행하시면 버튼이 가로로 배치가 됩니다.
버튼에 기능 연결하기
지금까지 작성한 코드를 실행하면, 버튼이 정상적으로 생성되어 채팅방에 전송이 되는데요. 하지만 버튼을 눌러보면 아무런 반응이 없습니다. 버튼의 기능을 구현해 주지 않아서 인데요. 지금부터 버튼 기능을 연결하는 코드를 작성해 보겠습니다.
우선, 콜백 쿼리 핸들러를 사용할 것이기 때문에 CallbackQueryHandler 클래스를 추가로 import 해 줍니다.
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, CallbackQueryHandler # 콜백쿼리 핸들러 클래스 추가
그다음 버튼의 기능이 되는 함수를 생성해 볼 건데요. 아래와 같이 코드를 작성해 주시면 됩니다.
# 버튼 클릭 콜백 처리 async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): # 콜백 정보 저장 query = update.callback_query # 버튼 선택에 따른 기능 구현 if query.data == 'button1': await context.bot.send_message(chat_id=update.effective_chat.id, text="버튼 1을 선택하셨습니다.") elif query.data == 'button2': await context.bot.send_message(chat_id=update.effective_chat.id, text="버튼 2를 선택하셨습니다.")
버튼을 클릭했을 때 콜백을 처리하는 함수인데요. update.callback_query에서 콜백 정보를 가져와서 어떤 버튼을 눌렀는지 파악을 합니다.
query.data에 담긴 데이터는 사용자가 누른 버튼이며, 버튼 생성 함수에서 정의한 ‘button1’ 혹은 ‘button2’가 값으로 들어올 것입니다. 버튼 값으로 어떤 버튼을 눌렀는지 구분이 되며, 파악한 버튼대로 if문을 이용해 기능을 구현해 주시면 되겠습니다.
저는 간단하게 어떤 버튼을 눌렀는지 사용자에게 메시지를 보내는 기능을 넣었습니다.
끝으로, 메인 함수도 수정해 주시면 되는데요. 콜백 쿼리를 처리할 콜백 핸들러를 CallbackQueryHandler 클래스를 이용하여 생성해 주시면 됩니다.
if __name__ == '__main__': # 챗봇 application 인스턴스 생성 application = ApplicationBuilder().token(bot_token).build() # start 핸들러 start_handler = CommandHandler('start', start) # start 핸들러 추가 application.add_handler(start_handler) # 콜백 핸들러 추가 application.add_handler(CallbackQueryHandler(button_callback)) # 폴링 방식으로 실행 application.run_polling()
이렇게 코드를 작성하신 뒤 실행해 보시면 정상적으로 버튼 기능이 작동하는 것을 확인해 보실 수 있으실 겁니다.
마무리
지금까지 파이썬을 사용하여 텔레그램 봇 내에서 채팅방 버튼을 생성하는 방법에 대해 살펴보았는데요. 추가적인 기능을 확인하고 싶으시다면, 이 링크를 통해 파이썬 텔레그램 봇 라이브러리 문서 페이지에서 추가 기능들을 확인해 보시면 되겠습니다.
오늘 포스팅은 여기까지 하도록 하겠습니다.
감사합니다!
콜백 부분에서 에러가 나는데 혹시 원인 알수 있을까요?
어떤 에러인지 에러내역을 남겨주시면 확인해 볼 수 있을거 같습니다