Files
Casmooc/模拟登录.py

106 lines
6.2 KiB
Python
Raw Normal View History

2026-07-13 16:59:15 +08:00
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
#下载验证码
def download_image(url, save_path):
try:
# 发送HTTP GET请求获取图片
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 使用PIL库打开图片
image = Image.open(BytesIO(response.content))
# 保存图片到指定路径
image.save(save_path)
print(f"Image successfully downloaded and saved to {save_path}")
else:
print(f"Failed to retrieve image. HTTP status code: {response.status_code}")
except Exception as e:
print(f"An error occurred: {e}")
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
#解码后为X-Access-Origin: https://www.casmooc.cn应该是固定字段请求头中必须包含这个值
}
response_code = requests.post(url_code, headers=headers, json=data_code)
if response_code.status_code == 200:
# 解析JSON数据
data = response_code.json()
print(data)
else:
print(f"请求失败,状态码:{response_code.status_code}")
uuid = data['data']['uuid']
captcha_url = data['data']['codeBase64']
print(uuid)
# 去掉前缀 'data:image/jpeg;base64,'
header, encoded = captcha_url.split(',', 1)
# 解码Base64数据
image_data = base64.b64decode(encoded)
# 使用BytesIO将字节数据转换为PIL图像
image = Image.open(BytesIO(image_data))
# 显示图像
#image.show()
# 如果需要保存图像可以使用image.save方法
image.save('Captcha.png')
ocr = ddddocr.DdddOcr()
with open('Captcha.png', 'rb') as f:
img_bytes = f.read()
Captcha_res = ocr.classification(img_bytes)
print(Captcha_res)
#创建一个会话对象
session = requests.session()
# 定义登录URL和验证码URL
login_url = 'https://www.casmooc.cn/server/modules/eosoperator/login'
#captcha_url = 'data:image/jpeg;base64,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'
# 定义登录表单数据
login_data = {
"userID": "dingxr@microsate.com",
"password": "WXWXsstc_2018",
"code": Captcha_res,
"codeUuid": uuid
}
#请求登录接口需要下列请求头
login_headers = {
'x-access-device-type': 'WEB',
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=login_headers)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("登录成功")
print(response_login)
data_login = response_login.json()
print(data_login)
# 获取token
token = data_login['data']['token']
print(token)
else:
print("登录失败")