首页 > 解决方案 > 如何使用带有 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 之外的任何其他方式也值得赞赏。谢谢!

标签: pythonweb-scrapingrobobrowser

解决方案


尝试这个。

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)

推荐阅读