3
#!/usr/bin/python
import pycurl
import re
import StringIO


#CONSTANTS
URL = "http://www.imagehost.org"
FILE = "/datos/poop1.jpg"
POST_DATA = [("a", "upload"), ("file[]", (pycurl.FORM_FILE, FILE))]



buffer = StringIO.StringIO()


c = pycurl.Curl()
c.setopt( c.URL, URL )
c.setopt( c.POST, 1 )
c.setopt( c.POSTFIELDS, POST_DATA )
##c.setopt( c.HTTPPOST, POST_DATA )
c.setopt( c.USERAGENT,'Curl')
c.setopt( c.WRITEFUNCTION, buffer.write)
c.setopt(pycurl.VERBOSE, 1)

c.perform()
c.close()

#c.setopt(c.PROXY, proxyHostAndPort)
#c.setopt(c.PROXYUSERPWD, proxyAuthentication)

parse = buffer.getvalue()


pattern = re.compile('/<td nowrap="nowrap">(.+)<\/td>\s*<td class="link"><input.+value="([^"]+)" \/><\/td>/i')

result = re.search(pattern, parse)
print result

問題は投稿の仕方です。

c.setopt( c.POSTFIELDS, POST_DATA ) はリストを受け入れません。リストを追加する代わりにどうすればよいですか?

そして c.setopt( c.HTTPPOST, POST_DATA ) ドロップ:

Traceback (most recent call last): 
  File "pymage", line 26, in <module>
c.perform() pycurl.error: (26, 'failed creating formpost data')

アップデート:

-----------------------------15758382912173403811539561297\r\nContent-Disposition: フォームデータ; name="a"\r\n\r\nアップロード\r\n-----------------------------15758382912173403811539561297\r\ nContent-Disposition: フォーム データ。名前="ファイル[]"; filename="Datos_Pegados_0a17.jpg"\r\nContent-Type: image/jpeg\r\n\r\nÿØÿà

それが、改ざんデータを使用して取得したものです。

ポストフィールドの興味深い部分:

フォームデータ; name="a"\r\n\r\nアップロード\r\n

フォームデータ; 名前="ファイル[]"

では... POST_DATA は 'a=upload&file[]=FILE' であるべきだとおっしゃいましたか?

アップデート2:

<form method="post" action="/" enctype="multipart/form-data" onsubmit="javascript:Upload(); return true;">

<input type="hidden" name="a" value="upload" />

<td class="left">File:</td>
td class="right"><input name="file[]" type="file" size="20" /></td>

それがコードです...

現在、フォームデータの構成は機能していますが、私が信じているファイルをアップロードしていません

c.setopt( c.POSTFIELDS, 'a=upload&file[]=/datos/poop1.jpg' )

私はこれを得ています:

* About to connect() to www.imagehost.org port 80 (#0)
*   Trying 74.63.87.74... * connected
* Connected to www.imagehost.org (74.63.87.74) port 80 (#0)
> POST / HTTP/1.1
User-Agent: Curl
Host: www.imagehost.org
Accept: */*
Content-Length: 32
Content-Type: application/x-www-form-urlencoded

< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Date: Wed, 25 Mar 2009 06:53:49 GMT
< Content-Type: text/html
< Server: nginx/0.7.11
< Set-Cookie: userhash=7c09b97cc70c8c133c850a3e744b416e; expires=Thu, 25-Mar-2010 06:53:49 GMT; path=/; domain=.imagehost.org; httponly
< 
* Connection #0 to host www.imagehost.org left intact
* Closing connection #0
4

3 に答える 3

6

pycurl のドキュメントはこれについてあまり明確ではありませんが、HTTPPOST オプションはタプルのリストを取得でき、それぞれが正確に 2 要素の長さです。各タプルの最初の引数はフォーム フィールド名で、2 番目の引数は値です。

ただし、値はタプルの場合もあります。このタプルには、そのフィールドに関連するデータのペアが含まれている必要があります: ( form_option、option_value、form_option、option_value など)

たとえば、3 つのフィールドを持つマルチパート フォームで、最後のフィールドがファイルのアップロードである場合、ファイル名と MIME タイプを設定できます。

c = pycurl.Curl()
c.setopt(c.URL, base_url + 'upload.cgi')
c.setopt(c.HTTPPOST,[ ("fieldname1", "value1"), 
                      ("fieldname2", "value2"), 
                      ("uploadfieldname", 
                                 (c.FORM_FILE, local_filename, 
                                  c.FORM_CONTENTTYPE, "application/x-gzip"))
                    ])

curl_formadd() の C API のドキュメントにオプションがあります: http://curl.haxx.se/libcurl/c/curl_formadd.html ただし、pycurl ソースからは、FORM_FILE、FORM_FILENAME、FORM_CONTENTTYPE のみのように見えますおよび FORM_COPYCONTENTS がサポートされています。

于 2011-02-09T09:55:40.220 に答える
2

エラー 26 ("pycurl.error: (26, 'フォームポスト データの作成に失敗しました')" 内) は、アップロードするために指定したファイル名が存在しないことを意味します。この同じエラーが発生していましたが、それが間違いなく問題でした。エラー 26 が生成される場所については、curl のソース コードを参照してください。

于 2011-08-12T06:50:18.670 に答える
1

の引数はPOSTFIELDS、単純な URL エンコード文字列である必要があると思います。たとえば、次のようになります。

POST_DATA = 'a=foo&b=bar'

次に、あなたの FILE についてはよくわかりません。例として、このメール メッセージを確認してください。

于 2009-03-25T05:17:28.737 に答える