我的目的是登录网站,然后从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。
答案 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)