使用代理时SlackClient.rtm_connect()失败,API调用正常求修复方案
问题原因与修复方案
我之前也碰到过一模一样的问题,核心原因其实很好理解:Slack的RTM(实时消息)接口采用的是WebSocket协议,而你通过SlackClient初始化时传入的proxies参数只对HTTP/HTTPS类型的API请求生效,WebSocket连接并没有使用你配置的代理,所以才会出现普通API能正常调用但RTM连接超时的情况。
下面是具体的排查和修复步骤:
1. 先确认代理支持WebSocket
首先要检查你使用的代理服务器(127.0.0.1:8080)是否支持WebSocket(wss://)流量转发。很多HTTP代理默认不会处理WebSocket的升级请求,需要手动开启相关配置:
- 如果是用Nginx做代理,需要在配置中添加:
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; - 如果是Charles、Fiddler这类调试代理工具,一般默认支持WebSocket,但可以去设置里确认是否开启了对应选项。
2. 为WebSocket连接单独配置代理
旧版本的slackclient(1.x系列)并没有把你传入的proxies参数应用到RTM的WebSocket连接上,需要我们手动给底层依赖的websocket-client库设置代理。
修改你的代码如下:
from slackclient import SlackClient import websocket BOT_TOKEN = "你的机器人Token" client_proxies = {"https": "https://127.0.0.1:8080"} slack_client = SlackClient(token=BOT_TOKEN, proxies=client_proxies) # 验证API请求正常 print(slack_client.api_call("api.test")) print(slack_client.api_call("auth.test")) # 为WebSocket连接配置代理 websocket.setdefaultproxy( proxy_type=websocket.PROXY_TYPE_HTTP, http_proxy_host="127.0.0.1", http_proxy_port=8080 ) # 如果代理需要用户名密码认证,添加下面这行 # websocket.setdefaultproxy(http_proxy_auth=("你的用户名", "你的密码")) # 现在尝试RTM连接 slack_client.rtm_connect()
额外说明
- 如果你使用的是
slackclient2.x版本,官方已经优化了代理配置逻辑,RTM连接会自动使用初始化时传入的代理,但2.x的API和1.x有较大差异,需要注意代码适配。 - 如果还是连接失败,可以抓包确认WebSocket的握手请求是否真的走了代理,排查是否有防火墙或代理规则拦截了流量。
内容的提问来源于stack exchange,提问作者rgaduputi
相关产品推荐
相关产品推荐

