在Python中模拟HTTP Post请求

时间:2011-04-13 23:14:06

标签: php python http post request

我正在尝试在PHP页面中发送HTTP post请求。我尝试了Java和Python(这是我第一次使用Python),我可以说它们对我来说都很好。实际上,它们只适用于我的测试PHP页面。出于某种原因,它们都不适用于我的目标PHP页面。

在我看来,可能导致帖子请求失败问题的两个原因可能是:

  1. 可能会发生一种重定向
  2. 服务器想要一个合适的cookie
  3. 接下来,您将找到目标页面的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 个答案:

答案 0 :(得分: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)

如果你需要做任何更好的事情,例如在传递cookie之类的请求中维护cookie,你可以使用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))