[英]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>
問題
print(r.text)
,它返回了登錄頁面的 hml 代碼。 所以我認為 POST 請求沒有被執行。與您所相信的公認答案相反,該算法並沒有那么復雜。 它在表面上顯示為 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.