❇️ 流程
-
进入登录页面 (DAS验证的登录页面)
-
获取验证码图像,百度OCR识别
-
登录
🏞️ 环境
-
Windows 11
-
Python 3.12
-
PyCharm 2023
🧵 准备工作
安装必要依赖库
-
bs4
-
Jupyter
-
推荐安装 Jupyter(Anaconda 或 PyCharm 均可)进行 request 调试
pip install bs4 pip install jupyter
网址
-
DAS登录地址
-
验证码地址
-
用户信息 (账号、密码)
在浏览器中打开 开发者工具 或 Ctrl + F12 ,进行一次登录操作后,可以在对应的网址请求数据中查看到 DAS 的地址。
注册百度智能云账号
-
免费使用百度OCR文字识别
-
获取百度 token (间隔30天需要更新一次)
-
创建OCR应用(每月免费使用200次),获取应用ID、API Key、Secert Key
方法实现
百度API调用
token码获取
def access_token() -> None:
"""
获取 access_token
:return: None
"""
API_Key: str = ""
Secret_Key: str = ""
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_Key}&client_secret={Secret_Key}'
response = requests.get(host)
file = open("./data/access token.txt", "w")
file.write(f"{datetime.now().strftime('%Y-%m-%d')}\n{response.json()['access_token']}")
file.close()
OCR文字识别
def OCR() -> str:
"""
文字验证码识别
:return: 验证码
"""
# 二进制方式打开图片文件
f = open('./img/captcha.jpg', 'rb')
img = base64.b64encode(f.read())
params = {"image": img}
f.close()
# 每 30 天刷新一次 access_token 码,暂未修改,可自行完成
if datetime.now().day == 1:
access_token()
TokenFile = open("./data/access token.txt", "r")
Token = TokenFile.readlines()[1]
TokenFile.close()
# # 获取到验证码后删除该文件
# if path.exists("./img/captcha.jpg"):
# remove("./img/captcha.jpg")
url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token={Token}"
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(url, data=params, headers=headers)
if response:
print(response.json())
return response.json()['words_result'][0]['words']
网址数据
网址、请求头
class URL:
""" 网址数据 """
genCodeURL: str = "" # 验证码地址
loginURL: str = "/cas/login" # 登录地址
header: dict = {
"User-Agent": "",
'Accept': "",
'Cookie': ""
}
验证码保存
def saveCaptchaCode(session, response: requests) -> None:
"""
验证码保存
:param session: 会话
:param response: 请求
:return: None
"""
re = session.get(URL.genCodeURL, headers=response.request.headers)
with open("./img/captcha.jpg", "wb") as f:
f.write(re.content)
用户信息
class User:
user: int =
password: str = ""
下面部分依据不同网站的请求数据为准,不必做参考。
execution 为登录页面中的 input 数据在本人请求的网站中为必要参数。
execution = BeautifulSoup(entry_login.text, "html.parser").find('input', {"name": "execution"}).get("value")
网页请求
创建 session 会话
session = requests.session()
-
【第一次请求】进入登陆页面,获取验证码
对网址发送 get 请求进入到登陆页面,拿到验证码地址。
entry_login: requests = session.get(URL.loginURL, headers=URL.header)
2. 【第二次请求】获取验证码
再对验证码地址发送一次 get 请求,保存验证码。
saveCaptchaCode(session, entry_login)
更新登录请求数据
data: dict = {
"username": User.user,
"password": User.password,
"captchaCode": OCR().replace(" ", ""),
"execution": execution,
"_eventId": "submit",
"geolocation": ""
}
在网页中对验证码进行点击会更新,这里对验证码地址进行一次 get 请求也相当于用户点击并刷新了验证码,此时的验证码将是最新的。
你可以依次打开登陆页面和验证码页面,此时登录页面与验证码页面的验证码是不同的,但你可以输入验证码页面的内容成功登陆。
3. 【第三次请求】登陆
对目标网址发送 post 请求,实现登陆操作。
post_server = session.post(URL.loginURL, headers=entry_login.request.headers, data=data)
不同网站登陆成功后的页面显示效果并不相同,如我请求的网站显示的类似等待的动态图标(一开始以为没登陆成功),你可以输出 post 登录后的URL是否跳转
post_server.url
🔗 参考链接
python-代码实现全自动带验证码登录post请求
南科大 CAS 单点登录之模拟登录