从电报内联按钮获取回调查询

2024-04-23 06:56:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉打电报。我不知道如何检索telegram的inlinekeyboardbuttons的回调函数。如果有人能向我解释如何检索用户响应,那将永远是一件好事

def options(update, context):
button_list = []
for each in ["yes", "no"]:
    button_list.append(InlineKeyboardButton(each, callback_data=each))
reply_markup = InlineKeyboardMarkup(build_menu(button_list))
context.bot.send_message(chat_id=update.message.chat_id,
                         text="Option Selected:",
                         reply_markup=reply_markup)

def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
"""
Returns a list of inline buttons used to generate inlinekeyboard responses

:param buttons: `List` of InlineKeyboardButton
:param n_cols: Number of columns (number of list of buttons)
:param header_buttons: First button value
:param footer_buttons: Last button value
:return: `List` of inline buttons
"""
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
if header_buttons:
    menu.insert(0, header_buttons)
if footer_buttons:
    menu.append(footer_buttons)
return menu

Tags: ofparamdefcontextupdatebuttonreplylist
1条回答
网友
1楼 · 发布于 2024-04-23 06:56:36

您必须使用CallbackQueryHandlerfunction分配给data

如果您使用模式.*,那么它将在一个函数中获取所有数据

def handle_callback_query(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[handle_callback_query] callback data: ' + update.callback_query.data)

dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))

您还可以使用模式来分配不同的函数

def query_yes(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[query_yes] callback data: ' + update.callback_query.data)

def query_no(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[query_no] callback data: ' + update.callback_query.data)

dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
dispatcher.add_handler(CallbackQueryHandler(query_no,  pattern='^no$'))

最少的工作示例

import os
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup

#  - init  -

TOKEN = os.getenv('TELEGRAM_TOKEN')

updater = Updater(token=TOKEN, use_context=True)
dispatcher = updater.dispatcher

#  - commands  -

def options(update, context):
    button_list = []
    for each in ["yes", "no"]:
        button_list.append(InlineKeyboardButton(each, callback_data=each))
    reply_markup = InlineKeyboardMarkup(build_menu(button_list))
    context.bot.send_message(chat_id=update.message.chat_id,
                             text="Option Selected:",
                             reply_markup=reply_markup)
    
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
    """
    Returns a list of inline buttons used to generate inlinekeyboard responses
    
    :param buttons: `List` of InlineKeyboardButton
    :param n_cols: Number of columns (number of list of buttons)
    :param header_buttons: First button value
    :param footer_buttons: Last button value
    :return: `List` of inline buttons
    """
    menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
    if header_buttons:
        menu.insert(0, header_buttons)
    if footer_buttons:
        menu.append(footer_buttons)
    return menu
dispatcher.add_handler(CommandHandler('options', options))

#  - one function for all data  -

def handle_callback_query(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[handle_callback_query] callback data: ' + update.callback_query.data)

#dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))

#  - different functions for different data  -

def query_yes(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[query_yes] callback data: ' + update.callback_query.data)

def query_no(update, context):
    print(update.callback_query.data)
    context.bot.send_message(chat_id=update.effective_chat.id, 
                             text='[query_no] callback data: ' + update.callback_query.data)

dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
dispatcher.add_handler(CallbackQueryHandler(query_no,  pattern='^no$'))

#  - start  -

print('Starting ...')    
updater.start_polling()
updater.idle()

相关问题 更多 >