2017-01-25 4 views
0

Так что у меня проблема с веб-расписанием на Python. Я пытаюсь взаимодействовать с веб-сайтом, который использует веб-порты для некоторого контента. Вот Javascript код на своем сайте:Python Web Socket закрывается сразу после открытия

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"); 
    } 
} 

Так что сайт работает отлично, и Тереза ​​нет проблемы с этим, однако, когда я пытаюсь этот питон код, я получаю ошибку о том, что сокет был закрыт сразу же после того, как она открывает:

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() 

Этот пример кода извлекается из websocket man page on python.org, и это не будет работать, если я не меняю хозяина на сайт я пытаюсь вытащить из, а оставить хозяина на примере, как это в примере.

Здесь ошибка я получаю:

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. 

Любая идея, почему ее закрытие сразу?

Edit:

Ран с EnableTrace правда.

Здесь ошибка я получаю:

--- request header --- 
GET/HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: website 
Origin: website 
Sec-WebSocket-Key: 6jsV5DEWXPGTTTLKSEwz6g== 
Sec-WebSocket-Version: 13 


----------------------- 
--- response header --- 
HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: CX4DYsItQC6utXvt8JH641455mM= 
----------------------- 
send: '\x81\x8b\x98\x8d\x81\xce\xd0\xe8\xed\xa2\xf7\xad\xd6\xa1\xea\xe1\xe5' 

Пожалуйста, обратите внимание, что я не на самом деле иметь контроль над WebSocket, так что любые исправления должны были бы быть на моем конце. Я нахожусь на Python 2.7.10

Я также заметил, что если я перехватываю запрос websocket в Burp при использовании веб-сайта, запрос на первоначальный запрос на 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 
+0

Для всех, кто сталкивается с этой проблемой, у меня нет отличного решения для вас. Я просто использовал selenium и phantomjs для загрузки сайта, ввода поля, нажатия кнопки и чтения ответа оттуда. Так много накладных расходов, но это сработало для моего маленького любимого проекта. – Sugitime

+0

Похоже, что websocket не любит получать 'Hello, World'. –

ответ

0

Вы должны наверняка ошибка (скорее всего, сокет взрывается молча ..)

установить вместо этого в конфигурации обратного вызова для ошибок в сокете и распечатать Сообщ вы получите ..

пример: (взятый из here)

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 
+1

Сделал это и выбросил результат в мой оригинальный пост, внизу. – Sugitime