2014-10-06 139 views
0

我的表格结构登录:无法使用python请求模块

<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])>> 

我的登录IS代码:

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') 

目前我没有使用“真实性令牌”在日志记录。 是否需要

  1. 如果是这样,我该如何访问它?
  2. 全部表单结构中的参数需要通过“有效载荷”,即 ,即使有些是空的?
  3. 一旦我登录成功,我应该打印哪些内容来验证它是否成功?

回答

1

我想预计authenticity_token字段是必需的,是的。我说预计,因为它确实取决于服务器到底会发生什么。该服务器是一个黑盒子,我们无法看到它的行为方式,但同样的标记也与顶部的<meta>标记中的名称csrf-token相关联,因此它被用作跨站点伪造防护;我希望在这种情况下需要令牌。

而且,如果登录与您的浏览器一起工作并且您的浏览器发送了该信息,最好尝试尽可能地模仿该信息。

您必须解析出m对该值的响应结果。您可以使用BeautifulSoup此:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(m.content) 
token = soup.select('input[name="authenticity_token"]')[0]['value'] 

阉或不登录会没有其他领域的工作是试验和错误的问题。

但是,您需要调整,然后您将其张贴到;在/login的帖子到/authentication/login网址最有可能会再次返回表单,会返回405方法不允许错误。

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) 
+0

感谢u.it工作 – dreamer 2014-10-06 15:35:50