求助:用Rasa在Telegram发送触发自定义动作的超链接消息失败
Telegram可点击文本触发意图问题修复
问题根源
你的代码无法正常工作主要有两个原因:
- Telegram的
tg://bot_command链接不支持在命令后通过&传递参数,只会识别纯命令部分,参数会被直接忽略。 - Rasa的
utter_message同时传递Markdown文本和payload时,Telegram客户端无法正确解析payload的意图与实体映射。
解决方案
方法一:使用内联键盘按钮(推荐)
内联键盘是Telegram中传递带参数交互的标准方式,兼容性更好:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup # 构建内联键盘 keyboard = [] for element in subset_elements: # 用回调数据携带元素信息,格式可自定义 button = InlineKeyboardButton(text=element, callback_data=f"select_element:{element}") keyboard.append([button]) reply_markup = InlineKeyboardMarkup(keyboard) dispatcher.utter_message(text="请选择目标元素:", reply_markup=reply_markup)
后续处理:
- 在Rasa的自定义动作中监听
callback_query事件,解析callback_data中的element值 - 或者在domain配置中映射回调数据到
select_element意图,提取element实体
方法二:修正文本链接与payload格式(仅当必须用文本链接时)
如果坚持使用文本链接,需要调整命令格式和payload结构:
for element in subset_elements: # Telegram命令参数用空格分隔,而非URL参数格式 hyperlink = f"[{element}](tg://bot_command?command=/select_element {element})" # 符合Rasa要求的payload结构 payload = { "intent": "select_element", "entities": [{"entity": "element", "value": element}] } # 用json_message传递payload dispatcher.utter_message(text=hyperlink, json_message={"payload": payload})
额外配置:
- 在Rasa的
domain.yml中确保select_element意图和element实体已正确定义 - 启用Rasa的命令参数解析功能,让bot能识别
/select_element xxx格式的命令
注意事项
- 内联键盘是Telegram交互的最优方案,文本链接的命令参数传递存在兼容性问题
- 测试时需确保bot拥有发送内联消息的权限
- 验证Rasa版本支持对应回调事件或命令解析逻辑
内容的提问来源于stack exchange,提问作者karan
相关产品推荐
相关产品推荐

