2012-02-25 27 views
11

Estoy tratando de hacer un HTTP POST usando cookies en Python.¿Cómo hacer una solicitud HTTP de Python con datos POST y cookies?

Tengo los valores de URL, datos de POST y cookies.

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() 

Sin embargo, si trato de ejecutar el programa, que es tirar un error:

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' 

Tengo dos preguntas: 1. ¿ mi petición HTTP POST adecuados? (He podido ejecutar lo mismo en Java y obtuve un HTTP 200 con una publicación exitosa en phpBB; sin embargo, soy nuevo en Python) 2. ¿Alguien me puede mostrar un ejemplo de manejo de HTTP POST con datos POST? y galletas?

Gracias de antemano,

Roy

Respuesta

31

Puede intentar solicitudes, que hace la vida más fácil cuando se trata de consultas 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

la tercera argumento se pasa es un encabezado y debe ser un diccionario. Esto debe hacerlo

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

me gusta 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
    No
  1. realmente. Ese error se debe a que la biblioteca urllib2 está intentando iterar sobre los elementos de la cadena cookie que le diste. Trate de usar:
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. Ver python: urllib2 how to send cookie with urlopen request pero su mejor referencia es todavía realmente la urllib2 Request docs, pero sí que es una biblioteca complicado (pero potente) en comparación con algunos otros nuevos.
Cuestiones relacionadas