我的表单结构是:
<POST https://www.lumosity.com/authentication application/x-www-form-urlencoded
<HiddenControl(utf8=✓) (readonly)>
<HiddenControl(authenticity_token=xMELAlMu5kqxE23RdvRj+UjyF+bXVynw9AgHIc2j69Q=) (readonly)>
<HiddenControl(screen_resolution=) (readonly)>
<HiddenControl(activation_code=) (readonly)>
<HiddenControl(redirect_uri=) (readonly)>
<TextControl(user[login]=)>
<PasswordControl(user[password]=)>
<SubmitControl(commit=Log In) (readonly)>
<SubmitButtonControl(<None>=) (readonly)>
<CheckboxControl(persistent_login=[*1])>>
我登录的代码是:
import requests
from bs4 import BeautifulSoup as bs
payload = {
'user[login]' : '***@gmail.com',
'user[password]' : '******'
}
with requests.Session() as s:
m = s.get('https://www.lumosity.com/login',headers={'User-agent': 'Mozilla/5.0'})
t = s.post('https://www.lumosity.com/login',data = payload)
r = s.get('http://www.lumosity.com/app/v4/dashboard')
目前我没有使用&#34;真实性令牌&#34;登录。是否需要?
答案 0 :(得分:1)
我期望需要authenticity_token
字段,是的。我说期待因为它真的取决于服务器的确切期望。该服务器是一个黑盒子,我们无法看到它的行为方式,但同样的标记也与顶部的csrf-token
标记中的名称<meta>
相关联,因此它被用作跨站点伪造保护;我希望在这种情况下需要令牌。
并且,如果登录与您的浏览器一起使用并且您的浏览器发送了该信息,那么最好尽量模仿它。
您必须解析m
对该值的响应结果。您可以使用BeautifulSoup:
from bs4 import BeautifulSoup
soup = BeautifulSoup(m.content)
token = soup.select('input[name="authenticity_token"]')[0]['value']
登录是否可以在没有其他字段的情况下工作是一个试错的问题。
但是,您需要调整发送到的; /login
张贴到/authentication
的表单。 /login
网址很可能只会再次返回表单,或会返回405 Method Not Allowed错误。
当s.post()
来电的回复不再是登录表单时,您就会知道您已成功;例如当您被重定向到不同的页面时。
您可以使用robobrowser等工具自动执行表单处理;它使用requests
和BeautifulSoup一起执行与上面相同的操作和为您处理这些隐藏字段:
from robobrowser import RoboBrowser
browser = RoboBrowser(history=True)
browser.open('https://www.lumosity.com/login')
form = browser.get_form()
form['user[login]'].value = '***@gmail.com'
form['user[password'].value = '******'
browser.submit_form(form)