如何将Webex机器人的websockets代码改为websocket-client以适配代理
解决Webex机器人的公司代理适配问题
方案一:替换为websocket-client库修改代码
websocket-client原生支持代理配置,但它是同步库,需要对原异步逻辑做调整,具体修改步骤如下:
- 安装依赖
pip install websocket-client
- 修改目标代码段
import websocket import threading from backoff import on_exception, expo import socket import json import uuid # 调整重试装饰器的异常类型,适配websocket-client的异常 @on_exception(expo, websocket.WebSocketConnectionClosedException) @on_exception(expo, websocket.WebSocketTimeoutException) @on_exception(expo, socket.gaierror) def _connect_and_listen(): ws_url = self.device_info['webSocketUrl'] logger.info(f"Opening websocket connection to {ws_url}") # 配置公司代理信息,替换为实际值 proxy_config = { "http_proxy_host": "你的代理IP", "http_proxy_port": 你的代理端口, # 代理需要认证时添加以下配置 # "http_proxy_auth": ("代理用户名", "代理密码") } # 建立带代理的WebSocket连接 ws = websocket.WebSocket(sslopt={"cert_reqs": ssl_context.verify_mode}) ws.connect(ws_url, **proxy_config) self.websocket = ws logger.info("WebSocket Opened.") # 发送授权消息 msg = { 'id': str(uuid.uuid4()), 'type': 'authorization', 'data': {'token': 'Bearer ' + self.access_token} } ws.send(json.dumps(msg)) # 循环接收消息 while True: try: data = ws.recv() # 调用同步版消息处理函数(需改造原异步函数) self._websocket_recv_sync(data) except websocket.WebSocketConnectionClosedException: logger.error("WebSocket connection closed, reconnecting...") raise # 新增同步版消息处理函数,替换原异步的_websocket_recv def _websocket_recv_sync(self, data): # 复制原异步函数的业务逻辑,去掉await关键字 message = json.loads(data) logger.info(f"Received message: {message}") # 示例:处理消息逻辑,根据原代码补充 if message.get('type') == 'message': self.handle_message(message) # 调整启动逻辑,用线程运行同步函数 try: ws_thread = threading.Thread(target=_connect_and_listen) ws_thread.daemon = True ws_thread.start() ws_thread.join() except Exception as runException: logger.error(f"runException: {runException}") if self._get_device_info(check_existing=False) is None: logger.error('could not create device info') raise Exception("No WDM device info") # 触发重连 ws_thread = threading.Thread(target=_connect_and_listen) ws_thread.daemon = True ws_thread.start() ws_thread.join()
说明:
- 需将原异步的
_websocket_recv函数改造成同步版_websocket_recv_sync,保留原有业务逻辑 - 代理配置需替换为公司实际的IP、端口,有认证需求时补充账号密码
方案二:使用代理隧道工具(无需修改框架代码)
如果不想改动框架代码,可以通过代理隧道工具将本地WebSocket请求转发到公司代理,以socat为例:
- 安装socat(Linux环境)
sudo apt-get install socat
- 启动本地隧道,将本地端口请求转发至公司代理
socat TCP-LISTEN:8080,bind=127.0.0.1,fork PROXY:你的代理IP:目标WebSocket地址:目标端口,proxyport=你的代理端口
- 修改Webex Bot框架的WebSocket连接地址,将原
ws_url替换为ws://127.0.0.1:8080,让框架通过本地隧道走公司代理。
也可以使用privoxy等工具实现HTTP代理转WebSocket代理,原理类似。
内容的提问来源于stack exchange,提问作者PnT
相关产品推荐
相关产品推荐

