如何不使用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.listargs:对应官方API文档中的参数,比如types用来过滤频道类型,limit控制返回数量,你可以根据需求自由添加或修改
注意事项
- 不要在收到所有消息时都发送请求——仅在收到
hello消息(连接成功的确认)时发送一次,避免产生循环请求 - 你最终收到的响应会是
type为command_response的JSON消息,其中包含你需要的频道列表数据 - 确保你的授权token拥有
conversations.list方法的对应权限(比如channels:read、groups:read等)
备注:内容来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

