簡體   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