繁体   English   中英

Python请求登录

[英]Python Requests Log In

我正在尝试使用此表单的 python 请求构建登录代码(请参阅下面的 html 代码)

我的目标:

我只想使用 python 请求登录到这个网站。 我已经编写了 python 脚本,但是当我运行它时,什么也没有发生。 我想知道我错过了什么。

我试图按照我在 google 中找到的教程进行操作,但它们都不起作用。

这是我的 Python 代码:

import requests
from bs4 import BeautifulSoup

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

login_data = {
    "username": "myusername",
    "password": "mysupersecurepassword",
    "tradingpin": "123456"
}

with requests.Session() as s:
    url = "https://my.website.com/"
    r = s.get(url, headers=headers)
    print(r.text)

    # Make a post request to website
    r = s.post(url, data=login_data, headers=headers)

HTML 表单

<form action="" method="post">
  <input id="hdnToken" name="token" type="hidden" />
  <input type="text" placeholder="Username" id="u-value" class="ph-tooltip-T form-control" value="">
  <input type="password" placeholder="Password" id="password" class="ph-tooltip-T form-control" value="">
  <i onclick="togglePwVisibility()" id="eye" class="glyphicon glyphicon-eye-open form-control-feedback"></i>
  <a href="https://login.website.com/" style="color: darkslategray;font-size: 11px;" class="btn-link">Forgot your password?</a>
  <h5>Advanced Option:</h5>
  <label>
    <input type="checkbox" id="chkTrading" name="isTPinAutoFill" onclick="toggleTradingPIN()"> Auto-fill Trading PIN </label>
  <i>Save and pre-fill your Trading PIN during trading transactions.</i>
  <br>
  <br>
  <input type="password" id="txtTradingPin" name="tradingPIN" class="ph-tooltip-T form-control" placeholder="Trading PIN" maxlength="4" onkeypress="return isNumber(event)" value="">
  <button type="submit" id="loginButton" style="background-color: #333333;width: 25%;color: ghostwhite" class="ph-button1 btn btn-default">LOGIN</button>
</form>

问题

  1. Input 或 Forms 没有 name 属性。
  2. 我写的python代码没有做任何事情? 就好像什么都没发生过一样。 我检查了print(r.text) ,它返回了登录页面的 hml 代码。 所以我认为 POST 请求没有被执行。

我认为你不能用这个网站login ,因为login请求需要这样的正文:

token=Basic+ZFhObGNtNWhiV1U9Ok1USXpORFUy&isTPinAutoFill=on&tradingPIN=1234

这就是我输入的

username='username'
password='123456'
pin='1234'

如果您不知道对username & password进行编码的算法,则无法登录。

在此处输入图片说明

与您所相信的公认答案相反,该算法并没有那么复杂。 它在表面上显示为 Base64,但它已被双重编码(但不清楚为什么会这样)。

伪代码中的生成算法将是:

Token = base64_encode(base64_encode(username) + ":" + base64_encode(password))

您需要做的就是在 POST 中发送表单数据(带有Content-Type: application/x-www-form-urlencoded标头),以正确模拟浏览器代表您执行的操作。

目前尚不清楚目标站点上是否有任何安全机制会阻止这种自动使用站点的成功。

在将任何数据发布到网站之前,您正在打印 r.text。 尝试这个:

import requests
from bs4 import BeautifulSoup

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

login_data = {
    "username": "myusername",
    "password": "mysupersecurepassword",
    "tradingpin": "123456"
}

with requests.Session() as s:
    url = "https://my.website.com/"
    # r = s.get(url, headers=headers) THIS DOES NOTHING
    # print(r.text)

    # Make a post request to website
    r = s.post(url, data=login_data, headers=headers)
    print(r.content)
    # with soup:
    soup = BeautifulSoup(r.content, 'html.parser')
    print(soup)

您应该能够在 html 中找到您的用户名和密码。 如果是,则表示您已成功登录!

这个网站在某种程度上有点特别。 不好意思,新手,第一次遇到这种登录过程。

问题是,“令牌”是您登录所需的全部内容。该网站(我不确定它是否正确)会加密您的用户名和密码,然后向您发出“唯一”令牌。 该令牌将被发送到服务器,而不是传统的用户名和密码。

所以为了解决我的登录问题,我需要做的就是将login_data更改为:

login_data = {
    'token': 'Basic easkdhkajjkadjknaskjdhajks'
}

其中easkdhkajjkadjknaskjdhajks是发给每个用户的唯一令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM