无法使用python请求模块登录

时间:2014-10-06 09:27:55

标签: python python-2.7 cookies login python-requests

我的表单结构是:

<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;登录。是否需要

  1. 如果是,我该如何访问它?
  2. all 表单结构中的参数需要通过&#34; payload&#34;, 即使有些人是空的?
  3. 一旦我成功登录,我应该打印一件事来验证它是否成功?

1 个答案:

答案 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)