Python requests post: data and json



几年来,我使用以下Python代码成功地在登录页面后面检索了一个网页:

username = 'user'
password = 'pass'
login_url = 'https://company.com/login?url='
redirect_url = 'https://epaper.company.com/'
data = { 'email' : username, 'pass' : password }
initial_url = login_url + quote(redirect_url)
response = requests.post(initial_url, data=data)

大约两个月前,company.com发生了变化,请求返回了状态代码400。我尝试将数据参数更改为json(response = requests.post(initial_url, json=data)(,这给了我200的响应,告诉我提供了错误的密码。

有什么想法我可以试着调试吗?

谢谢,1月

更新:我刚刚尝试使用请求会话从登录页面检索csrf_token(如这里所建议的(,所以现在我的代码是:

with requests.Session() as sess:
response = sess.get(login_url)
signin = BeautifulSoup(response._content, 'html.parser')
data['csrf_token'] = signin.find('input', {'name':'csrf_token'})['value']
response = sess.post(initial_url, data=data)

不幸的是,响应仍然是400(json参数的200/错误密码(。

第一:当您发送data=data时,使用{quot;内容类型":"应用程序/x-www-form-urlencoded"};如果您发送json=data,则应在标头中使用{"内容类型":"应用程序/json"}

第二:也许已经添加了重定向。尝试添加:

response = sess.post(url, data=data)
print("URL you expect", url)
print("Last request URL:", response.url)

请务必检查:

print(sess.cookies.get_dict())
print(response.headers)

如果您在检查时得到意外结果,请更改代码如下:

response = sess.post(url, data=data, allow_redirects=False)

最新更新