HTTP POST和GET with cookies用于python中的身份验证

2024-04-25 17:06:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个python程序,该程序使用我的id和密码登录到我的大学网站。这是登录的正式页面:https://webapp.pucrs.br/consulta/

正如您可能注意到的,这两个字段名为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放在哪里,这样登录就被验证了?


Tags: thebr程序valuecookie页面openerconn
3条回答

我会尝试使用requests库。documentation非常好,代码比urllib*干净得多

$ pip install requests

使用自行处理cookies的session(参见Piotr的注释),结果如下所示

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)

它似乎工作得很好,因为我收到了一个关于pr1123456789和“Sehna inválida”的“Usuario insistent”通知,上面有您的用户号码。

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

您必须使用您为所有请求创建的相同“opener”,它将自行处理cookies。

这是我最近写的东西的摘录

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)

相关问题 更多 >