❇️ 流程
-
进入登录页面 (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 为官网获取的SKhost = 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 单点登录之模拟登录