Luc*_*ijo 13 python authentication cookies post http
我正在尝试使用我的id和密码创建一个登录我大学网站的python程序.这是登录的正式页面: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()
Run Code Online (Sandbox Code Playgroud)
我在哪里放置此cookie以便登录验证?
jor*_*eca 20
我会尝试使用该requests库.该文档是优秀的,并且代码结束是比用更清洁urllib*
$ pip install requests
Run Code Online (Sandbox Code Playgroud)
使用自己处理cookie 的会话(请参阅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)
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,因为我得到了pr1123456789的"Usuario inexistente" 通知和用你的用户号码"Sehnainválida".
您必须使用为所有请求创建的相同"开启者",它将自行处理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)
Run Code Online (Sandbox Code Playgroud)
转换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)
Run Code Online (Sandbox Code Playgroud)