-1

我正在尝试使用我的帐户登录网站。在 python 代码中,我使用:

login_response = session.post('mysite.com', login_data, cookies=session.cookies)

其中session是请求会话对象,cookie 正是我在浏览器中尝试相同时发送的 cookie(当我登录时作为请求的一部分由浏览器发送的两个特定 cookie), login_data是在 post 请求中发送的表单数据字典

但是,预期的响应是:代码 303,发送了一个重定向链接,以及两个新的 cookie(即使用登录会话)。这就是在浏览器中发生的事情。当我想使用上面的代码执行此操作时,我得到的是代码 200,没有重定向链接,也没有 cookie。就好像网站只是“重新加载”。表单数据本身(密码+用户)是正确的。

我从浏览器中读取了请求内容:

-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="login__standard_submitted"

1
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="csrfKey"

2fcc7af2aa54f0e3ab85a6bdeca26f98
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="ref"

aHR0cHM6Ly9jcmltZW1hcmtldC53by8=
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="MAX_FILE_SIZE"

20971520
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="plupload"

92ee7fd8f0a2249c2327184c5b95d6c9
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="auth"

myusername
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="password"

password
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="remember_me"

0
-----------------------------366521339228594542373308740035
Content-Disposition: form-data; name="remember_me_checkbox"

1
-----------------------------366521339228594542373308740035--

我从中得到的数据,我只是写进了一个键字典:值,例如

'auth': 'myusername'

又是一个tl;dr: 我发送了正确的 cookie 以及在代码中执行 POST 请求时我观察到的看似正确的数据。但是,我得到的结果与在浏览器中完全不同,并且无法登录。

我是不是误会了什么?我需要更改什么才能通过代码登录?

编辑:在标题中,我还将'Content-Type'设置为'multipart/form-data',就像在浏览器中一样。编辑 2:相反,如果我将login_data设置为files=,它仍然不起作用。

4

2 回答 2

1

从我所看到的情况来看,您必须使用 files= 来使用 request.post 发送多部分/表单数据请求,但是您必须使用元组并将文件名设置为 NOne,这样它们就不会作为文件发送。

login_data = (
    ('login__standard_submitted', (None, '1')),
    ('csrfKey', (None, '2fcc7af2aa54f0e3ab85a6bdeca26f98')),
    ('ref', (None, 'aHR0cHM6Ly9jcmltZW1hcmtldC53by8')),
    ...
)
login_response = session.post('mysite.com', files=login_data, cookies=session.cookies)
于 2022-01-18T15:13:43.740 回答
0

我想知道您的会话对象是否正在发送 http: 请求,而应该发送 https: 请求。这可能会导致带有 303 响应的重定向。“请求”包似乎可以处理这种类型的响应。

import requests
res = requests.get('http://google.com')
print(res.url)

res = requests.get('http://stackoverflow.com')
print(res.url)

上面的输出是

http://www.google.com/
https://stackoverflow.com/
于 2022-01-18T12:42:28.250 回答