客户端如何通过代理连接WebSocket

4
我正在使用websockets模块,但它不支持通过我的公司代理连接客户端连接:
>>> import asyncio, websockets
>>> async def connect(uri):
...     async with websockets.connect(uri) as websocket:
...         pass
...
>>> asyncio.get_event_loop().run_until_complete(connect('ws://myhost.com/path/'))
    ....
ConnectionRefusedError: [Errno 10061] Connect call failed ('myhost.com', 80)

然而,如果使用设置了http_proxy环境变量的curl,则会起作用:

$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: MTIzNDEyMzQxMjM0MTIzNA==" http://myhost.com/path/
HTTP/1.1 101 Switching Protocols
Server: nginx/1.13.6
Date: Fri, 10 Nov 2017 14:51:00 GMT
Upgrade: websocket
Sec-WebSocket-Accept: s+CT5bkW5F3N2/5JUXrCPtLHn68=
Connection: Upgrade

我的最佳选择是什么?还有其他模块可以用来建立客户端WebSocket连接吗?

1
websockets 不支持通过代理连接客户端。https://websockets.readthedocs.io/en/stable/limitations.html因此,请使用 https://pypi.python.org/pypi/websocket-client。 - Ahsan
@Ahsan:你晚了几年,看看我在下面对自己的问题的回答。 - Jonas Byström
3
我看到了你的回答,但没有找到你为什么放弃了websockets并转而使用websocket-client的地方。实际上,我曾经在这两个之间做出选择。所以代理对于websockets是有限制的。 - Ahsan
1个回答

5

使用 pip install websocket-client 来安装。然后像往常一样,在 os.environ 中设置你的 http*_proxy 变量。代码如下:

ws = websocket.create_connection('ws://example.com/path')
ws.send(out_data)
in_data = ws.recv()

如果您不清楚代理使用的确切协议,请像以下示例一样设置http*_proxy变量:

$ export http_proxy=http://jonasb:password@proxyserver:8000
$ export https_proxy=https://jonasb:password@proxyserver:8000

(假设您的用户名为jonasb,端口为8000)。

Bystrom,我需要使用 https_proxy 还是 http?_proxy?我对于 http、https 和 ftp 都有相同的代理。你能帮忙吗? - shaik moeed
我遇到了这个错误:websocket._exceptions.WebSocketProxyException: failed CONNECT via proxy status: 503。你能帮忙解决吗?我需要另外提一个问题吗? - shaik moeed
也许是这个或者这个?我记得很久以前遇到过503错误,但不幸的是我无法回忆起原因。检查您的主机名和端口。删除用户名+密码。询问管理员。四处探索。 - Jonas Byström
感谢您的回复。如果可能,可以看一下我详细解释的问题。这是链接 - shaik moeed
@JonasByström 你对于使用Socks/Tor代理有什么看法? - user2284570

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接