如何为Telegram机器人的Chat请求按钮设置对应处理器条件?
问题描述
我有两个按钮「Button-1」和「Button-2」,它们分别包含参数不同的KeyboardButtonRequestChat对象。同时存在两个处理器,用于在按钮点击后通过Chat_shared接收频道ID。但我不清楚如何设置条件,让点击「Button-1」时调用第一个处理器,点击「Button-2」时调用第二个处理器?
通常我会通过检查消息文本(如message.text == "Button-1")来设置条件,但在此场景下,点击按钮后不会向聊天框发送文本。
现有代码
按钮代码
@dp.message(lambda message: message.text == "Buttons") async def configure_source_channels(message: Message, state: FSMContext): user_id = message.from_user.id user_states[user_id] = UserStates.SOURCE_CHANNELS keyboard = ReplyKeyboardMarkup(keyboard=[ [KeyboardButton(text="button-1", request_chat=KeyboardButtonRequestChat( request_id=1, user_is_bot=False, chat_is_channel=True, chat_is_forum=False ))], [KeyboardButton(text="button-2", request_chat=KeyboardButtonRequestChat( request_id=2, user_is_bot=True, chat_is_channel=False, chat_is_forum=False ))], ])
处理器代码
@dp.message(F.chat) async def button1(msg: Message, state: FSMContext): chat_info = msg.chat_shared.chat_id @dp.message(F.chat) async def button2(msg: Message, state: FSMContext): chat_info = msg.chat_shared.chat_id
解决方案
核心思路是利用你已经定义的request_id区分不同按钮的回调:每个KeyboardButtonRequestChat的request_id是唯一标识,当用户选择聊天后,Telegram会将这个ID返回在message.chat_shared对象中,直接过滤这个值就能绑定对应处理器。
修改后的处理器代码如下:
# 绑定Button-1:过滤request_id=1的请求 @dp.message(F.chat_shared.request_id == 1) async def button1(msg: Message, state: FSMContext): chat_info = msg.chat_shared.chat_id # 在此添加Button-1对应的业务逻辑 # 绑定Button-2:过滤request_id=2的请求 @dp.message(F.chat_shared.request_id == 2) async def button2(msg: Message, state: FSMContext): chat_info = msg.chat_shared.chat_id # 在此添加Button-2对应的业务逻辑
额外注意事项:
- 确保
request_id在整个交互流程中唯一,避免不同按钮使用相同ID导致逻辑混淆 - 如果结合状态机(FSM)做流程控制,可以同时添加状态过滤,比如
@dp.message(F.chat_shared.request_id == 1, state=UserStates.SOURCE_CHANNELS)
内容的提问来源于stack exchange,提问作者XTLSREALITY
相关产品推荐
相关产品推荐

