2012-04-20 162 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) 
相关问题