2011-04-13 134 views
1

我正嘗試在PHP頁面中發送HTTP發佈請求。我嘗試了Java和Python(這是我第一次使用Python),我可以說他們兩個對我來說都工作得很好。事實上,他們工作得很好,只爲我的測試PHP頁面。出於某種原因,他們都沒有爲我的目標PHP頁面工作。在Python中模擬HTTP發佈請求

在我看來,這可能會導致不成功的POST請求的問題,有兩種原因可能是:

  1. 一種重定向可能發生
  2. 服務器需要一個適當的cookie

下一頁,你會發現目標頁面的HTML代碼和應該工作的Python代碼。

HTML:

<form id="m713a0moduleform_2" method="post" action="http://www.X.Y/index.php?page=login" class="cms_form"> 
<input type="hidden" name="mact" value="FrontEndUsers,m713a0,do_login,1" /> 
<input type="hidden" name="m713a0returnid" value="794" /> 
<input type="hidden" name="page" value="794" /> 
<input type="hidden" name="m713a0form" value="login" /> 
<input type="text" class="cms_textfield" name="m713a0feu_input_username" id="m713a0feu_input_username" value="" size="10" maxlength="40" /> 
<input type="password" class="cms_password" name="m713a0feu_input_password" value="" size="10" maxlength="10" /> 
<input class="cms_submit" name="m713a0feu_btn_login" id="m713a0feu_btn_login" value="Sign in" type="submit" class="signin_button" /> 
</form> 

的Python:

import urllib 
params = urllib.urlencode({"mact":"FrontEndUsers,m713a0,do_login,1","m713a0returnid":"18","page":"18","m713a0form":"login","m713a0feu_input_username":"Z","m713a0feu_input_password":"W","m713a0feu_btn_login":"Sign in"}) 
f = urllib.urlopen("http://www.X.Y/index.php?page=login", params) 
print f.read() 

我收到以下錯誤。有任何想法嗎?

Traceback (most recent call last): 
    File "/X/Y/Z/NewPythonProject2/src/newpythonproject2.py", line 34, in 
    from paste.proxy import TransparentProxy 
ImportError: No module named paste
+2

http://diveintopython.org/http_web_services/redirects.html描述瞭如何處理重定向。 – 2011-04-13 23:19:20

回答

1

我用paste.proxy.TransparentProxywebob.Request ...

您需要安裝庫

easy_install webob webtest paste 

pip install webob webtest paste 

然後在腳本...

from paste.proxy import TransparentProxy 
from webob import Request 
proxy_app = TransparentProxy()  
request = Request.blank("http://pathto/your_file.php", POST=dict(field_a=value_a,field_b=value_b)) 

response = request.get_response(proxy_app) 

,如果你需要做什麼像票友越過保持請求餅乾一樣傳遞cookies來替你可以使用WebTest,你只會一些變化

from paste.proxy import TransparentProxy 
from webtest import TestApp 
app = TestApp(TransparentProxy())  
app.post("http://pathto/your_file.php", dict(field_a=value_a,field_b=value_b)) 
+0

有你需要安裝的庫 easy_install粘貼webob webtest – 2011-04-14 16:22:47

+0

嗨湯姆!非常感謝您的快速編輯,但我仍然沒有得到它!這些是我在Python中的第一行,這就是爲什麼即使我在網上努力搜索也無法弄清楚該怎麼做......請給我提供一些關於如何安裝所有這些庫的提示,因爲我我正在運行Ubuntu 10.10並且正在使用NetBeans IDE 6.9.1?非常感謝您的幫助! Eualin。 – user706838 2011-04-15 22:44:26

+1

@eualin你已經選擇了一個熟悉python的複雜問題。 :)這可能會讓你很熟悉如何做一些事情,比如在python中安裝庫。因爲現在使用這種語言的是圖書館。如果我是你,我會安裝virtualenv。 http://simononsoftware.com/virtualenv-tutorial/ 然後你可以玩各種庫,而不是破壞你的系統蟒蛇 – 2011-04-16 15:33:10