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
相关产品推荐
相关产品推荐

