【发布时间】:2021-10-28 14:22:06
【问题描述】:
我正在尝试每 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()
我希望在单击按钮后可以看到打印的“已单击”,但除非您先单击 /request_button,否则它不会起作用。为什么?我该如何解决?
【问题讨论】:
-
您的意思是您必须单击
/request_button一次 才能处理任何内联键盘按钮?如果是这样,这是意料之中的,因为没有发送/request_button对话还没有开始,因此永远不会调用SELECTING_COMMAND: [CallbackQueryHandler(InlineKeyboardHandler)]处理程序,因为对话不处于SELECTING_COMMAND状态(顺便说一下,您可能想要返回 @987654328 @来自InlineKeyboardHandler?)。 -
我的意思是当状态是SELECTING_COMMAND,而且返回1和SELECTING_COMMAND没有区别
-
嗯,这并没有回答我打算澄清问题的第一个问题。
-
是的,我必须单击一次按钮才能工作。起初,我没有正确理解您的问题。
标签: python telegram telegram-bot