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

如何将Webex机器人的websockets代码改为websocket-client以适配代理

解决Webex机器人的公司代理适配问题

方案一:替换为websocket-client库修改代码

websocket-client原生支持代理配置,但它是同步库,需要对原异步逻辑做调整,具体修改步骤如下:

  1. 安装依赖
pip install websocket-client
  1. 修改目标代码段
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为例:

  1. 安装socat(Linux环境)
sudo apt-get install socat
  1. 启动本地隧道,将本地端口请求转发至公司代理
socat TCP-LISTEN:8080,bind=127.0.0.1,fork PROXY:你的代理IP:目标WebSocket地址:目标端口,proxyport=你的代理端口
  1. 修改Webex Bot框架的WebSocket连接地址,将原ws_url替换为ws://127.0.0.1:8080,让框架通过本地隧道走公司代理。

也可以使用privoxy等工具实现HTTP代理转WebSocket代理,原理类似。

内容的提问来源于stack exchange,提问作者PnT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:04:56