使用@slack/bolt Socket Mode无法接收user_status_changed事件
问题描述
使用@slack/bolt框架的Socket Mode接收Slack事件,消息、频道加入等事件均可正常捕获,但user_status_changed事件始终无法触发。已为机器人配置全权限范围,且通过通配符监听所有事件,仍无法捕获该事件。相关代码如下:
// Listen for all events and log them app.event(/.*/, async ({ event }) => { console.log('Received event:', event); if (event.type === 'user_status_changed') { const { user } = event; const presence = user.profile.presence; console.log(`Received user_status_changed event for user ${user.id}: ${presence}`); userPresence.set(user.id, presence); console.log(`User ${user.id} is now ${presence}`); } if (event.type === 'message') { console.log(`Received message event in channel ${event.channel}: ${event.text}`); } if (event.type === 'user_change') { const { user } = event; const presence = user.profile.presence; console.log(`Received user_status_changed event for user ${user.id}: ${presence}`); userPresence.set(user.id, presence); console.log(`User ${user.id} is now ${presence}`); }else{ console.log(event.type)} });
问题排查与解决
1. 事件类型混淆:区分「在线状态」与「自定义状态」
Slack里用户状态变更分两种独立事件,别搞混:
- presence_change:用户切换在线/离开(presence值为
active/away)时触发,这是你要的「状态切换」事件 - user_status_changed:用户设置自定义状态(比如“在开会”“休假中”这类文本状态)时触发,和在线/离开无关
你代码里监听的user_status_changed对应自定义状态变更,不是在线状态切换,这是核心问题。
2. 必须在Slack后台配置事件订阅
Socket Mode下,代码监听事件前,必须先在Slack开发者后台完成配置:
- 进入你的App管理页面,打开「Event Subscriptions」
- 确保「Enable Events」处于开启状态
- 在「Subscribe to bot events」里添加需要的事件:
- 捕获在线状态变更:添加
presence_change - 捕获自定义状态变更:添加
user_status_changed
- 捕获在线状态变更:添加
- 保存配置后,重新安装App到工作区
3. 补充权限配置
确保机器人拥有以下权限:
users:read:读取用户基本信息users:read.presence:读取用户在线状态(针对presence_change事件)
修正后的示例代码
// 监听所有事件用于调试 app.event(/.*/, async ({ event }) => { console.log('Received event type:', event.type); // 处理用户在线/离开状态变更 if (event.type === 'presence_change') { console.log(`User ${event.user} presence changed to: ${event.presence}`); userPresence.set(event.user, event.presence); } // 处理用户自定义状态变更 if (event.type === 'user_status_changed') { const { user } = event; console.log(`User ${user.id} custom status updated: ${user.profile.status_text}`); // 若需要同步presence,可在此处理 if (user.profile.presence) { userPresence.set(user.id, user.profile.presence); } } if (event.type === 'message') { console.log(`Received message in channel ${event.channel}: ${event.text}`); } });
内容的提问来源于stack exchange,提问作者Zac bayle
相关产品推荐
相关产品推荐

