Python问题:无法使用Requests库获取xhr轮询数据

时间:2013-05-27 18:30:27

标签: python websocket socket.io fiddler python-requests

首先,让我对Stack Overflow社区表示感谢 - 尽管我之前没有发布过,但我在过去找到了无数解决方案。我非常感谢社区投入的时间和精力,使其成为每个人的优秀资源。

我正在尝试从使用Socket.IO和XHR轮询数据的服务器获取数据。虽然我似乎可以连接Python脚本,但我无法正确接收数据。

我查看了Fiddler中的传出和传入数据包:每隔约5秒,浏览器会收到有用的信息(即'5 ::: {“name”:“pollData”,“args”:[“< ..'),但Python脚本接收NOOP响应('8 ::')。

有问题的代码部分:

reply = requests.get(URL + "/socket.io/1/?t=" + str(long(time.time()*1000)), headers=headers)

session_id = reply.text.split(':')[0]

print "Session ID:", session_id

reply = requests.post(URL + "/socket.io/1/xhr-polling/" + session_id + "?t=" +             
                      str(long(time.time()*1000)), data=message, headers=headers)

print "Successfully subscribed."

for i in range(5):
    sleep(5)
    reply = requests.get(URL + "/socket.io/1/xhr-polling/" + session_id + "?t=" + 
                         str(long(time.time()*1000)), headers=headers)
    print reply.text

我尝试过使用Websocket客户端,但它产生了这个错误:WebSocketException:Handshake Status 200

SocketIO-client产生此错误:SocketIOError:无法建立连接

比使用另一个库来解决这个问题更重要的是,我想了解为什么会这样。由脚本和Chrome生成的传出数据包看起来,至少对于一个外行人来说,基本相同 - 为什么他们会产生这样不同的结果?

(欢迎提出任何问题或要求提供更多信息。)

1 个答案:

答案 0 :(得分:0)

为了防止将来有人受益,经过多次试验和错误,我意识到它需要再发一次GET请求才能发布订阅信息。下面的一些代码可能是多余的,但似乎有效:

reply = requests.get(url + "?t=" + get_timecode(), stream=True)
session_id = reply.text.split(':')[0]
main = requests.Session()

print "Session ID:", session_id

reply = main.get(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),  
                 stream=True)
reply = main.post(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),
                  data=subscribe, stream=True)

print "Successfully subscribed."

while 1:
    reply = main.get(url + "xhr-polling/" + session_id + "?t=" + get_timecode(),
                     stream=True)

[请注意,这只是必要的,因为服务器的websocket被破坏了,Socket.IO不得不在XHR轮询上回退。此外,可能有更简单的方法来做到这一点。]