【发布时间】:2022-12-08 06:02:56
【问题描述】:
我正在尝试通过 Python 与 WebSocket 通信来自动化与游戏网站的交互。 特别是,我正在尝试与位于“wss://socket.colonist.io”的 WebSocket 进行通信。
如果我只是从浏览器执行以下 JS 代码,我会按预期收到传入消息:
ws = new WebSocket('wss://socket.colonist.io');
ws.onmessage = e => {
console.log(e);
}
但是,一旦我尝试从浏览器外部(使用 Node.JS 或使用 Python)连接到此 WebSocket,连接就会立即被远程关闭。下面是一个在 Python 中使用 websocket-client 的例子:
import websocket
def on_message(ws, data):
print(f'received {data}')
websocket.enableTrace(True)
socket = websocket.WebSocketApp('wss://socket.colonist.io',
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'},
on_message=on_message)
socket.run_forever(origin='https://colonist.io')
socket.close()
跟踪输出如下:
--- request header ---
GET / HTTP/1.1
Upgrade: websocket
Host: socket.colonist.io
Origin: https://colonist.io
Sec-WebSocket-Key: EE3U0EDp36JGZBHWUN5q4Q==
Sec-WebSocket-Version: 13
Connection: Upgrade
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
-----------------------
--- response header ---
HTTP/1.1 101 Switching Protocols
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 24 Sep 2022 17:33:32 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: EwMJ+z82BuOBOSWONpuOhjNdVCQ=
-----------------------
websocket connected
Connection to remote host was lost. - goodbye
我还尝试使用Python-Autobahn 和Python-websockets,结果都是一样的。
我怀疑主机以某种方式检测到连接不是来自浏览器(尽管我设置了“User-Agent”和“Origin”),因此立即关闭了连接。有没有可能我可以从不在浏览器中运行的脚本连接到这个 WebSocket? 我知道使用 Selenium 通过 Python 运行和控制浏览器实例的可能性,但出于性能原因,我想不惜一切代价避免这种情况。 (我想为我的项目同时控制尽可能多的 WebSocket 连接)。
【问题讨论】: