Python Web套接字在打开后立即关闭
因此,我对Python中的websocket有一个问题。我正在尝试与一个使用WebSocket进行内容交流的网站进行交互。以下是他们网站上的javascript代码:Python Web套接字在打开后立即关闭,python,websocket,Python,Websocket,因此,我对Python中的websocket有一个问题。我正在尝试与一个使用WebSocket进行内容交流的网站进行交互。以下是他们网站上的javascript代码: var $j = jQuery.noConflict(); // Use $j to reference JQuery selectors instead of $ function sockify() { var ws = new WebSocket("ws://website:1234"); ws.onme
var $j = jQuery.noConflict(); // Use $j to reference JQuery selectors instead of $
function sockify() {
var ws = new WebSocket("ws://website:1234");
ws.onmessage = function (evt) {
console.log(evt.data)
$j('#output').html(evt.data);
}
ws.onopen = function () {
ws.send(JSON.stringify($j('#srctext').val()));
}
ws.onerror = function () {
alert("socket down");
}
}
因此,该站点工作正常,没有问题,但是当我尝试此python代码时,我得到一个错误,指出套接字在打开后立即关闭:
ws = create_connection("ws://website:1234/")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Receiving..."
result = ws.recv()
print "Received '%s'" % result
ws.close()
这是从中提取的示例代码,如果我不将主机更改为我试图从中提取的网站,而是保持示例的主机与示例中的主机相同,那么它确实有效
以下是我收到的错误:
Traceback (most recent call last):
File "irc.py", line 462, in <module>
tmpmsg = getSocket()
File "irc.py", line 64, in getTrump
result = ws.recv()
File "/Library/Python/2.7/site-packages/websocket/_core.py", line 293, in recv
opcode, data = self.recv_data()
File "/Library/Python/2.7/site-packages/websocket/_core.py", line 310, in recv_data
opcode, frame = self.recv_data_frame(control_frame)
File "/Library/Python/2.7/site-packages/websocket/_core.py", line 323, in recv_data_frame
frame = self.recv_frame()
File "/Library/Python/2.7/site-packages/websocket/_core.py", line 357, in recv_frame
return self.frame_buffer.recv_frame()
File "/Library/Python/2.7/site-packages/websocket/_abnf.py", line 336, in recv_frame
self.recv_header()
File "/Library/Python/2.7/site-packages/websocket/_abnf.py", line 286, in recv_header
header = self.recv_strict(2)
File "/Library/Python/2.7/site-packages/websocket/_abnf.py", line 371, in recv_strict
bytes_ = self.recv(min(16384, shortage))
File "/Library/Python/2.7/site-packages/websocket/_core.py", line 427, in _recv
return recv(self.sock, bufsize)
File "/Library/Python/2.7/site-packages/websocket/_socket.py", line 93, in recv
"Connection is already closed.")
websocket._exceptions.WebSocketConnectionClosedException: Connection is already closed.
请注意,我实际上无法控制websocket,因此任何修复都需要由我来完成。我使用的是Python 2.7.10
我还注意到,如果我在使用网站时拦截Burp中的websocket请求,websocket初始连接请求就会不同。以下是从网站上获取的信息:
GET / HTTP/1.1
Host: website
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: website
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: uyG2WBK51ZtPhy9RXLNTmg==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
您肯定有错误(很可能您的套接字正在无声地爆炸…) 在配置中为套接字中的错误设置回调,并打印您得到的消息 示例:(摘自) 并定义方法
def on_error(ws, error):
print(error)
对于任何有相同问题的人,我通过调整websocket模块并在get请求中设置自定义头来修复它,尝试强制它使用此头
GET/HTTP/1.1
主持人:网站
用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10.12;rv:50.0)Gecko/20100101 Firefox/50.0
接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8
接受语言:en-US,en;q=0.5
接受编码:gzip,deflate
Sec WebSocket版本:13
来源:网站
Sec WebSocket扩展:permessage deflate
Sec WebSocket键:维吾尔2WBK51ZTPHY9RXLNTMG==
连接:保持活动状态,升级
Pragma:没有缓存
缓存控制:没有缓存
升级:websocket
而不是这个
GET/HTTP/1.1
升级:websocket
连接:升级
主持人:网站
来源:网站
Sec WebSocket键:6jsV5DEWXPGTTTLKSEwz6g==
Sec WebSocket版本:13
这样做了,并将结果放在我的原始帖子底部。对于遇到这个问题的任何人,我都没有一个很好的解决方案。我只是使用selenium和phantomjs加载站点,输入字段,单击按钮,然后从那里读取响应。这么多的开销,但它为我的小宠物项目发挥了作用。看起来websocket不喜欢接收Hello,World
@dan我已经很久没有发布了,但我记得硬编码标题,所以每次都会发布我不记得在哪里抱歉
websocket.enableTrace(True)
ws = websocket.WebSocketApp("ws://echo.websocket.org/",
on_message = on_message,
on_error = on_error,
on_close = on_close)
def on_error(ws, error):
print(error)