2012-04-20 27 views
7

Estoy tratando de crear un programa python que inicie sesión en el sitio de mi universidad utilizando mi identificación y contraseña. Esta es la página formal para iniciar sesión: https://webapp.pucrs.br/consulta/HTTP POST y GET con cookies para autenticación en python

Como puede observar, los dos campos se denominan pr1 y pr2. La página usa POST para enviar los datos. TAMBIÉN, hay una cookie que se descarga cuando se carga la página, es un JSESSIONID que contiene un valor aleatorio que, según tengo entendido, debe volver al encabezado del método POST para autenticar el inicio de sesión.

Escribí el siguiente código, pero la página de retorno en el método GET dice "La sesión no se inicializó", probablemente porque la cookie no se envió correctamente.

from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandler 
import httplib, urllib, cookielib, Cookie, os 

conn = httplib.HTTPConnection('webapp.pucrs.br') 

#COOKIE FINDER 
cj = cookielib.CookieJar() 
opener = build_opener(HTTPCookieProcessor(cj),HTTPHandler()) 
req = Request('http://webapp.pucrs.br/consulta/principal.jsp') 
f = opener.open(req) 
html = f.read() 
for cookie in cj: 
    c = cookie 
#FIM COOKIE FINDER 

params = urllib.urlencode ({'pr1':111049631, 'pr2':<pass>}) 
headers = {"Content-type":"text/html", 
      "Set-Cookie" : "JSESSIONID=70E78D6970373C07A81302C7CF800349"} 
      # I couldn't set the value automaticaly here, the cookie object can't be converted to string, so I change this value on every session to the new cookie's value. Any solutions? 

conn.request ("POST", "/consulta/servlet/consulta.aluno.ValidaAluno",params, headers) # Validation page 
resp = conn.getresponse() 

temp = conn.request("GET","/consulta/servlet/consulta.aluno.Publicacoes") # desired content page 
resp = conn.getresponse() 

print resp.read() 

¿Dónde pongo esta cookie para que el inicio de sesión esté autenticado?

Respuesta

17

Intentaría utilizar la biblioteca requests. El documentation es excelente, y el código termina siendo mucho más limpio que con urllib*

$ pip install requests 

El uso de un session (ver comentario de Piotr) que se encarga de las cookies por sí solo, el resultado es idéntico al

import requests 
url_0 = "http://webapp.pucrs.br/consulta/principal.jsp" 
url = "https://webapp.pucrs.br/consulta/servlet/consulta.aluno.ValidaAluno" 
data = {"pr1": "123456789", "pr2": "1234"} 

s = requests.session() 
s.get(url_0) 
r = s.post(url, data) 

Parece que funciona bien, ya que recibo un aviso de "Usuario inexistente" para pr1 123456789 y "Sehna inválida" con su número de usuario.

+3

Puede usar la sesión para manejar las cookies automáticamente. Desde [docs] (http://docs.python-requests.org/en/latest/user/advanced/#session-objects): El * objeto de sesión le permite persistir ciertos parámetros en las solicitudes. También persiste las cookies en todas las solicitudes realizadas desde la instancia de sesión. * –

+0

@PiotrDobrogost ¡Eso es genial, gracias! Y el código se ve aún mejor. – jorgeca

+0

Ahora, puede hacer que su respuesta sea aún mejor ... –

1

Le recomiendo que use mechanize, automáticamente maneja sesiones/cookies/inicios de sesión, además proporciona una API similar a urllib y p. Ej. llenado de formularios, por lo que no tiene que meterse con la solicitud POST correcta, ya que se construye mediante mecanizado.

+0

Lo instalé pero sigue diciendo que no hay ningún módulo instalado llamado mecanizar. Es un poco raro, pero seguiré intentándolo. También maneja las cookies? Porque ese es mi único problema. –

+0

Sí, maneja las cookies! Tal vez lo instaló para la versión de Python incorrecta. – dav1d

7

Debe usar el mismo "abrelatas" que ha creado para todas sus solicitudes, y manejará las cookies por sí mismo.

aquí es un extracto de algo que escribió recientemente

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) 

# then for all requests 

if postData:  
    pData = urllib.urlencode(postData) 
else: 
    pData = None 

httpReq = urllib2.Request(url, pData, self._headers) 
page = opener.open(httpReq) 
5

conversión de respuesta de MatthieuW a Python 3 da.

import urllib, http.cookiejar 

opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar())) 
# then for all requests 

if postData:  
    pData = urllib.parse.urlencode(postData) 
else: 
    pData = None 

httpReq = urllib.request.Request(url, pData) 
page = opener.open(httpReq) 
1

urllib no es bueno, use requests!

from requests import Request, Session 

url = "https://webapp.pucrs.br/consulta/principal.jsp" 
s = requests.Session() 

p = dict(pb1 = 'dd', pb2 = 'cc') 
r = s.get(url, params = p) 
# use the cert=/path/to/certificate.pem if you need it 
# elsewhere use verify = False to bypass ssl verification 

c = r.cookies 

# Then send back a response using those same cookies 

r = requests.get(other_url, cookies = c, verify = False) 
Cuestiones relacionadas