在Python中模拟HTTP Post请求

1 投票
1 回答
1614 浏览
提问于 2025-04-16 15:41

我在一个PHP页面上尝试发送一个HTTP的POST请求。我试过用Java和Python(这是我第一次用Python),可以说这两者对我来说都差不多能用。实际上,它们只在我的测试PHP页面上工作得很好。但不知为什么,它们在我想要的目标PHP页面上都没能成功。

我认为,导致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

1 个回答

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(也就是把 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))

撰写回答