使用 python 自动登录网站

Autologin to website using python

我是 python 的新手,我正在尝试自动登录网站,然后我会尝试下载文件。

我试过以下方法,还是无法登录。

方法

import requests

在此处填写您的详细信息以发布到登录表单。

payload = {
    'username': 'xxxxxx',
    'password': 'xxxxxxx'
}

使用'with'确保会话上下文在使用后关闭。

with requests.Session() as s:
    p = s.post('https://service.rl360.com/scripts/customer.cgi', data=payload)
# print the html returned to see if it's a successful login page.
print p.text


# An authorised request.
r = s.get('https://service.rl360.com/scripts/customer.cgi/SC/myAccount.php')
print r.text

任何帮助将不胜感激,我正在使用 python 2.7

我假设您 url 提交了正确的表格。我从该网站注意到的一件事是

<input type="text" name="USERNAME" id="username" title="please enter your username here" class="input" style="width: 14em;">

我不确定他们是如何编写服务器端代码的,但您可以尝试使用全大写字符的 name 属性而不是 id 属性, 所以你的有效载荷变成: updated like below 更新,表单中还有最后一个隐藏字段,也许你应该包括它(url 包含那个 option 值,但它不在 POST 请求中,服务器端不会识别它),您还应该包括用户代理字符串,以防万一:

payload = {
    'USERNAME': 'xxxxxx',
    'PASSWORD': 'xxxxxxx',
    'option': 'login'
}
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
def test():
  with requests.Session() as s:
      p = s.post('https://service.rl360.com/scripts/customer.cgi?option=login',data=payload)

首先,您没有给出任何 error/result 的指示。你能详细说明它是什么 returning/saying 吗?这可能会进一步说明问题,但我假设您的第二个请求(对 myAccount.php)只是说 "not authorised".

您必须记住 HTTP 请求是完全无状态的,如果您发出两个请求,第二个请求将不知道第一个请求的任何信息...除非使用 cookie。

所以据我所知,仅仅因为您可能已经在第一个请求中正确地进行了身份验证,所以 myAccount.php 的第二个请求对第一个身份验证请求没有任何概念。

您发出的第一个请求很可能会 return 某种 cookie 或令牌,表明您现在已通过身份验证。然后,您需要在对经过身份验证的 url 的下一个请求中包含该令牌,以便服务器知道您可以继续。

尝试在 p 中转储完整的响应以查看已 return 编辑的内容。您也可以在 Chrome 中使用开发人员工具 -> 网络选项卡执行此操作。勾选 Preserve Log 然后手动登录到该站点。然后返回并查看对 POST 的响应 - 希望您会看到表明您现在已通过身份验证的内容。然后您需要在下一个请求中复制它。