如何定期在电报机器人中发送 InlineKeyboardButton?
How to send a InlineKeyboardButton in telegram bot, periodically?
我正在尝试每 x 秒发送一个 InlineKeyboardHandler
。为此,我使用了 updater.job_queue.run_repeating
但它的行为很奇怪。
除非我先与机器人进行另一次互动,否则键盘无法使用。我写了一段简单的代码,你可以测试一下。
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, ConversationHandler, CallbackContext, CallbackQueryHandler
user_id = '*********'
tlg_token = '******************************'
SELECTING_COMMAND=1
keyboard = [[InlineKeyboardButton('Button: Print Clicked', callback_data=1)],]
reply_markup = InlineKeyboardMarkup(keyboard)
def menu(update: Update, context: CallbackContext) -> int:
update.message.reply_text('sent by command button:', reply_markup=reply_markup)
return SELECTING_COMMAND
def InlineKeyboardHandler(update: Update, _: CallbackContext) -> None:
print('clicked')
return 1
def cancel(update: Update, context: CallbackContext) -> int:
return ConversationHandler.END
updater = Updater(tlg_token, use_context=True)
dispatcher = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('request_button', menu)],
states={
SELECTING_COMMAND: [CallbackQueryHandler(InlineKeyboardHandler)],
},
fallbacks=[CommandHandler('cancel', cancel)],
)
dispatcher.add_handler(conv_handler)
j = updater.job_queue
def talker(update):
update.bot.sendMessage(chat_id=user_id, text='sent by talker:', reply_markup=reply_markup)
j.run_repeating(talker, interval=10, first=0)
updater.start_polling()
updater.bot.sendMessage(chat_id=user_id, text='/request_button')
updater.idle()
我希望在单击按钮后可以看到 'clicked' 打印出来,但除非您先单击 /request_button,否则它不会起作用。为什么?我该如何解决?
评论中提到的 a_guest 您的代码存在的问题是 InlineKeyboardHandler
只有在调用 request_button
命令后才会开始工作。
这是 InlineKeyboardHandler
独立注册的工作版本:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, ConversationHandler, CallbackContext, CallbackQueryHandler
#################################
user_id = 0
tlg_token = 'bot_token'
SELECTING_COMMAND = 1
keyboard = [[InlineKeyboardButton('Button: Print Clicked', callback_data=1)], ]
reply_markup = InlineKeyboardMarkup(keyboard)
#################################
def menu(update: Update, context: CallbackContext) -> int:
update.message.reply_text('sent by command button:', reply_markup=reply_markup)
return SELECTING_COMMAND
def InlineKeyboardHandler(update: Update, _: CallbackContext) -> None:
print('clicked')
return 1
def cancel(update: Update, context: CallbackContext) -> int:
return ConversationHandler.END
updater = Updater(tlg_token, use_context=True)
dispatcher = updater.dispatcher
updater.dispatcher.add_handler(CallbackQueryHandler(InlineKeyboardHandler))
updater.dispatcher.add_handler(CommandHandler('request_button', menu))
j = updater.job_queue
def talker(update):
update.bot.sendMessage(chat_id=user_id, text='sent by talker:', reply_markup=reply_markup)
j.run_repeating(talker, interval=10, first=0)
updater.start_polling()
updater.bot.sendMessage(chat_id=user_id, text='/request_button')
updater.idle()
该问题的另一个解决方案是 OP 自己在评论中提到的,您将 CallbackQueryHandler 添加为入口点:
entry_points=[CommandHandler('request_button', menu), CallbackQueryHandler(InlineKeyboardHandler)]
我正在尝试每 x 秒发送一个 InlineKeyboardHandler
。为此,我使用了 updater.job_queue.run_repeating
但它的行为很奇怪。
除非我先与机器人进行另一次互动,否则键盘无法使用。我写了一段简单的代码,你可以测试一下。
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, ConversationHandler, CallbackContext, CallbackQueryHandler
user_id = '*********'
tlg_token = '******************************'
SELECTING_COMMAND=1
keyboard = [[InlineKeyboardButton('Button: Print Clicked', callback_data=1)],]
reply_markup = InlineKeyboardMarkup(keyboard)
def menu(update: Update, context: CallbackContext) -> int:
update.message.reply_text('sent by command button:', reply_markup=reply_markup)
return SELECTING_COMMAND
def InlineKeyboardHandler(update: Update, _: CallbackContext) -> None:
print('clicked')
return 1
def cancel(update: Update, context: CallbackContext) -> int:
return ConversationHandler.END
updater = Updater(tlg_token, use_context=True)
dispatcher = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('request_button', menu)],
states={
SELECTING_COMMAND: [CallbackQueryHandler(InlineKeyboardHandler)],
},
fallbacks=[CommandHandler('cancel', cancel)],
)
dispatcher.add_handler(conv_handler)
j = updater.job_queue
def talker(update):
update.bot.sendMessage(chat_id=user_id, text='sent by talker:', reply_markup=reply_markup)
j.run_repeating(talker, interval=10, first=0)
updater.start_polling()
updater.bot.sendMessage(chat_id=user_id, text='/request_button')
updater.idle()
我希望在单击按钮后可以看到 'clicked' 打印出来,但除非您先单击 /request_button,否则它不会起作用。为什么?我该如何解决?
评论中提到的 a_guest 您的代码存在的问题是 InlineKeyboardHandler
只有在调用 request_button
命令后才会开始工作。
这是 InlineKeyboardHandler
独立注册的工作版本:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, ConversationHandler, CallbackContext, CallbackQueryHandler
#################################
user_id = 0
tlg_token = 'bot_token'
SELECTING_COMMAND = 1
keyboard = [[InlineKeyboardButton('Button: Print Clicked', callback_data=1)], ]
reply_markup = InlineKeyboardMarkup(keyboard)
#################################
def menu(update: Update, context: CallbackContext) -> int:
update.message.reply_text('sent by command button:', reply_markup=reply_markup)
return SELECTING_COMMAND
def InlineKeyboardHandler(update: Update, _: CallbackContext) -> None:
print('clicked')
return 1
def cancel(update: Update, context: CallbackContext) -> int:
return ConversationHandler.END
updater = Updater(tlg_token, use_context=True)
dispatcher = updater.dispatcher
updater.dispatcher.add_handler(CallbackQueryHandler(InlineKeyboardHandler))
updater.dispatcher.add_handler(CommandHandler('request_button', menu))
j = updater.job_queue
def talker(update):
update.bot.sendMessage(chat_id=user_id, text='sent by talker:', reply_markup=reply_markup)
j.run_repeating(talker, interval=10, first=0)
updater.start_polling()
updater.bot.sendMessage(chat_id=user_id, text='/request_button')
updater.idle()
该问题的另一个解决方案是 OP 自己在评论中提到的,您将 CallbackQueryHandler 添加为入口点:
entry_points=[CommandHandler('request_button', menu), CallbackQueryHandler(InlineKeyboardHandler)]