Python:请求会话登录Cookie

时间:2014-06-17 09:25:39

标签: python http cookies login python-requests

我的目的是登录网站,然后从python脚本访问受保护的图像。我从浏览器获得合法和工作访问权限。

这就是我现在所拥有的。

import requests

s = requests.Session()

s.get('*domain*')

r_login  =s.post('*domain*/user.php', headers={'cmd': 'login', 'loginname': '***', 'password': '***' })

print (s.cookies)
print (r_login.status_code)

r_img = s.get('*domain*/*protectedimage*.jpg')
print (r_img.status_code)
print (r.cookies)

print (s.cookies['PHPSESSID'])

输出:

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie PHPSESSID=664b0842085b847a04d415a22e013ad8 for *domain*/>]>
200
403
<<class 'requests.cookies.RequestsCookieJar'>[]>
664b0842085b847a04d415a22e013ad8

我确信我可以成功登录,因为我之后已经下载了html文件,并且它是以登录的形式。但我的问题是在我看来我的{{1} } cookie没有通过,所以我收到了PHPSESSID错误。但我在会议中明确表示。我还尝试将Cookie手动添加到我的403行,但没有任何区别,我仍然会收到空的"r_img"CookieJar错误。只有请求模块才能实现这一点吗?我忽略了什么吗?请原谅我对403请求不太熟悉。

我只是为了清晰起见而使用Python 3.4。

2 个答案:

答案 0 :(得分:5)

您正在将表单数据作为 HTTP标头传递。 POST登录表单应该将表单元素作为data参数发送:

r_login = s.post('*domain*/user.php', 
                 data={'cmd': 'login', 'loginname': '***', 'password': '***' })

检查返回的正文,而不仅仅是状态代码。您的POST请求已被服务器接受(200 OK),但由于没有发布登录信息,正文很可能会告诉您类似&#34;登录错误,请再试一次&# 34。

当您请求图像时,服务器很可能再次清除cookie,因为它不是有效的登录会话。 403回复可能包含Set-Cookie的{​​{1}}标题,其中包含过去的日期以清除它。

答案 1 :(得分:3)

尝试这样做:

根据python-requests文档:

payload = {'cmd': 'login', 'loginname': '***', 'password': '***'}
url = '*domain*/user.php'
s.post(url, data=payload)