首页 > 解决方案 > 成功http请求(响应101)后切换到websocket连接的确切方法?

问题描述

我正在尝试使用 python 连接到 WebSocket,但对使 websocket 连接工作的确切转换过程感到困惑。

到目前为止,我已经成功地使用 requests 包发出了 http“升级”请求,并得到了服务器的 101 响应。

代码看起来像这样

import requests

cookies = {
    'lang': 'en',
    '_ga': 'GA1.2.2001593629.1610867666',
    '_gid': 'GA1.2.1826988459.1610867666',
    '_gat_UA-171812727-1': '1',
    '_ym_uid': '1610867667240953916',
    '_ym_d': '1610867667',
    '_ym_visorc_65463124': 'w',
    '_ym_isad': '2',
    '_gat_UA-171812727-2': '1',
}

headers = {
    'Host': 'ws.website.com',
    'Connection': 'Upgrade',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
    'Upgrade': 'websocket',
    'Origin': 'https://website.com',
    'Sec-WebSocket-Version': '13',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
    'Sec-WebSocket-Key': 'FMZPo/xOQ3NdTAIkH2hJaw==',
}

response = requests.get('https://ws.website.com/socket.io/?EIO=3&transport=websocket', headers=headers, cookies=cookies, verify=False)

print(response.status_code)  # prints 101

令人困惑的一点是,当我在 WS 下检查 Chrome 的网络选项卡时,我看到标头中的请求 URL 是 wss://ws.website.com/socket.io/?EIO=3&transport=websocket。当尝试在 request.get() 中使用 wss 方案时,我得到 400 响应。

那么我应该在发出升级请求并使用请求包时使用http方案还是我必须使用像websocket这样的另一个包并以wss://开头的请求?

在我提供的部分代码之后,是否有正确的方法来进行 websocket 连接?

非常感谢您的帮助。

问候,

标签: pythonhttpwebsocketpython-requestswss

解决方案


推荐阅读