ScrapyのRequest
オブジェクトからプレーンなHTTPリクエストメッセージを抽出する必要があります(たとえば、このリクエストをコピー/ペーストしてBurpから実行できるようにする必要があります)。ScreamのRequestオブジェクトからHTTPリクエストメッセージを取得
したがって、scrapy.http.Request
オブジェクトが与えられた場合、私は対応するリクエストメッセージを取得したいと思います。
POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
は、明らかに私は、いくつかのエッジケースを欠場する可能性があるので、手動でエラーが発生しやすいしかし、メッセージを再構築しようと、私はRequest
オブジェクトに必要なすべての情報を持っています。私の理解では、ScrapyはまずRequest
をTwisted
オブジェクトに変換します。このオブジェクトは、ヘッダと本文をTCP転送に書き込みます。だから、似たようなことをやろうとしているのですが、代わりに文字列に書きますか?
UPDATE
私はhttp.py
に基づいてHTTP 1.0
要求メッセージを、取得するために次のコードを使用することができます。 HTTP 1.1
リクエスト/ http11.py
と似たような処理をする方法がありますか。これは実際に送信されるものですか?私は明らかに可能な限りScrapy
/Twisted
フレームワークからコードを複製することを避けたいと思います。
factory = webclient.ScrapyHTTPClientFactory(request)
transport = StringTransport()
protocol = webclient.ScrapyHTTPPageGetter()
protocol.factory = factory protocol.makeConnection(transport)
request_message = transport.value()
print(request_message.decode("utf-8"))
さて、そうですが、問題は 'download_request'で行われたことは結果のリクエストからかなり離れていることです。 'Twisted'がヘッダーをラインのさらに下方に変更/補強するケースがたくさんあります。欠落している場合は 'host'を追加することができます。すべてのコードをコピー・ペーストするのではなく、' Twisted'を結果として文字列に書くことができるのではないかと思います。 –
'Twisted'でもう少し詳しく読んでみると、私は本当の' Agent'を使うことを望んでいますが、 'twisted.test.proto_helpers.StringTransport'のようなダミーのトランスポートでメモリにリクエストをバッファするだけです。私は、 'StringTransport'で私の' Agent'を使用することを除いて 'download_request'からコードをコピーして貼り付けます。正しい軌道にいるのですか?同じことをする例は見当たりません。 –
実際、これは思ったよりもはるかに簡単だと思われます。 'factory = webclient.ScrapyHTTPClientFactory(response.request) transport = StringTransport() protocol = webclient.ScrapyHTTPPageGetter() protocol.factory = factory プロトコルです。 –