4

pcap ファイルは、Python (2.7.9) Requests ライブラリを使用して URL からダウンロードされます。

import requests
response = requests.get('http://example.com/path/1.pcap',  stream=True)

ドキュメントによるresponse.rawと、ファイルのようなオブジェクトであり、私の目標は、ダウンロードしたファイルをディスクに保存せずに処理することです。

私は最初にファイル解析用のScapyPysharkライブラリを見ましたが、それらの関数 (と) はファイル パス文字列を引数として受け入れます。from library はファイル オブジェクトを受け入れます。最初の試行でエラーが発生しました:.pcaprdpcapFileCapturepcap.Readerdpktpcap=dpkt.pcap.Reader(resonse.raw)

AttributeError: 'HTTPResponse' object has no attribute 'name'

名前属性が追加されました:

setattr(response.raw,'name', 'test.pcap')

その後、pcap=dpkt.pcap.Reader(resonse.raw)エラーは発生しませんでしたが、pcap.readpkts()失敗しました

io.UsupportedOperation: seek

そして実際にresponse.raw.seekable()戻りますFalse

設定response.raw.decode_content = Trueしてみましたがダメでした。

私が試みている方法でオブジェクトを処理するための解決策はありますか? シーク可能な応答オブジェクトを取得するには、追加の要求パラメーターが必要になるのでしょうか?

ちなみに、レスポンスオブジェクトをファイル( shutil.copyfileobj(response.raw,file))に書き込めば、dpktその後はそのファイルの操作に成功します。

4

1 に答える 1

1

StringIO オブジェクトのサポートが最近dpktに追加されました。これで、文字列から StringIO オブジェクトを作成し、pcap.Reader に渡すことができます。

文字列から StringIO オブジェクトを作成するには:

from StringIO import StringIO
data = StringIO("aaaaa..aa")

その後、次のことができます

import dpkt
from StringIO import StringIO
import requests

response = requests.get('http://example.com/path/1.pcap',  stream=True)
data = StringIO(response.raw)
pcap = dpkt.pcap.Reader(data)
    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)
        ...
于 2015-06-18T00:49:09.457 に答える