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

使用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:13