1

我正在编写一些代码来将内部应用程序集成到 DVR 中以检索视频文件。这都是逆向工程,因为没有任何官方文档,而且我无法理解以下事件序列(通过玩 DVR 的 Android 应用程序捕获)。

936 72.985204   192.168.0.1     192.168.0.200   HTTP    468     POST /cgi-bin/supervisor/NetworkBk.cgi HTTP/1.1  (application/x-www-form-urlencoded)
937 72.985368   192.168.0.200   192.168.0.1     TCP     54      mit-ml-dev > 41859 [ACK] Seq=1 Ack=415 Win=65535 Len=0
938 73.933676   192.168.0.200   192.168.0.1     HTTP    275     HTTP/1.0 200 OK  (video/mpeg4)
939 73.933983   192.168.0.1     192.168.0.200   TCP     54      41859 > mit-ml-dev [ACK] Seq=415 Ack=222 Win=15544 Len=0
940 74.004433   192.168.0.200   192.168.0.1     TCP     74      [TCP segment of a reassembled PDU]
941 74.004887   192.168.0.1     192.168.0.200   TCP     54      41859 > mit-ml-dev [ACK] Seq=415 Ack=242 Win=15544 Len=0
942 74.024669   192.168.0.200   192.168.0.1     HTTP    1346    Continuation or non-HTTP traffic

HTTP POST 请求视频文件,然后产生 HTTP OK。我对接下来会发生什么感到困惑。收到 HTTP 200 时请求不完成吗?那么为什么它继续接收 TCP 数据,然后获得 HTTP 继续或非 HTTP 流量?随后的 TCP 数据包包含我要下载的视频文件。当我手动制作 HTTP POST 时,我得到了 HTTP OK 响应,然后我被难住了。

这是我用来模拟 HTTP POST 的代码。

import requests
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post("http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi", data=dc, auth=(username, password))

此代码获得 HTTP 200 OK 响应,我如何获得继续或非 HTTP 流量?我是新手,所以不确定我是否提供了足够的细节。如果有帮助,我可以提供 HTTP 标头。

附录 这是 HTTP OK 回复的 RAW 响应。据我所知,没有什么可以期待额外的内容。

HTTP/1.0 200 OK
Date: Mon, 01 Jul 2013 15:01:34 GMT
nServer: Linux/2.x UPnP/1.0 Avtech/1.0
Expires: 0
Pragma: no-cache
Cache-Control: no-cache
Connection: close
Content-Type: video/mpeg4
Content-Length: 5

0
OK
4

1 回答 1

0

那么为什么它继续接收 TCP 数据,然后获得 HTTP 继续或非 HTTP 流量?

默认情况下,当您发出请求时,会立即下载响应的正文。因此,在这种情况下,一旦发出成功的 POST 请求,DVR 将立即开始通过 TCP 发送视频数据 - 很可能作为 H.264 字节流。这将解释您看到的非 HTTP 流量。

此代码获得 HTTP 200 OK 响应,我如何获得继续或非 HTTP 流量?

您可以覆盖此默认行为并推迟下载响应正文,直到您使用 stream 参数访问 Response.content 属性:然后您可以使用类似r.iter_content的方法以块的形式迭代响应数据,然后将它们写入文件。例如

import requests
url = "http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi"
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post(url, data=dc, auth=(username, password), stream=True)
if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)
于 2013-07-31T02:52:41.610 回答