我将 Python 3 用于脚本,该脚本将监视网页上用户配置文件的更新。该站点的登录受到 CSRF 反制措施的保护,这是一件好事。但是,我无法让我的脚本登录到该站点。
我使用
mechanicalsoup
的方法:import mechanicalsoup browser = mechanicalsoup.Browser() login_page = browser.get(base_url) login_form = login_page.soup.select(".form-signin")[0] login_form.find(attrs={"name": "username"})['value'] = 'username' login_form.find(attrs={"name": "password"})['value'] = 'password' page2 = browser.submit(login_form, login_url) print(str(page2.text))
我使用
robobrowser
的方法:import re from robobrowser import RoboBrowser browser = RoboBrowser(history=True) browser.open(base_url) form = browser.get_form(action='/login/') form["username"] = 'username' form["password"] = 'password' browser.submit_form(form) print(str(browser.select))
在这两种情况下,我都得到了 403
的 HTTP 状态和一条消息说 CSRF 验证失败。请求中止。
- 有什么解决办法吗?
- 有问题的表单有一个包含 CSRF token 的隐藏输入。我想
mechanicalsoup
和robobrowser
也会提交这个输入。我对吗?还是我必须特殊对待它? - 我认为这两个包使用的 session 可以处理 cookie 等所有内容。我错过了什么吗?
最佳答案
我通过设置 Referer
header 让 robobrowser
变体工作。
browser.session.headers['Referer'] = base_url
所以对我有用的完整代码如下:
import re
from robobrowser import RoboBrowser
browser = RoboBrowser(history=True)
browser.open(base_url)
form = browser.get_form(action='/login/')
form["username"] = 'username'
form["password"] = 'password'
browser.session.headers['Referer'] = base_url
browser.submit_form(form)
print(str(browser.select))
关于python - 通过 Python 登录网站 - 如何应对 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608781/