2012-02-25 13 views
11

私はPythonでCookieを使用してHTTP POSTを実行しようとしています。POSTデータとCookieを使用してPython HTTPリクエストを作成するには?

私は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' 

私は2つの質問があります。 1.適切な私のHTTP POSTリクエストですか? (私は適切にJavaで同じことを実行することができ、phpBBへの投稿でHTTP 200を得ましたが、私はPythonが初めてです) 2. POSTデータを使ってHTTP POSTを扱うおもちゃの例クッキーとは?事前に

おかげで、

ロイ

答えて

31

リクエストを試すことができます。これにより、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 

http://python-requests.org/

3

を渡す3番目の引数は、ヘッダーで、辞書でなければなりません。これは、

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"} 
3

私は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() 
1
  1. そうでもないし。そのエラーは、urllib2ライブラリが与えたcookie文字列の項目を反復しようとしているためです。使用してみてください:
cookies = urllib.urlencode({'phpbb2mysql_data':'foo', 'autologinid':'blahblah'}) 
# Can do the same for data, allowing you to store it as a map. 
headers = {'Cookie': cookies} 
req = urllib2.Request(url, data, headers) 
  1. python: urllib2 how to send cookie with urlopen requestを参照してくださいが、あなたの最高の基準は本当にまだurllib2 Request docsですが、はい、それはいくつかの新しいものに比べてトリッキーな(しかし強力な)ライブラリです。
関連する問題