2012-04-20 13 views
7

Próbuję utworzyć program python, który loguje się do witryny mojego uniwersytetu za pomocą mojego identyfikatora i hasła. Jest to strona oficjalna do logowania: https://webapp.pucrs.br/consulta/HTTP POST i GET z plikami cookie do uwierzytelniania w python

Jak można zauważyć, dwa pola mają nazwy pr1 i pr2. Strona korzysta z POST do wysyłania danych. TAKŻE istnieje plik cookie, który jest pobierany po załadowaniu strony, jest to JSESSIONID zawierający losową wartość, która, jak rozumiem, musisz zwrócić w nagłówku metody POST, aby uwierzytelnić logowanie.

Napisałem poniższy kod, ale strona powrotu w metodzie GET mówi "sesja nie została zainicjowana", prawdopodobnie dlatego, że plik cookie nie został poprawnie wysłany.

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

Gdzie mogę umieścić ten plik cookie, aby logowanie zostało uwierzytelnione?

Odpowiedz

17

Chciałbym spróbować użyć biblioteki requests. documentation jest doskonała, a kod kończy się znacznie czystsze niż urllib*

$ pip install requests 

Używanie session (patrz komentarz Piotra), który obsługuje pliki cookie na własną rękę, wynik wygląda tak

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) 

Wygląda na to, że działa dobrze, ponieważ dostaję powiadomienie "Usuario inexistente" dla pr1 123456789 i "Sehna inválida" z Twoim numerem użytkownika.

+3

Możesz użyć sesji do automatycznego obsługiwania plików cookie. Od [docs] (http://docs.python-requests.org/en/latest/user/advanced/#session-objects): Obiekt * Session umożliwia utrzymywanie pewnych parametrów pomiędzy żądaniami. Utrzymuje również pliki cookie we wszystkich żądaniach wysłanych z instancji sesji. * –

+0

@PiotrDobrogost To fajne, dziękuję! Kod wygląda jeszcze lepiej. – jorgeca

+0

Teraz możesz poprawić swoją odpowiedź ... –

1

Polecam użyć mechanize, automatycznie obsługuje sesje/pliki cookie/logowania, ponadto zapewnia API podobny do urllib, np. Wypełnianie formularzy, więc nie musisz zadzierać z prawidłowym żądaniem POST, ponieważ jest on konstruowany mechanicznie.

+0

Zainstalowałem go, ale ciągle powtarza, że ​​nie ma zainstalowanego modułu o nazwie mechanize. Coś dziwnego, ale będę próbować. Obsługuje również pliki cookie? Bo to mój jedyny problem. –

+0

Tak, obsługuje pliki cookie! Może zainstalowałeś go dla niewłaściwej wersji Pythona. – dav1d

7

Musisz użyć tego samego "otwieracza", który utworzyłeś dla wszystkich swoich żądań, i sam zajmie się ciasteczkami.

tu jest wyciąg coś napisałem niedawno

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

Konwersja MatthieuW w odpowiedzi do Python 3 daje.

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 nie jest dobry, użyj zgłoszeń!

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) 
Powiązane problemy