You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的响应内容')

关键修正点说明

  1. 异步函数要求:所有消息处理函数必须添加async关键字,并且调用reply_text时要加await,否则无法正确执行异步操作
  2. 正确获取用户输入:通过message.text获取用户发送的文本内容,用来判断点击的按钮选项
  3. 简化过滤器:使用filters.text(['Option A', 'Option B'])可以一次性匹配多个目标文本,比多个filters.regex更简洁高效
  4. 直接执行操作:不需要嵌套定义函数,直接在判断分支里调用await message.reply_text()即可完成响应

内容的提问来源于stack exchange,提问作者Sepehr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:40:54