python - 如何使用带有 CSRF 令牌的 robobrowser 登录?
问题描述
我目前正在尝试登录
https://customersso1.fortinet.com/saml-idp/login/?next=
登录后前往https://support.fortinet.com/Information/ProductLifeCycle.aspx
并刮掉里面的所有桌子。
我尝试了各种方法,并选择了 robobrowser 作为理想的选择。但是,该网站中有 CSRF 中间件令牌,并且不允许我登录。
Robobrowser 中的 get_form() 函数也不会获取用户名和密码字段供我登录。(登录页面中只有 1 个表单)我已提供凭据作为其公共信息,任何人都可以创建一个 ID 来访问该信息
import re
from robobrowser import RoboBrowser
from bs4 import BeautifulSoup
br = RoboBrowser()
br.open('https://customersso1.fortinet.com/saml-idp/login/?next=')
form = br.get_form()
form["id_username"] = "csmcoe.global@global.ntt"
form["id_password"] = 'Csmcoe@123'
#form["csrffieldname"] = 'X2fOGlgm0lBH60k2SqPiJ5BkFv7lRzKo'
br.submit_form(form)
当您解析表单时
form.parsed
你得到(当你检查网页时,你会注意到表单中的 div 容器,但当你抓取它时不会注意到。由于没有用户名元素,我无法通过表单登录)
<form action="" autocomplete="off" id="login_form" method="post">
<input name="csrfmiddlewaretoken" type="hidden" value="tzDXaug8hGlNO7h6oDDU3tel80mdA9AZ"/>
<input name="next" type="hidden" value="/"/>
<div class="container" id="container"></div>
</form>
除了 robobrowser 之外的任何其他方式也值得赞赏。谢谢!
解决方案
尝试这个。
from simplified_scrapy import SimplifiedDoc, utils, req
# Get csrfmiddlewaretoken
url = "https://customersso1.fortinet.com/saml-idp/login/?next="
html = req.get(url)
doc = SimplifiedDoc(html)
csrfmiddlewaretoken = doc.select(
'form#login_form>input@name=csrfmiddlewaretoken>value()')
username = 'your user name'
password = 'your password'
# login
html = req.post(url,
'csrfmiddlewaretoken=' + csrfmiddlewaretoken + '&next=&username' +
username + '&password=' + password,
header={'Referer': url})
print (html) # See what the problem is
# Get next page
html = req.get(
'https://support.fortinet.com/Information/ProductLifeCycle.aspx')
doc = SimplifiedDoc(html)
print(doc.title.text)
推荐阅读
- mysql - 有没有办法查看特定列的分类内容?
- c# - RabbitMQ C# AMQP 在尝试连接本地主机时被中断
- c# - wpf 使进度条可从方法访问
- admob - 如何让 Google Admob 验证我的身份?
- python - Dash python - 基于熊猫列的图像回调
- javascript - 如何创建将拦截 vanilla js 中的任何属性和函数调用的模拟对象?
- python - 如何在 SublimeREPL 中使用虚拟环境?
- jmeter - 使用ppk文件的Jmeter SSH SFTP
- python - Odoo 11 - 过滤 Many2One 字段
- javascript - 有没有办法在函数中模拟 Promise.resolve