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

Slack WebSocket收到Hello后,如何以指定用户身份发消息及设置在线状态?

Slack Socket API 发送消息与设置用户在线状态问题

背景

按照Slack官方Socket API文档操作后,已成功建立WebSocket连接,收到的Hello消息如下:

{"type":"hello","num_connections":1,"debug_info":{"host":"applink-2","build_number":36,"approximate_connection_time":18060},"connection_info":{"app_id":"A05GWDCG6GY"}}

需求与尝试

我想利用这个WebSocket连接,通过用户令牌以指定用户身份发送消息(而非仅接收事件),尝试了以下Go代码构造Payload:

message := map[string]string{}
message["type"] = "message"
message["channel"] = channel
message["app_id"] = s.AppId
message["user_id"] = user
message["text"] = "test123"
message["token"] = token
asBytes, _ = json.Marshal(message)

但没找到通过WebSocket发送消息或设置在线状态的相关文档,最终目标是调用users.setPresence接口,让Slack用户显示在线绿点。

核心说明与解决方案

Slack的Socket Mode API核心作用是接收事件推送,并不支持通过WebSocket连接发起主动API请求(比如发消息、设置在线状态)。所有主动操作都需要通过HTTP API调用,具体如下:

1. 发送消息:使用chat.postMessage HTTP接口

需要用户令牌拥有chat:write权限,Go代码示例:

package main

import (
	"bytes"
	"encoding/json"
	"net/http"
)

func sendSlackMessage(token, channel, text string) error {
	url := "https://slack.com/api/chat.postMessage"
	payload := map[string]string{
		"channel": channel,
		"text":    text,
	}
	jsonPayload, err := json.Marshal(payload)
	if err != nil {
		return err
	}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
	if err != nil {
		return err
	}
	req.Header.Set("Authorization", "Bearer "+token)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	return nil
}

2. 设置在线状态:使用users.setPresence HTTP接口

需要用户令牌拥有users:write权限,将presence设为"auto"即可显示在线绿点,Go代码示例:

func setUserPresence(token string) error {
	url := "https://slack.com/api/users.setPresence"
	payload := map[string]string{
		"presence": "auto", // 设为"away"则显示离开状态
	}
	jsonPayload, err := json.Marshal(payload)
	if err != nil {
		return err
	}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonPayload))
	if err != nil {
		return err
	}
	req.Header.Set("Authorization", "Bearer "+token)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	return nil
}

注意事项

  • 用户令牌必须通过用户授权流程获取,且包含对应权限范围
  • Socket Mode的WebSocket连接仅用于接收事件,不能发起主动API调用
  • 调用users.setPresence后,Slack客户端的状态会同步更新为设置的值

内容的提问来源于stack exchange,提问作者Andrew Arrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:12:37