[英]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.