2012-04-20 10 views
7

Sto provando a creare un programma python che acceda al sito della mia università usando il mio id e password. Questa è la pagina formale per l'accesso: https://webapp.pucrs.br/consulta/HTTP POST e GET con i cookie per l'autenticazione in python

Come si può notare, i due campi sono denominati pr1 e pr2. La pagina utilizza POST per inviare i dati. INOLTRE, c'è un cookie che viene scaricato quando viene caricata la pagina, si tratta di un JSESSIONID contenente un valore casuale che, come ho capito, è necessario tornare sull'intestazione del metodo POST per autenticare l'accesso.

Ho scritto il seguente codice, ma la pagina di ritorno sul metodo GET dice "La sessione non è stata inizializzata", probabilmente perché il cookie non è stato restituito correttamente.

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

Dove inserisco questo cookie in modo che l'accesso sia autenticato?

risposta

17

Vorrei provare a utilizzare la libreria requests. Il documentation è eccellente, e il codice finisce per essere molto più pulito rispetto ad urllib*

$ pip install requests 

Utilizzando un session (si veda il commento di Piotr) che gestisce i cookie di per sé, il risultato assomiglia a questo

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) 

Sembra funzionare bene, mentre ricevo un avviso "Usuario inesistente" per pr1 123456789 e "Sehna inválida" con il tuo numero utente.

+3

È possibile utilizzare la sessione per gestire automaticamente i cookie. Da [docs] (http://docs.python-requests.org/en/latest/user/advanced/#session-objects): L'oggetto * Session consente di mantenere determinati parametri attraverso le richieste. Persiste anche i cookie su tutte le richieste fatte dall'istanza Session. * –

+0

@PiotrDobrogost Che bello, grazie! E il codice sembra ancora migliore. – jorgeca

+0

Ora puoi migliorare la tua risposta ... –

1

Ti consiglio di utilizzare mechanize, gestisce automaticamente sessioni/cookie/accessi per te, inoltre fornisce un'API di tipo urllib e ad es. form-filling, quindi non devi fare i conti con la richiesta POST giusta, poiché viene costruita da meccanizza.

+0

L'ho installato ma continua a dire che non c'è alcun modulo installato chiamato mechanize. Un po 'strano, ma continuerò a provare. Gestisce anche i cookie? Perché questo è il mio unico problema. –

+0

Sì, gestisce i cookie! Forse l'hai installato per la versione sbagliata di Python. – dav1d

7

È necessario utilizzare lo stesso "dispositivo di apertura" creato per tutte le richieste e gestirà i cookie da solo.

Ecco un estratto di qualcosa che ho scritto di recente

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

Conversione risposta di MatthieuW a Python 3 dà.

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 non va bene, utilizzare le richieste!

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)