已通过HTTP认证,如何建立WebSocket连接获取实时数据?
问题:WebSocket连接与实时数据获取问题
我需要连接WebSocket处理实时数据,目标地址是https://testsite.test.de/Interfaces。在Firefox中访问该地址时,会立刻弹出用户名密码验证框,输入正确信息后,先返回HTTP/1.1 200、HTTP/2 200状态码,随后触发101协议切换,Scheme转为wss://。
我用以下requests代码携带认证信息和User-Agent头请求该地址,能得到200状态码,但print(r.cookie)输出为空:
import requests headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0'} r = requests.get('https://testsite.test.de/Interfaces', auth=('my_username', 'my_password'), headers=headers) print(r)
我不知道后续该怎么获取数据,尝试了以下websocket代码但没有任何结果:
import websocket ws = websocket.WebSocketApp('wss://testsite.test.de/Interfaces') ws.run_forever
浏览器Inspector截图:
解决方案
1. 处理WebSocket的基础认证
你遇到的是HTTP基础认证,浏览器会自动把用户名密码转为Base64编码放在Authorization头里。直接用websocket库连接时,需要手动添加这个认证头,或者利用库的参数传递认证信息。
方法一:手动构造Authorization头
先把用户名和密码做Base64编码:
import base64 import websocket # 构造基础认证头 username = 'my_username' password = 'my_password' auth_str = f"{username}:{password}" auth_bytes = auth_str.encode('utf-8') auth_base64 = base64.b64encode(auth_bytes).decode('utf-8') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0', 'Authorization': f'Basic {auth_base64}' } # 初始化WebSocketApp并添加回调处理数据 def on_message(ws, message): print("收到实时数据:", message) def on_error(ws, error): print("错误:", error) def on_close(ws, close_status_code, close_msg): print("连接关闭") def on_open(ws): print("连接成功,等待接收数据") ws = websocket.WebSocketApp( 'wss://testsite.test.de/Interfaces', header=headers, on_message=on_message, on_error=on_error, on_close=on_close ) ws.on_open = on_open # 启动连接(注意要加括号调用run_forever) ws.run_forever()
方法二:使用websocket库的auth参数
部分websocket库版本支持直接传递auth参数,简化代码:
import websocket def on_message(ws, message): print("收到实时数据:", message) ws = websocket.WebSocketApp( 'wss://testsite.test.de/Interfaces', auth=('my_username', 'my_password'), header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0'}, on_message=on_message ) ws.run_forever()
2. 关键注意点
- 你之前的
ws.run_forever少了括号,应该是ws.run_forever(),否则不会启动连接。 - 浏览器的101协议切换是WebSocket握手的正常流程,不需要手动处理,websocket库会自动完成握手。
- requests请求返回200但无Cookie,说明该接口的认证不需要依赖Cookie,直接通过Authorization头维持即可,所以WebSocket连接时只要带上正确的认证头就能正常通信。
内容的提问来源于stack exchange,提问作者user16511234
相关产品推荐
相关产品推荐

