Slack机器人DM场景下message_posted触发器配置问题咨询
解决方案
1. 让message_posted触发器仅在DM中生效
不需要指定channel_ids(每个用户与机器人的DM频道ID都是动态唯一的,无法提前写死),改用频道类型过滤器限制仅在私信频道触发。修改后的触发器配置如下:
const createQuestionTrigger: Trigger<typeof CreateQuestion.definition> = { type: 'event', name: 'Create Question', description: 'Create a new question', workflow: '#/workflows/create_question', event: { event_type: 'slack#/events/message_posted', // 移除固定channel_ids,通过filter限制频道类型 filter: { version: 1, root: { statement: '{{data.channel_type}} == "im" && {{data.text}} == "create question"', }, }, }, inputs: { interactivity: { value: '{{data.interactivity}}', }, user: { value: '{{data.user_id}}', }, }, };
channel_type == "im"会自动匹配用户与机器人的私信频道,无需提前获取具体频道ID。
2. 解决app_mentioned事件的文本过滤问题
如果改用app_mentioned事件,消息文本会包含机器人ID标记(格式为<@BOT_ID>),可以利用Slack触发器表达式的字符串处理函数,移除机器人ID后再做严格匹配:
const createQuestionMentionTrigger: Trigger<typeof CreateQuestion.definition> = { type: 'event', name: 'Create Question (Mention)', description: 'Create a new question by mentioning the bot', workflow: '#/workflows/create_question', event: { event_type: 'slack#/events/app_mentioned', filter: { version: 1, root: { // 移除机器人ID标记并修剪空格后,匹配目标文本 statement: 'trim(replace({{data.text}}, "<@" + {{data.bot_user_id}} + ">", "")) == "create question"', }, }, }, inputs: { interactivity: { value: '{{data.interactivity}}', }, user: { value: '{{data.user_id}}', }, }, };
通过replace移除机器人ID标记,trim处理多余空格后,就能实现目标文本的严格相等比较。
3. 触发器的创建时机选择
- 应用安装时自动创建:如果希望每个安装应用的团队/用户都自动获得该触发器,推荐在
app_installed事件触发的工作流中动态创建。这样能在安装时获取当前团队的机器人ID、上下文等动态数据,确保触发器配置准确。 - 单独的setup快捷方式创建:如果需要用户手动开启/关闭该功能,可以创建快捷方式触发器,让用户主动触发创建流程。这种方式适合非强制的可选功能。
核心功能的触发器通常选择安装时自动创建,无需用户额外操作,体验更流畅。
内容的提问来源于stack exchange,提问作者shaun m
相关产品推荐
相关产品推荐

