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

如何不使用Bolt或其他SDK,通过WebSocket发送Slack的conversations.list API请求?

如何不使用Bolt或其他SDK,通过WebSocket发送Slack的conversations.list API请求?

你现在的核心问题是发送的消息格式不符合Slack Socket Mode的要求——直接发"list"是无效的,你通过apps.connections.open建立的是Slack Socket Mode的WebSocket连接,这种连接需要特定结构的JSON消息才能调用API方法。

核心逻辑说明

当WebSocket连接成功(收到Slack返回的hello消息)后,要调用conversations.list这类API方法,必须发送一个类型为command的结构化JSON消息,Slack才会识别并处理你的请求。

针对你的代码修改方案

只需要调整on_message函数的逻辑,同时确保发送的是符合格式的JSON内容即可(Python 2.6自带json模块,无需额外安装):

#!/usr/bin/env python2.6

import httplib
import requests
import websocket
import argparse
import json  # 新增导入json模块,Python2.6默认支持

def on_message(ws, message):
    print(message)
    msg_data = json.loads(message)
    # 仅在收到连接成功的hello消息时,发送频道列表请求,避免重复请求
    if msg_data.get("type") == "hello":
        # 构造Socket Mode要求的API请求体
        request_payload = {
            "id": 1,  # 任意唯一整数,用来匹配请求与响应的对应关系
            "type": "command",  # 固定值,标识这是API命令请求
            "command": "conversations.list",  # 要调用的Slack API方法名
            # 可选:添加API参数,对应官方文档里的参数选项
            "args": {
                "types": "public_channel,private_channel",  # 过滤要返回的频道类型
                "limit": 15  # 控制返回结果的数量
            }
        }
        # 将Python字典转为JSON字符串发送
        ws.send(json.dumps(request_payload))

def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    print("Opened connection")

def run_with(url):
# websocket.enableTrace(True)
    ws = websocket.WebSocketApp(url,
    on_open=on_open,
    on_message=on_message,
    on_error=on_error,
    on_close=on_close)

    ws.run_forever()

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("token")
    args = parser.parse_args()

    url = 'https://slack.com/api/apps.connections.open'
    headers = {
'content-type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + args.token}
    r = requests.post(url, headers=headers)

    if r.json()['ok']:
        url = r.json()['url']
        run_with(url)
    else:
        print(r.content)

if __name__ == '__main__':
    main()

关键字段解释

  • id:任意整数即可,Slack会在响应消息中返回相同的id,方便你对应请求和响应内容
  • type:必须设为command,这是Socket Mode中标识API调用请求的固定类型
  • command:填写你要调用的Slack API方法名,这里就是conversations.list
  • args:对应官方API文档中的参数,比如types用来过滤频道类型,limit控制返回数量,你可以根据需求自由添加或修改

注意事项

  1. 不要在收到所有消息时都发送请求——仅在收到hello消息(连接成功的确认)时发送一次,避免产生循环请求
  2. 你最终收到的响应会是type为command_response的JSON消息,其中包含你需要的频道列表数据
  3. 确保你的授权token拥有conversations.list方法的对应权限(比如channels:read、groups:read等)

备注:内容来源于stack exchange,提问作者Jeffrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:59:37