如何在Pyrogram中获取ReplyKeyboardMarkup的用户选择响应?
Telegram Bot 按钮响应问题解决
你设置了ReplyKeyboardMarkup选项,但用户点击后Bot无法执行对应操作。你的初始start命令代码没问题,但后续处理按钮点击的代码存在多处错误,导致功能失效。
错误代码问题分析
你尝试的代码有这些问题:
- 消息处理函数没有使用
async关键字,Pyrogram/Telethon的消息处理器必须是异步函数 - 错误地用
filters.text()直接和字符串比较,应该获取message.text来判断用户发送的内容 - 嵌套定义的
fa2en函数不会被执行,直接调用回复方法即可 - 过滤器可以简化,无需重复写多个
filters.regex
修正后的完整代码
from pyrogram import Client, filters from pyrogram.types import ReplyKeyboardMarkup, Message @Client.on_message(filters.command('start')) async def start(client: Client, message: Message): await message.reply_text( 'Click an option', reply_markup=ReplyKeyboardMarkup( [['Option A'], ['Option B']], resize_keyboard=True, one_time_keyboard=True ) ) @Client.on_message(filters.text(['Option A', 'Option B'])) async def handle_button_click(client: Client, message: Message): if message.text == "Option A": await message.reply_text('bot prints something') elif message.text == "Option B": await message.reply_text('这是Option B的响应内容')
关键修正点说明
- 异步函数要求:所有消息处理函数必须添加
async关键字,并且调用reply_text时要加await,否则无法正确执行异步操作 - 正确获取用户输入:通过
message.text获取用户发送的文本内容,用来判断点击的按钮选项 - 简化过滤器:使用
filters.text(['Option A', 'Option B'])可以一次性匹配多个目标文本,比多个filters.regex更简洁高效 - 直接执行操作:不需要嵌套定义函数,直接在判断分支里调用
await message.reply_text()即可完成响应
内容的提问来源于stack exchange,提问作者Sepehr
相关产品推荐
相关产品推荐

