2011-08-23 24 views
7

Estoy tratando de escribir un script simple para iniciar sesión en Wikipedia y realizar algunas acciones en mi página de usuario, utilizando la API de Mediawiki. Sin embargo, nunca parezco pasar la primera solicitud de inicio de sesión (de esta página: https://en.wikipedia.org/wiki/Wikipedia:Creating_a_bot#Logging_in). No creo que se envíe la cookie de sesión que configuré. Este es mi código hasta ahora:pasar las cookies de sesión en el encabezado http con python urllib2?

import Cookie, urllib, urllib2, xml.etree.ElementTree 

url = 'https://en.wikipedia.org/w/api.php?action=login&format=xml' 
username = 'user' 
password = 'password' 

user_data = [('lgname', username), ('lgpassword', password)] 

#Login step 1 
#Make the POST request 
request = urllib2.Request(url) 
data = urllib.urlencode(user_data) 
login_raw_data1 = urllib2.urlopen(request, data).read() 

#Parse the XML for the login information 
login_data1 = xml.etree.ElementTree.fromstring(login_raw_data1) 
login_tag = login_data1.find('login') 
token = login_tag.attrib['token'] 
cookieprefix = login_tag.attrib['cookieprefix'] 
sessionid = login_tag.attrib['sessionid'] 

#Set the cookies 
cookie = Cookie.SimpleCookie() 
cookie[cookieprefix + '_session'] = sessionid 

#Login step 2 
request = urllib2.Request(url) 
session_cookie_header = cookieprefix+'_session='+sessionid+'; path=/; domain=.wikipedia.org; HttpOnly' 

request.add_header('Set-Cookie', session_cookie_header) 
user_data.append(('lgtoken', token)) 
data = urllib.urlencode(user_data) 

login_raw_data2 = urllib2.urlopen(request, data).read() 

Creo que el problema está en algún lugar en la línea de request.add_header('Set-Cookie', session_cookie_header), pero no sé a ciencia cierta. ¿Cómo utilizo estas bibliotecas de Python para enviar cookies en el encabezado con cada solicitud (que es necesaria para muchas funciones de API).

Respuesta

14

La última versión de requests tiene soporte para sessions (además de ser muy fácil de usar y por lo general muy bien):

with requests.session() as s: 
    s.post(url, data=user_data) 
    r = s.get(url_2) 
+0

voy a ir con eso. Es mucho mas facil ¡Gracias! –

Cuestiones relacionadas