我正在尝试使用以下代码中的代码登录此网站:https://portals.broadinstitute.org/cmap/index.jsp:https://stackoverflow.com/a/22547541/651779。这曾经正常工作。但是,现在运行时,我的授权被拒绝了。用户名和密码是正确的。
代码下方:
login_url = 'http://www.broadinstitute.org/cmap/j_security_check'
login_values = urllib.parse.urlencode({'j_username': user,
'j_password': pwd,
'submit': 'sign in'})
print(login_url+'?'+login_values)
这会给出网址(填写用户名和密码):
http://www.broadinstitute.org/cmap/j_security_check?j_username=<username>&j_password=<password>&submit=sign+in
当我在浏览器中粘贴它时,它会正确登录我,所以我知道用户名和密码仍然很好。
payload_submit_signature = bytes(login_values, 'ascii')
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(
urllib.request.HTTPRedirectHandler(),
urllib.request.HTTPHandler(debuglevel=0),
urllib.request.HTTPSHandler(debuglevel=0),
urllib.request.HTTPCookieProcessor(cj))
opener.open(submit_signature_url) #First call to capture the JSESSIONID
resp = opener.open(login_url, payload_submit_signature)
for cookie in cj:
print (cookie.name, cookie.value, cookie.domain, cookie.expires, cookie.secure) #etc etc
根据之前的堆栈回答,需要首先设置cookie。上面的印刷品给出了
JSESSIONID B2CFD19CBB9105EC2DC4D75DD7C3C0C9 portals.broadinstitute.org None True
所以这似乎有效。
print(resp.read())
这会在填写错误的用户密码组合时提供相同的hmtl页面。怎么没有正确发送这些?
答案 0 :(得分:1)
使用requests
,此代码适用于我
login = 'https://portals.broadinstitute.org/cmap/j_security_check'
index = 'https://portals.broadinstitute.org/cmap/index.jsp'
username = 'my username'
password = 'my password'
data = { 'j_username':username, 'j_password':password, 'submit':'sign+in' }
ses = requests.Session()
ses.get(index) # you need this to get cookies #
post = ses.post(login, data=data)
print(ses.cookies.get_dict())
print(post.url)
print('sign out' in post.content)
结果:
{'JSESSIONID': 'A86EDB10DB2BC063EFE7A528F5E88A77'}
https://portals.broadinstitute.org/cmap/index.jsp
True