如何在Python-Telegram-bot的InlineKeyboard中触发sendDice功能
解决InlineKeyboard点击按钮发送骰子的问题
你遇到的问题是对CallbackQuery的使用存在局限误解——它不仅能编辑触发按钮的原消息,还能直接向用户的聊天窗口发送新消息(包括骰子、贴纸这类内容)。
核心解决思路:借助CallbackQuery对象里的message.chat.id获取用户的聊天ID,然后调用Bot的send_dice方法直接发送目标内容,无需局限于修改原消息。
修改后的完整代码示例:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ContextTypes, CallbackQueryHandler, CommandHandler, ApplicationBuilder async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: keyboard = [ [ InlineKeyboardButton("普通骰子", callback_data="dice"), InlineKeyboardButton("篮球骰子", callback_data="basketball"), ], [InlineKeyboardButton("测试", callback_data="test")], ] reply_markup = InlineKeyboardMarkup(keyboard) await update.message.reply_text("请选择:", reply_markup=reply_markup) async def button(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query await query.answer() # 先确认回调,避免客户端按钮一直显示加载状态 chat_id = query.message.chat.id if query.data == 'dice': # 发送默认普通骰子(emoji为🎲) await context.bot.send_dice(chat_id=chat_id) # 可选:编辑原消息给用户反馈 await query.edit_message_text(text="已发送普通骰子") elif query.data == 'basketball': # 指定emoji发送篮球主题骰子 await context.bot.send_dice(chat_id=chat_id, emoji="🏀") await query.edit_message_text(text="已发送篮球骰子") else: await query.edit_message_text(text=f"选择的选项: {query.data}") if __name__ == '__main__': # 替换为你的机器人Token application = ApplicationBuilder().token("YOUR_BOT_TOKEN").build() application.add_handler(CommandHandler("start", start)) application.add_handler(CallbackQueryHandler(button)) application.run_polling()
关键细节说明:
query.message.chat.id可精准获取用户的对话ID,确保消息发送到正确窗口context.bot.send_dice()支持通过emoji参数指定不同类型的骰子,可选值包括🎲、🏀、🎯、🎳、🎰- 必须先调用
query.answer(),否则用户端的按钮会一直处于加载状态,影响交互体验
内容的提问来源于stack exchange,提问作者Raysuoo
相关产品推荐
相关产品推荐

