파이썬 Python 텔레그램 봇 메뉴 버튼 GUI 만들기

지난번에 파이썬을 이용해서 간단하게 텔레그램 채팅봇을 만드는 방법을 알아봤습니다. 봇생성과 메시지 받는거까지는 정말 간단합니다. 봇의 로직은 MessageLoop에서 돌아갈 handel함수에서 제어를 하기 때문에 정말 특별한 기능이 아니라면 텔레그램 봇 기능보다는 파이썬 로직을 아마 더 신경 써야할 것으로 보입니다.

 

텔레그램 봇 버튼

다만 telepot에 아마 좀더 편리한 기능들이 숨어있다고는 생각합니다. 그래서 오늘은 telepot에 이미 만들어져있는 기능을 이용해서 텔레그램 채팅창에 GUI메뉴를 만들어 볼까 합니다. 저는 현재 알림봇을 만들고 있는데요. 채팅으로 메뉴를 제어하지 않고 메뉴 버튼을 이용해서 사용하고 있습니다. 뭐가 더 편리 한지는 아직 잘 모르겠습니다. 괜히 UX가 중요한게 아닌거 같다는 생각이 드네요.

 

코드는 현재 사용하고 있는 텔레그램 알림봇 코드를 가져왔습니다. 본인이 만들고 싶은 용도에 맡게 변경하셔서 사용하시면 됩니다.

import telepot
from telepot.loop import MessageLoop
from telepot.namedtuple import InlineKeyboardMarkup
from telepot.namedtuple import InlineKeyboardButton

btn_keyword = InlineKeyboardButton(text="키워드 설정", callback_data="키워드 설정")

btn_add = InlineKeyboardButton(text="추가", callback_data="키워드 추가")
btn_remove = InlineKeyboardButton(text="삭제", callback_data="키워드 삭제")
btn_reset = InlineKeyboardButton(text="초기화", callback_data="키워드 초기화")
btn_show = InlineKeyboardButton(text="보기", callback_data="키워드 보기")
 
# callback_data 메뉴 버튼 클릭시 받을 콜백 데이터( 저는 그냥 저혼자 보기 편하려고 한글로 해놨습니다. )

먼저 텔레그램에서 버튼을 만들기 위해서는 telepot에 있는 InlineKeyBoardMarkup, InlineKeyBoardButtonimport해야합니다. Markup은 버튼을 아우르는 그룹이고 Button은 말그대로 버튼입니다.

 

현재 사용하고 있는 방식입니다. InlineKeyBoardButton의 파라미터로 textcallback_data가 필요합니다.

 

text는 텔레그램 화면상에 보여질 버튼 위의 텍스트입니다. callback_data는 텔레그램에서 메뉴 버튼을 클릭시 호출 받게 되는 데이터입니다. 저는 혼자 사용하는 알림봇이며, 그냥 직관적으로 보려고 한글로 사용했습니다. (본인의 스타일대로 설정하시면 됩니다.)

 

# 메시지 처리 함수
def handle(msg):
	input_chat = msg['text']

    if input_chat == '/help':
        btn_keyword = InlineKeyboardButton(
            text="키워드 설정", callback_data="키워드 설정")
        btn_add = InlineKeyboardButton(text="추가", callback_data="키워드 추가")
        btn_remove = InlineKeyboardButton(text="삭제", callback_data="키워드 삭제")
        btn_reset = InlineKeyboardButton(
            text="초기화", callback_data="키워드 초기화")
        btn_show = InlineKeyboardButton(
            text="보기", callback_data="키워드 보기")
		
# 만든 버튼을 markup으로 묶자.
        markupBtns = InlineKeyboardMarkup(
            inline_keyboard=[[btn_keyword], [btn_add, btn_remove, btn_show, btn_reset]])

# markup을 텔레그램 메시지로 보내서 사용자가 받을수 있도록하자.
        bot.sendMessage(mychid, "선택하세요.", reply_markup=markupBtns)

메시지를 처리하는 함수입니다. 현재 저는 텔레그램 채팅에서 /help를 입력 받을 경우 텔레그램 봇이 메뉴를 보여주는 형식으로 사용하고 있습니다.

 

앞에서 반든 버튼들을 모아서 markup을 만들어줍니다. InlineKeyboardMarkup을 이용하여 버튼들을 list 단위로 추가합니다. 위의 사진에보면 버튼 줄 단위가 하나의 리스트 입니다. 

코드를 보면 [btn_keyword], [btn_add, btn_remove, btn_show, btn_reset] 이렇게 리스트 단위인걸 볼 수 있습니다.

 

def answer(msg):

# 받은 메시지 data에서 버튼에 설정한 query_data를 받을 수 있습니다.
    query_id = msg["id"]
    query_data = msg["data"]
    if query_data == "키워드 추가": 
        if set_keyword:
            bot.answerCallbackQuery(query_id, text="키워드 추가가 완료되었습니다.")
        else:
            bot.answerCallbackQuery(query_id, text="추가할 키워드를 입력하세요.")
    elif query_data == "키워드 보기":
        bot.sendMessage(mychid, strKeywords)

answer 함수입니다. 해당 함수는 메뉴 버튼을 누를경우 호출되는 함수이며 받은 인자값에는 버튼에 지정한 callback_data를 가져올 수 있습니다. 즉 어떤 버튼이 눌렸는지를 알 수 있게 됩니다. 지정한 값을 이용하여 분기문으로 처리 하게 했습니다.

 

텔레그램 봇 gui 메뉴

answerCallbackQuerysendMessage처럼 채팅방에 보내는 메시지가 아니라 채팅창 상단에 알림 형태로 노출됩니다. 본인의 원하는 스타일로 선택하시면 됩니다. 

 

MessageLoop(
    bot, {'chat': handle, 'callback_query': answer}).run_as_thread()

마지막으로 MessageLoop입니다. 'chat'은 봇 채팅창에 메시지가 입력되면 호출받는 함수입니다. 그리고 callback_query를 통해서 피드백을 받을 수 있습니다.

 

간단하게 텔레그램 봇에서 메뉴버튼을 만드는걸 알아봤습니다.

그리드형(광고전용)

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band

댓글

Designed by JB FACTORY