我的目的是登录到一个站点,然后从 python 脚本访问 protected 图像。我可以通过浏览器进行合法访问和工作访问。
这就是我现在拥有的。
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 文件,并且是登录的形式。但我的问题是,在我看来,我的 PHPSESSID
cookie 没有通过,所以我收到了 403
错误。但我显然在我的 session 上有它。我也尝试将 cookie 手动添加到我的 "r_img"
行,但没有任何区别,我仍然得到一个空的 CookieJar
和一个 403
返回错误。仅使用请求模块是不可能的吗?我忽略了什么吗?请原谅我对 HTTP
请求不是很熟悉。
为了清楚起见,我使用 Python 3.4。
最佳答案
您正在将您的表单数据作为HTTP header 传递。 POST 登录表单应该将表单元素作为 data
参数发送:
r_login = s.post('*domain*/user.php',
data={'cmd': 'login', 'loginname': '***', 'password': '***' })
请检查返回的正文,而不仅仅是状态代码。您的 POST 请求已被服务器接受 (200 OK
),但由于没有发布登录信息,body 很可能会告诉您“登录不正确,请重试” ".
当您请求图像时,服务器很可能再次清除了 cookie,因为它不是有效的登录 session 。 403 响应可能包含 PHPSESSID
的 Set-Cookie
header 以及过去的日期以清除它。
关于Python:请求 session 登录 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24260149/