2013-08-07 11 views
8

私たちは、コンテンツがMultipartFormDataでなければならないサイトへのPOST要求を行うために、pythonを使用してスクリプトを作成しようとしています(python-requests a.t.m.を使用)。 我々は(サイトおよびポスト上のフォームに記入して)手動でこのPOSTリクエストを行うと、wiresharkのを使用して、これは(ショートバージョン)思い付いた:マルチパート/フォームデータでのPOSTリクエスト。コンテンツタイプが正しくない

Content-Type: multipart/form-data; 
Content-Disposition: form-data; name="name" 
Data (8 Bytes) 
    John Doe 

我々はのpython-リクエスト・ライブラリを使用するようにしてください同じ結果を達成するため、これが送信されます

Content-Type: application/x-pandoplugin 
Content-Disposition: form-data; name="name"; filename="name"\r\n 
Media type: application/x-pandoplugin (12 Bytes) 
    //and then in this piece is what we posted:// 
    John Doe 

奇妙なことは、パケットの「一般的なタイプは」確かにマルチパート/フォームのデータであるが、個々の項目は(キー=「name」を送ったことで、値を= 'John Doe')はapplication/x-pandoplugin(私の推測する私のPC上のランダムなアプリケーション)の型を持っています。

これはコード使用される:

response = s.post('http://url.com', files={'name': 'John Doe'}) 

代わりに(のみ「全体」パケットのタイプを変更する)ヘッダー引数を使用しての個々の項目のコンテンツタイプを指定する方法はあります?

私たちが送信するコンテンツの種類を理解できないという事実のために、サーバーが正しく応答しないと思います。

リトル更新: は、私はそれは良いことだので、マルチパートコンテンツの異なる部分が、今私は、ブラウザでPOSTを行う場合は送信されたものと同じであると思います。それでも、サーバーは実際にスクリプトで送信した変更は行いません。まだ異なるのは、異なる部分の順序だけです。

たとえば、これは私のブラウザが送信するものです:

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: (text/plain) 
    Content-Disposition: form-data; name="file"; filename="ex.txt"\r\n 
    Content-Type: text/plain\r\n\r\n 
    Line-based text data: text/plain 
     lore ipsum blabbla 

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: 
    Content-Disposition: form-data; name="seq"\r\n\r\n 
    Data (2 bytes) 

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: 
    Content-Disposition: form-data; name="name"\r\n\r\n 
    Data (2 bytes) 

を、これは(のpython-要求を使用して)スクリプトを送信するものである:

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: 
    Content-Disposition: form-data; name="name"\r\n\r\n 
    Data (2 bytes) 

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: (text/plain) 
    Content-Disposition: form-data; name="file"; filename="ex.txt"\r\n 
    Content-Type: text/plain\r\n\r\n 
    Line-based text data: text/plain 
     lore ipsum blabbla 

Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n 
Encapsulated multipart part: 
    Content-Disposition: form-data; name="seq"\r\n\r\n 
    Data (2 bytes) 

サーバーがオンに数えていた可能性はあります部品の順序? Multipart upload form: Is order guaranteed?によると、明らかに?もしそうなら、リクエストライブラリを使って明示的に注文を行うことは可能ですか? そして、事態を悪化させるために:ファイルとテキスト値だけが混在しています。

したがって、注文を強制することはやや難しいようです。私は部品の順序は、元の要求と同じであることを確認するためにプラグインの要求で修正をした :EDIT2

s.post('http://www.url.com', files=files,data = form_values) 

:これは私がそれを行う現在の方法です。これは問題を解決するものではないので、私の問題には直接的な解決策はないと思います。私はサイトの開発者にメールを送り、彼らが私を助けることを願っています!

答えて

7

コードが正しいように見えます。

requests.post('http://url.com', files={'name': 'John Doe'}) 

...「multipart/form-data」ポストを送信する必要があります。

と実際には、私はこのような何かが掲載得る:

Content-Type: application/x-pandoplugin 

私がすることから始めます:

Accept-Encoding: gzip, deflate, compress 
Connection: close 
Accept: */* 
Content-Length: 188 
Content-Type: multipart/form-data; boundary=032a1ab685934650abbe059cb45d6ff3 
User-Agent: python-requests/1.2.3 CPython/2.7.4 Linux/3.8.0-27-generic 

--032a1ab685934650abbe059cb45d6ff3 
Content-Disposition: form-data; name="name"; filename="name" 
Content-Type: application/octet-stream 

John Doe 
--032a1ab685934650abbe059cb45d6ff3-- 

は、私はあなたがその奇妙なContent-Typeヘッダを取得したい理由アイデアを持っていませんあなたのマシンからPando Web Pluginを完全に削除し、python-requestsコードをもう一度試してみてください。 (または別のマシンから試してください)

+0

私たちは、異なるマシン上で試してみました。もう一つはapplication/x-uplaypcでした。これは、ランダムなプラグインがデフォルトのcontent-typeを引き継ぐようです。私はまた、なぜこれが起こるかの手がかりがありません。 – HaS

+0

非常に疑わしいですが、あなたはnetrcを使用していますか? –

+0

いいえ、私は少なくとも知っているわけではありません。私はこの問題をほぼ解決したと思うので、更新された問題を見てください。あなたがリクエストのためのコラボレーションであるため、多分あなたはその答えを知っていますか?前もって感謝します! – HaS

0

Pythonは、システム全体の構成ファイルを使用して、ファイルのMIMEタイプを「推測」します。それらのプラグインが自分のカスタムMIMEタイプにファイル拡張子を登録している場合は、代わりにそのプラグインを入れてしまいます。

最も安全な方法は、送信している特定のサーバーに適した自分のMIMEタイプの推測を作成することです。あなたが思っていない拡張機能に対しては、ネイティブのpython MIMEタイプの推測しか使用しません。

コンテンツタイプを手動でpython-requestで手動で指定する方法はわかりませんが、これは可能であるはずです。あなたが行うことができます今日のよう

1

response = s.post('http://url.com', files={'name': (filename, contents, content_type)}) 
関連する問題