2012-04-20 113 views
7

我正試圖創建一個Python程序,使用我的ID和密碼登錄到我的大學的網站。這是登錄的正式頁面:https://webapp.pucrs.br/consulta/HTTP POST和GET使用Cookie進行身份驗證在Python中

您可能注意到,這兩個字段分別命名爲pr1和pr2。該頁面使用POST發送數據。此外,在加載頁面時會下載一個cookie,它是一個包含隨機值的JSESSIONID,據我所知,您必須返回POST方法的標題以驗證登錄。

我寫了下面的代碼,但GET方法的返回頁面顯示「會話未初始化」,可能導致cookie未正確發回。

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

我在哪裏放這個cookie,以便登錄身份驗證?

回答

17

我會嘗試使用requests庫。該documentation是優秀的,並且代碼最終被比urllib*

$ pip install requests 

使用更清潔的一個session(見彼得評論),處理它自己的cookies,結果看起來像這樣

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) 

它似乎工作正常,因爲我得到一個「Usuario inexistente」通知pr1 123456789和「Sehnainválida」與您的用戶號碼。

+3

您可以使用會話自動處理cookie。從[docs](http://docs.python-requests.org/en/latest/user/advanced/#session-objects):* Session對象允許您在請求中保留某些參數。它還會在Session實例的所有請求中保持cookie。* – 2012-04-20 15:15:08

+0

@PiotrDobrogost很酷,謝謝!代碼看起來更好。 – jorgeca 2012-04-20 15:33:44

+0

現在,你可以讓你的答案更好... – 2012-04-20 15:52:47

1

我建議您使用mechanize,它會自動爲您處理會話/ cookie /登錄,此外它還提供類似urllib的API,例如表單填充,所以你不必混淆正確的POST請求,因爲它是通過機械化構建的。

+0

我安裝了它,但它一直說沒有安裝模塊稱爲機械化。有點奇怪,但我會繼續嘗試。它也處理餅乾?因爲這是我唯一的問題。 – 2012-04-20 13:45:58

+0

是的,它處理餅乾!也許你安裝了錯誤的Python版本。 – dav1d 2012-04-20 14:26:03

7

您必須使用您爲所有請求創建的相同「開啓器」,並且它將自行處理所有的cookie。

這裏的東西摘錄我最近寫了

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

轉換MatthieuW的回答到Python 3給出。

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不好,使用請求!

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) 
相關問題