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' 参数
我在使用 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' 参数