首页 > 解决方案 > 为什么我的登录不能使用 Python 请求?

问题描述

在过去的几天里,我一直在尝试使用 Python Requests 登录并且遇到了问题。

这是我的代码:

import requests

LOGINURL = "https://admin.neopets.knetik.com/admin/login"
PROTECTEDPAGE = "https://admin.neopets.knetik.com/admin/order_summary/list"

payload = {
    "_target_path": "https://admin.neopets.knetik.com/admin/dashboard",
    "_username": "***",
    "_password": "***",
    "_remember_me": "on",

}

with requests.session() as session:
     post = session.post(LOGINURL, data=payload)
     response = session.get(PROTECTEDPAGE)
     print(response.text)

我确定我拥有所需的所有参数。我试过搜索 hidden_​​inputs,我遇到的唯一一个是“_target_path”。

知道我可能缺少什么吗?

标签: pythonauthenticationpython-requests

解决方案


登录页面非常简单,但是您发布到错误的 URL。

您发布到的 URL 用于登录表单,但它不接受任何登录凭据。该<form>标签告诉您将这些发送到哪里:

<form action="/admin/admin_login_check" ... method="POST">

action属性是一个相对 URL,指向您需要发送 POST 数据。

使用路径作为登录 URL:

LOGINURL = "https://admin.neopets.knetik.com/admin/admin_login_check"
PROTECTEDPAGE = "https://admin.neopets.knetik.com/admin/order_summary/list"

payload = {
    "_target_path": "https://admin.neopets.knetik.com/admin/dashboard",
    "_username": "***",
    "_password": "***",
    "_remember_me": "on",

}

with requests.session() as session:
     post = session.post(LOGINURL, data=payload)
     response = session.get(PROTECTEDPAGE)
     print(response.text)

但是,有些实现希望您首先向GET表单页面发送一个,以建立一个会话 cookie。该页面不使用任何 CSRF 保护,因此您不必加载表单来解析该信息。

由于这些页面使用 HTTPS,您可能还希望将原始表单 URL 作为Referer标头传递(它通常在 HTTP 或遍历域时被过滤掉,作为安全和隐私措施),该站点可能会将其用作附加针对自动登录的措施:

FORMURL = "https://admin.neopets.knetik.com/admin/login"
LOGINURL = "https://admin.neopets.knetik.com/admin/admin_login_check"
PROTECTEDPAGE = "https://admin.neopets.knetik.com/admin/order_summary/list"

payload = {
    "_target_path": "https://admin.neopets.knetik.com/admin/dashboard",
    "_username": "***",
    "_password": "***",
    "_remember_me": "on",

}

with requests.session() as session:
    session.get(FORMURL)
    post = session.post(LOGINURL, data=payload, headers={'Referer': FORMURL})
    response = session.get(PROTECTEDPAGE)
    print(response.text)

如果这仍然不起作用,则服务器正在使用其他机器人嗅探技术。请参阅python requests.get always get 404了解如果你真的想推动它,你可以遵循什么样的策略。


推荐阅读