在一个用python-telegram-bot编写的telegram机器人中,我有一些键盘按钮,当我点击其中一个按钮时,我希望显示一个警报,就像这里。警报截图
但是,当我点击按钮时,它却什么都不做,我也不知道是哪里出了问题,谢谢你!
下面是我的代码。
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Updater,
CommandHandler,
CallbackQueryHandler,
)
token = 'XXX'
updater = Updater(token=token, use_context=True)
dispatcher = updater.dispatcher
def start(update, context):
keyboard = [
[
InlineKeyboardButton("dog", callback_data='dog'),
InlineKeyboardButton("cat", callback_data='cat'),
],
]
reply_markup = InlineKeyboardMarkup(keyboard)
context.bot.send_message(
chat_id=update.effective_chat.id,
text=f'Hello {update.message.chat.first_name}!',
reply_markup=reply_markup,
)
def buttons(update, context):
query = update.callback_query
query.answer()
if query.data == 'cat':
context.bot.answer_callback_query(callback_query_id=query.id, text='you chose cat', show_alert=True)
elif query.data == 'dog':
context.bot.answer_callback_query(callback_query_id=query.id, text='you chose dog', show_alert=True)
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)
buttons_handler = CallbackQueryHandler(buttons)
dispatcher.add_handler(buttons_handler)
updater.start_polling()```
你必须删除 query.answer()
并只在不想发送警报时才发送
def buttons(update, context):
query = update.callback_query
# query.answer() # <-- move it to `else:`
if query.data == 'cat':
context.bot.answer_callback_query(callback_query_id=query.id, text='you chose cat', show_alert=True)
elif query.data == 'dog':
context.bot.answer_callback_query(callback_query_id=query.id, text='you chose dog', show_alert=True)
else:
query.answer() # <-- send it only when you have no alert
或更易读
def buttons(update, context):
query = update.callback_query
if query.data == 'cat':
query.answer(text='you chose cat', show_alert=True)
elif query.data == 'dog':
query.answer(text='you chose dog', show_alert=True)
else:
query.answer()
我的测试代码--我必须添加 updater.idle()
来维持它的运行。
#!/usr/bin/env python3.7
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Updater,
CommandHandler,
CallbackQueryHandler,
)
token = 'MY_TOKEN'
updater = Updater(token=token, use_context=True)
dispatcher = updater.dispatcher
def start(update, context):
keyboard = [
[
InlineKeyboardButton("dog", callback_data='dog'),
InlineKeyboardButton("cat", callback_data='cat'),
],
]
reply_markup = InlineKeyboardMarkup(keyboard)
# context.bot.send_message(
# chat_id=update.effective_chat.id,
# text=f'Hello {update.message.chat.first_name}!',
# reply_markup=reply_markup,
# )
update.message.reply_text(f'Hello {update.message.chat.first_name}!', reply_markup=reply_markup)
def buttons(update, context):
logger.info('Update: "%s"\nContext: "%s"', update, context.error)
query = update.callback_query
# query.answer() # <-- move it to `else`
if query.data == 'cat':
#context.bot.answer_callback_query(callback_query_id=query.id, text='you chose cat', show_alert=True)
query.answer(text='you chose cat!', show_alert=True)
elif query.data == 'dog':
#context.bot.answer_callback_query(callback_query_id=query.id, text='you chose dog', show_alert=True)
query.answer(text='you chose dog!', show_alert=True)
else:
query.answer('nothing')
start_handler = CommandHandler('start', start)
dispatcher.add_handler(start_handler)
buttons_handler = CallbackQueryHandler(buttons)
dispatcher.add_handler(buttons_handler)
updater.start_polling()
print('Running... [Press Ctrl+C to stop]')
updater.idle() # need to keep running