如何使用POST数据和Cookie发出Python HTTP请求?

如何使用POST数据和Cookie发出Python HTTP请求?,python,cookies,http-post,urllib2,Python,Cookies,Http Post,Urllib2,我正在尝试用Python中的cookies编写HTTP POST 我有URL、POST数据和cookie的值 import urllib2 url="http://localhost/testing/posting.php" data="subject=Alice-subject&addbbcode18=%23444444&addbbcode20=0&helpbox=Close+all+open+bbCode+tags&message=alice-body&

我正在尝试用Python中的cookies编写HTTP POST

我有URL、POST数据和cookie的值

import urllib2
url="http://localhost/testing/posting.php"
data="subject=Alice-subject&addbbcode18=%23444444&addbbcode20=0&helpbox=Close+all+open+bbCode+tags&message=alice-body&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=5b2e663a3d724cc873053e7ca0f59bd0&f=1&post=Submit"
cookie = "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"
#creating HTTP Req
req = urllib2.Request(url,data,cookie)

f = urllib2.urlopen(req)
print f.read()
但是,如果我尝试运行该程序,它会抛出一个错误:

Traceback (most recent call last):
  File "task-4.py", line 7, in <module>
    req = urllib2.Request(url,data,cookie)
  File "/usr/lib/python2.6/urllib2.py", line 197, in __init__
    for key, value in headers.items():
AttributeError: 'str' object has no attribute 'items'
回溯(最近一次呼叫最后一次):
文件“task-4.py”,第7行,在
请求(url、数据、cookie)
文件“/usr/lib/python2.6/urllib2.py”,第197行,在__
对于键,标头中的值。项()
AttributeError:“str”对象没有属性“items”
我有两个问题: 1.我的HTTP POST请求正确吗?(我已经能够在Java中正确地执行同样的事情,并且通过成功地发布到phpBB获得了HTTP 200,但是,我对Python是新手) 2.有人能给我举一个用POST数据和cookie处理HTTP POST的玩具例子吗

提前感谢,


Roy

您传递的第三个参数是标题,应该是字典。这应该可以

cookie = {"Cookie" : "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"}
我喜欢httplib:

from urlparse import urlparse
from httplib import HTTPConnection
url = "http://localhost/testing/posting.php"
data = "subject=Alice-subject&addbbcode18=%23444444&addbbcode20=0&helpbox=Close+all+open+bbCode+tags&message=alice-body&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=5b2e663a3d724cc873053e7ca0f59bd0&f=1&post=Submit"
cookie = "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"
urlparts = urlparse(url)
conn = HTTPConnection(urlparts.netloc, urlparts.port or 80)
conn.request("POST", urlparts.path, data, {'Cookie': cookie})
resp = conn.getresponse()
body = resp.read()
  • 不是真的。该错误是因为urllib2库试图迭代您提供给它的
    cookie
    字符串的项。尝试使用:
  • 请看,但您最好的参考仍然是真正的,但是的,与一些较新的库相比,它是一个棘手(但功能强大)的库
  • 您可以尝试请求,这样在处理HTTP查询时会更轻松

    import requests
    url="http://localhost/testing/posting.php"
    data= {
        'subject': 'Alice-subject',
        'addbbcode18': '%23444444',
        'addbbcode20': '0',
        'helpbox': 'Close all open bbCode tags',
        'message': 'alice-body',
        'poll_title': '',
        'add_poll_option_text': '',
        'poll_length': '',
        'mode': 'newtopic',
        'sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        'f': '1',
        'post': 'Submit',
        }
     cookies = {'phpbb2mysql_data': 'a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D',
        'phpbb2mysql_t': 'a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D', 
        'phpbb2mysql_sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        }
    print requests.get(url, data=data, cookies=cookies).text
    

    hm,这里似乎有点不正常。。。问题是关于POST的,答案是这样的。。。。
    import requests
    url="http://localhost/testing/posting.php"
    data= {
        'subject': 'Alice-subject',
        'addbbcode18': '%23444444',
        'addbbcode20': '0',
        'helpbox': 'Close all open bbCode tags',
        'message': 'alice-body',
        'poll_title': '',
        'add_poll_option_text': '',
        'poll_length': '',
        'mode': 'newtopic',
        'sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        'f': '1',
        'post': 'Submit',
        }
     cookies = {'phpbb2mysql_data': 'a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D',
        'phpbb2mysql_t': 'a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D', 
        'phpbb2mysql_sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        }
    print requests.get(url, data=data, cookies=cookies).text