python请求登录验证

python requests login authentication

我在使用 python 请求登录 this 站点上的帐户时遇到问题。 登录页面是www.utahrealestate.com/auth/login。 登录凭据 post 转到 www.utahrealestate.com/auth/authenticate.

这是我尝试登录的过程(r 是一个请求 session):

>>> login = r.post('http://www.utahrealestate.com/auth/authenticate', data={'login':'my_login','pass':'my_password'}) 
>>> login.text
u'{"error":"Username or password was invalid.  Please try again or click on \"Reset it\" above to reset your password."}'

我知道登录凭据是正确的。我也知道这些字段被命名为 login 和 pass,除了页面生成一些数字组合并将其附加到每个字段名称,但它只在我检查浏览器中的元素时这样做。在我的终端中,这些字段被简单地命名为登录和通过。

使用请求和 BeautifulSoup,这是我终端中的登录元素:

<input id="login" name="login" tabindex="1" type="text"/>

这是在浏览器中检查元素时的样子:

<input id="login" type="text" tabindex="1" name="login_666832525">

密码元素的构造类似,不同之处在于它被命名为:"pass",其数字组合与附加到末尾的登录字段相同。表单中似乎没有任何隐藏字段。 每次我在浏览器中刷新页面时,字段名称(login_### 或 pass_###)后面的数字似乎都会发生变化,但当我在终端中使用请求获取内容时,它并不存在。

我假设我的登录问题源于我无法从字段名称中重现数字。因此,我尝试更改 requests.get header 中的 "User-Agent" 值以反映我浏览器中的值,但似乎没有重现编号的字段名称。它与某种 session cookie 相关联吗?也许是我看到的 PHPSESSIONID cookie?或者这与字段名称无关?

编辑:

我发现了一个 post 请求,该请求在登录页面的获取请求之后自动发送(posts 到 auth/login.form/)。对此 post 请求的响应提供了附加到字段名称的数字。但是,我把一串数字传给了字段名,还是进不去

form_id = u'418622340'
loginauth_post = r.post('http://www.utahrealestate.com/auth/authenticate/', headers=authpost_header, data={'login_'+form_id: 'my_login', 'pass_'+form_id: 'my_pass'})

尝试写:

data = urllib.urlencode({'login':'my_login','pass':'my_password'})

我能够解决这个问题。显然我需要获取登录页面,然后使用获取登录页面提供的 cookie 向 auth/login.form/ 发送初始 post 请求。它以需要附加到字段名称的 ID 号作为响应。然后,使用相同的 cookie 向 auth/authenticate 发送 post 请求。技巧似乎是在 header.

中包含 'X-NewRelic-ID' 和 'X-Requested-With' 参数