2010-12-13 76 views
0

我想用python腳本填充一些網頁形式並用POST請求發送。問題是該表單有文件上傳。我發現這個:poster for python。所以,我帶着FireBug在網站上用表格填充。我所看到的:發送郵件圖片

values[action] add_save 
values[mod] blog 
values[depth] 2 
values[pid] 121 
values[title] title 
values[title_eng] title_en 
img PNG...[a lot of binary image data] 

該網站使用的授權,所以我有:

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, theurl, username, password) 
authhandler = urllib2.HTTPBasicAuthHandler(passman) 

opener = poster.streaminghttp.register_openers() 
opener.add_handler(authhandler) 

現在我帶着從網站默認的採樣和寫的代碼:

index = """some parsed integer""" 
datagen, headers = multipart_encode({ 
     'values[action]': 'add_save', 
     'values[mod]': 'blog', 
     'values[depth]': '2', 
     'values[pid]': index, 
     'values[title]' : 'title', 
     'values[title_eng]' : 'title_eng', 
     'img': open('1.png', 'rb') 
    }) 

request = urllib2.Request(theurl, datagen, headers) 
getdata = urllib2.urlopen(request) 
print getdata.read() 

我不沒有錯誤等。但發送POST後腳本不會將其添加到數據庫中(當我用手執行時,一切正常)。

我加入這個代碼:

for value in datagen: 
    print value 

,結果是:link。 (123中的文字是該索引變量的值)。

回答

0

我以前沒有使用過你的方法,但已經成功地使用了MultipartPostHandler來做類似的事情。簡而言之,一個例子如下所示。


import MultipartPostHandler 
import urllib2 

form_opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
urllib2.install_opener(form_opener) 
datagen = {vars} 
o=opener.open(url, datagen) 

MultipartPostHandler可以發現here.

您還可以添加urllib2.HTTPCookieProcessor()的揭幕戰來處理這樣的認證:


import urllib 

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
# Or, (MultipartPostHandler.MultipartPostHandler, urllib2.HTTPCookieProcessor()) 
urllib2.install_opener(opener) 
login = urllib.urlencode(dict(username='user',password='pass',login='Login')) 
o=opener.open(url, login) 

這是我的第一篇文章所以請原諒我,如果我有點偏離目標:)

+0

謝謝,我會在幾個小時內檢查它。 – Ockonal 2010-12-14 05:29:52

+0

太棒了,它的工作原理!非常感謝。 – Ockonal 2010-12-14 13:55:08

+0

MultipartPostHandler鏈接已死亡 – 2013-05-19 12:58:30

0

你檢查每個請求的您所做的迴應(包括在該網站的日誌記錄),以確保您有被送達正確的頁面並且有正確的cookie集?