连接到websocket,headers必须同时是字符串和字典?
Posted
技术标签:
【中文标题】连接到websocket,headers必须同时是字符串和字典?【英文标题】:Connecting to a websocket, headers must be strings and dictionaries at the same time? 【发布时间】:2019-03-26 17:55:29 【问题描述】:我正在尝试通过自己连接到 webscoket 来抓取具有 websocket 连接的网页。这是我的代码:
from websocket import create_connection
import json
headers = json.dumps(
'Connection': 'Upgrade',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Upgrade': 'websocket',
'Origin': 'https://www.bet777.be',
'Sec-WebSocket-Version': 13,
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
(Khtml, like Gecko) Chrome/73.0.3683.75 Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'es,en;q=0.9,pl;q=0.8,es-AR;q=0.7',
'Sec-WebSocket-Key': 'mYc+hqhy8sUyeilrxyxSPA==',
'Sec-WebSocket-Extensions': 'permessage-deflate;
client_max_window_bits',
)
ws = create_connection('wss://pushserver-
uk.sbtech.com/signalr/connecttransport=webSockets&clientProtocol=1.5&connectionToken=nOugyCC54kCePwbLVXCfkfpxZsipI83mU476SdYNspEAD2U0%2F3O44lja67ujJErljZiflHtWyOwELt0OHfQhBQxXu14hVe8zE%2Fr4syolXWBCWWoG%2B2D8WwmUCxi5HSUz4&connectionData=%5B%7B%22name%22%3A%22communicationhub%22%7D%5D&tid=9', header=headers)
ws.send('''"H":"communicationhub","I":0,"M":"Introduce"''')
while True:
print(ws.recv)
我得到以下错误:
File "/home/gonzalo/.local/lib/python3.6/site-packages/websocket/_handshake.py", line 124, in _get_handshake_headers
key = options['header']['Sec-WebSocket-Key']
TypeError: string indices must be integers
如果我删除 Sec-WebScoket-Key 部分,我会收到 400 状态响应。
知道我做错了什么吗?
编辑:使用 dict 而不是 json.dump 得到以下错误。 文件 "/home/gonzalo/.local/lib/python3.6/sitepackages/websocket/_handshake.py", 第 139 行,在 如果 v 不是 None
TypeError:序列项 1:预期的 str 实例,找到 int
【问题讨论】:
这个错误信息和你的代码有什么关系? 【参考方案1】:websocket.create_connection
的header
参数应该是dict,而不是JSON字符串,所以不要使用json.dumps
将dict转换为字符串,而是直接将dict作为headers传递:
headers =
'Connection': 'Upgrade',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Upgrade': 'websocket',
'Origin': 'https://www.bet777.be',
'Sec-WebSocket-Version': '13',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'es,en;q=0.9,pl;q=0.8,es-AR;q=0.7',
'Sec-WebSocket-Key': 'mYc+hqhy8sUyeilrxyxSPA==',
'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
ws = create_connection('wss://pushserver-uk.sbtech.com/signalr/connecttransport=webSockets&clientProtocol=1.5&connectionToken=nOugyCC54kCePwbLVXCfkfpxZsipI83mU476SdYNspEAD2U0%2F3O44lja67ujJErljZiflHtWyOwELt0OHfQhBQxXu14hVe8zE%2Fr4syolXWBCWWoG%2B2D8WwmUCxi5HSUz4&connectionData=%5B%7B%22name%22%3A%22communicationhub%22%7D%5D&tid=9',
header=headers)
【讨论】:
我收到以下错误:文件“/home/gonzalo/.local/lib/python3.6/site-packages/websocket/_handshake.py”,第 139 行,在 if v is not None TypeError: sequence item 1: expected str instance, int found 标头值必须是所有字符串,因此您应该引用您为键'Sec-WebSocket-Version'
设置的 13
。我已经相应地更新了我的答案。以上是关于连接到websocket,headers必须同时是字符串和字典?的主要内容,如果未能解决你的问题,请参考以下文章
关闭连接到 Mojo websocket 的 Mojo::IOLoop 重复事件
PyQt5 连接到 Websocket - 等待来自服务器的信号