我正在嘗試通過 Python 與 WebSocket 通信來自動化與游戲網站的互動。特別是,我正在嘗試與 WebSocket 通信:“wss://socket.colonist.io”。
如果我只是從瀏覽器中執行以下 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 連接)。
uj5u.com熱心網友回復:
我發現了問題。因為連接是從 Chrome 控制臺的一個新的隱身視窗作業的,而無需訪問主機colonist.io,并且 Chrome 開發人員面板中的“應用程式”選項卡沒有顯示任何存盤的 cookie,我假設沒有涉及任何 cookie。在解密并分析與 Wireshark 的 TLS 通信后,我發現 JWT 在初始 GET 請求中作為 cookie 發送。將此 cookie 添加到我的 Python 實作后,它可以正常作業。
現在剩下的問題是:如果我在“應用程式”選項卡中沒有看到這個 JWT,并且發出的唯一請求是 WebSocket 連接,它是從哪里來的?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/513352.html
