first commit

This commit is contained in:
lihansani
2026-07-13 16:59:15 +08:00
commit 4a20ced250
55 changed files with 43874 additions and 0 deletions

BIN
Captcha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

1
app.bdf02e73.js Normal file

File diff suppressed because one or more lines are too long

6
base64解码.py Normal file
View File

@@ -0,0 +1,6 @@
import base64
encoded_str = "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UH44UZ966OsfwrpTaJ4W07T3DLLHEDKrMCVdjuYZHGAxIHt61sVotikFFFFMAooooAKKKKACvlnwn4T8R23jLQ55/D+qxQx6hA7yPZyKqKJFJJJHAA719TUUEThzWCiiigsKKKKACiiigAooooA53x3qFpp3gjV2u50hE9rLbxburyOhCqB3JP5AE9Aa8O+E0MsvxH01443dYlmeQqpIRfKZcn0GSB9SPWup1f4Oa5qvie/vvt+nRWl3eyTZ3OzqjOT93aASAemcZ79677wT4C0/wZbSGN/tV/NkS3bJtO3PCqMnaOmeeTyegAxtKUk2jS6SOsooorYzCsrxR/yKWs/9eM//AKLatWorq2hvbSa1uE3wzRtHIuSNykYIyOehoYHnPww0yx1bwPeWuoWsVzC18/yyLnB8tBkHqDgnkciuw0nwhoGh3BuNP02KKY9JGLSMvBHyliSvBOcYz3q3o+h6doFo9rplv5ELyGRl3s2WIAzliT0ArQqYxstRJBRRRVDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9k="
decoded_bytes = base64.b64decode(encoded_str)
decoded_str = decoded_bytes.decode('utf-8')
print(decoded_str)

28
base64验证码识别.py Normal file
View File

@@ -0,0 +1,28 @@
import base64
from PIL import Image
from io import BytesIO
import ddddocr
# 示例Data URI字符串
data_uri = 'data:image/jpeg;base64,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jjCMUH44UZ966OsfwrpTaJ4W07T3DLLHEDKrMCVdjuYZHGAxIHt61sVotikFFFFMAooooAKKKKACvlnwn4T8R23jLQ55/D+qxQx6hA7yPZyKqKJFJJJHAA719TUUEThzWCiiigsKKKKACiiigAooooA53x3qFpp3gjV2u50hE9rLbxburyOhCqB3JP5AE9Aa8O+E0MsvxH01443dYlmeQqpIRfKZcn0GSB9SPWup1f4Oa5qvie/vvt+nRWl3eyTZ3OzqjOT93aASAemcZ79677wT4C0/wZbSGN/tV/NkS3bJtO3PCqMnaOmeeTyegAxtKUk2jS6SOsooorYzCsrxR/yKWs/9eM//AKLatWorq2hvbSa1uE3wzRtHIuSNykYIyOehoYHnPww0yx1bwPeWuoWsVzC18/yyLnB8tBkHqDgnkciuw0nwhoGh3BuNP02KKY9JGLSMvBHyliSvBOcYz3q3o+h6doFo9rplv5ELyGRl3s2WIAzliT0ArQqYxstRJBRRRVDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9k='
# 去掉前缀 'data:image/jpeg;base64,'
header, encoded = data_uri.split(',', 1)
# 解码Base64数据
image_data = base64.b64decode(encoded)
# 使用BytesIO将字节数据转换为PIL图像
image = Image.open(BytesIO(image_data))
# 显示图像
#image.show()
# 如果需要保存图像可以使用image.save方法
image.save('output.jpg')
ocr = ddddocr.DdddOcr()
with open('output.jpg', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)

331
bk.py Normal file
View File

@@ -0,0 +1,331 @@
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
import time
# 全局Session对象
session = requests.session()
#全局变量用户名密码和观看速度
#读取用户信息文件内容
def read_config_file():
global username, password, speed
with open('config.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.startswith('username'):
username = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('password'):
password = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('speed'):
speed = line.split('')[1].strip().replace(" ", "").replace("\n", "")
# 模拟登录
def login():
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
# 请求登录接口需要下列请求头
headers = {
'x-access-device-type': 'WEB',
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
#解码后为X-Access-Origin: https://www.casmooc.cn应该是固定字段请求头中必须包含这个值
}
response_code = requests.post(url_code, headers=headers, json=data_code, timeout=10)
if response_code.status_code == 200:
# 解析JSON数据
data = response_code.json()
#print(data)
else:
data = {}
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)
# 定义登录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": username, #"dingxr@microsate.com"
"password": password, #"WXWXsstc_2018"
"code": Captcha_res,
"codeUuid": uuid
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("----------登录成功----------")
print("等待系统初始化")
time.sleep(4)
data_login = response_login.json()
# 获取token
token = data_login['data']['token']
else:
print("!!!!!!!!登录失败!!!!!!!!")
token = ''
return token
# 获取需要学习的网课列表
def get_class_list(token):
url = 'https://www.casmooc.cn/server/api/course/myList'
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
#获取当前年份
year = str(time.localtime().tm_year)
myList_data = {
"formData": {
"courseName": "",
"isCompleted": 0, # 获取未学完课程
"year": year
},
"pageData": {
"currentPage": 1, # 获取第一页的课程
"pageSize": 20, # 一页有多少课程默认为5
"sortName": "",
"sortOrder": ""
}
}
response_class = session.post(url, json=myList_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否获取成功
if response_class.status_code == 200 and response_class.json()['code'] == '0':
print("获取未学习课程列表成功")
myList = response_class.json()
course_list = myList['data']['list']
#print(course_list)
else:
print("获取未学习课程列表失败")
course_list = []
return course_list
#刷课时
def swipe_class(token, course_list):
# 判断课程是否分节,比如上中下
url_chapter = 'https://www.casmooc.cn/server/api/course/chapter'
# 获取观看锁
url_submitLock = 'https://www.casmooc.cn/server/api/study/submitLock'
# 提交观看记录
url_submit = "https://www.casmooc.cn/server/api/study/submit"
# 确认课程id
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
def submit_and_detail(belongCourseId, courseId, studyLockUUID):
#此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30 / float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": belongCourseId,
"courseId": courseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
data_detail = {
"id": courseId
}
#提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=10)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
#当前进度信息
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=10)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("该课程已学习时长(秒)")
print(data['data']['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data']['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
return False
else:
return True
else:
print(f"请求失败,状态码:{response_detail.status_code}")
return True
for course in course_list:
# 刷完一个网课休息一分钟
print('一分钟后开始学习')
time.sleep(60)
courseId = course['courseId']
courseName = course['courseName']
data_chapter = {
"chapterName": "",
"firstCourseId": courseId
}
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=10)
#判断视频是否分节, 访问url_chapter若不为空则分节
if response_chapter.json()['data'] != []:
print('该课程需分节学习')
childList_flag = 0 # 用于标记是第几个分节视频
for course_data in response_chapter.json()['data']:
print("正在学习:", course_data['childList'][0]['secondCourseName'])
secondCourseId = course_data['childList'][0]['secondCourseId'] # 分节后的课程ID
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": courseId, # 此处为视频ID 若不分节,此处为空
"courseId": secondCourseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", #文档类学习为courseView
"lockIndex": lockIndex, #由播放时的毫秒级时间戳组成
"is1Lock": 1 #文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
#开始刷课, Flag判断是否学习完学习完为False
Flag = True
while Flag:
# 此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30/float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": courseId,
"courseId": secondCourseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
# 提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=10)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
# 当前进度信息
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=10)
if response_chapter.status_code == 200:
# 解析JSON数据
data = response_chapter.json()
print("该课程分节已学习时长(秒)")
print(data['data'][childList_flag]['childList'][0]['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data'][childList_flag]['childList'][0]['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
childList_flag += 1 #data列表索引后移
break
else:
continue
else:
print(f"请求失败,状态码:{response_chapter.status_code}")
else:
print('正在学习:', courseName)
data_detail = {
"id": courseId
}
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=10)
#判断课程是否属于电子阅读类
if response_detail.status_code == 200:
# 解析JSON数据
enterUrl = response_detail.json()['data']['enterUrl']
#如果是文档
if enterUrl.endswith('.pdf'):
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"source": "courseView", # 文档类学习为courseView
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
#如果是视频
else:
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", # 文档类学习为courseView
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"is1Lock": 1 # 文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
else:
print(f"请求失败,状态码:{response_detail.status_code}")
print('无法判断,学习下一个课程')
continue
if __name__ == '__main__':
# 读取文件并设置全局变量
read_config_file()
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"播放速度: {speed}倍速")
#模拟登录获取token
token = login()
if token != '':
#获取课程列表
course_list = get_class_list(token)
swipe_class(token, course_list)
else:
print('模拟登录失败,请检查用户名密码是否正确')

6
config.txt Normal file
View File

@@ -0,0 +1,6 @@
#用户名
usernamedingxr@microsate.com
#密码
passwordWXWXsstc_2018
#播放速度可选1、1.5、2、3倍速默认为1倍速、
speed1.5

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

37
headers处理.py Normal file
View File

@@ -0,0 +1,37 @@
# 将给定的HTTP请求头信息转为字典格式的headers
http_headers = """
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Content-Length: 22
Content-Type: application/json;charset=UTF-8
Cookie: SECKEY_ABVK=4xWRKdQvkKXaHdjRs0UoD0K4ye/ZDQGqa2YKVYXgJPk%3D; BMAP_SECKEY=2Sq_06ybvD0Wg-a66PwUio1MexnVk5iBqvZXLfylc3j_niIBT39XTp3vYGWHni2NENVtAgJ7EH_NmpRApABDKdJ1a8ueb_LOkI4DREjJQxZScW04rt6ewG9S6X8ySagoNhWgECBq6U8xqRKMfPf-e5PopnflJf-Kuoc97MeNbK8wXTA31ebgzl5ISEIQ9ubj
Host: www.casmooc.cn
Origin: https://www.casmooc.cn
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0
sec-ch-ua: "Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
x-access-browser-info: chrome 125.0.0.0
x-access-device-mac:
x-access-device-name:
x-access-device-system: Win10
x-access-device-type: WEB
x-access-location-info:
x-access-origin: aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==
x-access-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MTg5MzU1MjIsIm9wZXJhdG9ySWQiOiIxMTA0OTI5OTg0In0.pKm0OjJJt8m8g-ft5ONIdRGW0O3yETAeaJ9HT6dTinA
"""
def parse_headers(header_str):
headers = {}
for line in header_str.strip().split("\n"):
key, value = line.split(":", 1)
headers[key.strip()] = value.strip()
return headers
headers_dict = parse_headers(http_headers)
print(headers_dict)

BIN
output.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

324
刷网课脚本.py Normal file
View File

@@ -0,0 +1,324 @@
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
import time
# 全局Session对象
session = requests.session()
#全局变量用户名密码和观看速度
#读取用户信息文件内容
def read_config_file():
global username, password, speed
with open('config.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.startswith('username'):
username = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('password'):
password = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('speed'):
speed = line.split('')[1].strip().replace(" ", "").replace("\n", "")
# 模拟登录
def login():
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
# 请求登录接口需要下列请求头
headers = {
'x-access-device-type': 'WEB',
'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:
data = {}
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)
# 定义登录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": username, #"dingxr@microsate.com"
"password": password, #"WXWXsstc_2018"
"code": Captcha_res,
"codeUuid": uuid
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=headers)
time.sleep(1)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("登录成功")
print("等待系统初始化")
time.sleep(1)
data_login = response_login.json()
# 获取token
token = data_login['data']['token']
else:
print("登录失败")
token = ''
return token
# 获取需要学习的网课列表
def get_class_list(token):
url = 'https://www.casmooc.cn/server/api/course/myList'
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
#获取当前年份
year = str(time.localtime().tm_year)
myList_data = {
"formData": {
"courseName": "",
"isCompleted": 0, # 获取未学完课程
"year": year
},
"pageData": {
"currentPage": 1, # 获取第一页的课程
"pageSize": 20, # 一页有多少课程默认为5
"sortName": "",
"sortOrder": ""
}
}
response_class = session.post(url, json=myList_data, headers=headers)
time.sleep(4)
# 检查是否获取成功
if response_class.status_code == 200 and response_class.json()['code'] == '0':
print("获取未学习课程列表成功")
myList = response_class.json()
course_list = myList['data']['list']
#print(course_list)
else:
print("获取未学习课程列表失败")
course_list = []
return course_list
#刷课时
def swipe_class(token, course_list):
# 判断课程是否分节,比如上中下
url_chapter = 'https://www.casmooc.cn/server/api/course/chapter'
# 获取观看锁
url_submitLock = 'https://www.casmooc.cn/server/api/study/submitLock'
# 提交观看记录
url_submit = "https://www.casmooc.cn/server/api/study/submit"
# 确认课程id
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
def submit_and_detail(belongCourseId, courseId, studyLockUUID):
#此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
time.sleep(10)
data_submit = {
"belongCourseId": belongCourseId,
"courseId": courseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
data_detail = {
"id": courseId
}
#提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit)
if response_submit.status_code == 200:
# 解析JSON数据
data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
#当前进度信息
response_detail = session.post(url_detail, headers=headers, json=data_detail)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("该课程已学习时长(秒)")
print(data['data']['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data']['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
return False
else:
return True
else:
print(f"请求失败,状态码:{response_detail.status_code}")
return True
for course in course_list:
courseId = course['courseId']
courseName = course['courseName']
data_chapter = {
"chapterName": "",
"firstCourseId": courseId
}
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter)
#判断视频是否分节, 访问url_chapter若不为空则分节
if response_chapter.json()['data'] != []:
print('该课程需分节学习')
#print(response_chapter.json()['data'])
childList_flag = 0
for course_data in response_chapter.json()['data']:
print("正在学习:", course_data['childList'][0]['secondCourseName'])
secondCourseId = course_data['childList'][0]['secondCourseId'] # 分节后的课程ID
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": courseId, # 此处为视频ID 若不分节,此处为空
"courseId": secondCourseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", #文档类学习为courseView
"lockIndex": lockIndex, #由播放时的毫秒级时间戳组成
"is1Lock": 1 #文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
#开始刷课, Flag判断是否学习完学习完为False
Flag = True
while Flag:
# 此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30/float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": courseId,
"courseId": secondCourseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
# 提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit)
if response_submit.status_code == 200:
# 解析JSON数据
data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
# 当前进度信息
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter)
if response_chapter.status_code == 200:
# 解析JSON数据
data = response_chapter.json()
print("该课程分节已学习时长(秒)")
print(data['data'][childList_flag]['childList'][0]['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data'][childList_flag]['childList'][0]['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
childList_flag += 1 #data列表索引后移
break
else:
continue
else:
print(f"请求失败,状态码:{response_chapter.status_code}")
else:
print('正在学习:', courseName)
data_detail = {
"id": courseId
}
response_detail = session.post(url_detail, headers=headers, json=data_detail)
#判断课程是否属于电子阅读类
if response_detail.status_code == 200:
# 解析JSON数据
enterUrl = response_detail.json()['data']['enterUrl']
#如果是文档
if enterUrl.endswith('.pdf'):
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"source": "courseView", # 文档类学习为courseView
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
#如果是视频
else:
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", # 文档类学习为courseView
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"is1Lock": 1 # 文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
else:
print(f"请求失败,状态码:{response_detail.status_code}")
print('无法判断,学习下一个课程')
continue
if __name__ == '__main__':
# 读取文件并设置全局变量
read_config_file()
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"播放速度: {speed}倍速")
#模拟登录获取token
token = login()
if token != '':
#获取课程列表
course_list = get_class_list(token)
swipe_class(token, course_list)
else:
print('模拟登录失败,请检查用户名密码是否正确')

4
打包.txt Normal file
View File

@@ -0,0 +1,4 @@
pyinstaller -F -w -i favicon.ico bk.py
pyinstaller -F --console xx.py

BIN
最终版打包/Captcha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

336
最终版打包/casmooc.py Normal file
View File

@@ -0,0 +1,336 @@
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
import time
# 全局Session对象
session = requests.session()
#全局变量用户名密码和观看速度
#读取用户信息文件内容
def read_config_file():
global username, password, speed
with open('config.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.startswith('username'):
username = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('password'):
password = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('speed'):
speed = line.split('')[1].strip().replace(" ", "").replace("\n", "")
# 模拟登录
def login():
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
# 请求登录接口需要下列请求头
headers = {
'x-access-device-type': 'WEB',
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
#解码后为X-Access-Origin: https://www.casmooc.cn应该是固定字段请求头中必须包含这个值
}
response_code = requests.post(url_code, headers=headers, json=data_code, timeout=10)
if response_code.status_code == 200:
# 解析JSON数据
data = response_code.json()
#print(data)
else:
data = {}
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)
# 定义登录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": username, #"dingxr@microsate.com"
"password": password, #"WXWXsstc_2018"
"code": Captcha_res,
"codeUuid": uuid
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("----------登录成功----------")
print("等待系统初始化")
time.sleep(4)
data_login = response_login.json()
# 获取token
token = data_login['data']['token']
else:
print("!!!!!!!!登录失败!!!!!!!!")
token = ''
return token
# 获取需要学习的网课列表
def get_class_list(token):
url = 'https://www.casmooc.cn/server/api/course/myList'
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
#获取当前年份
year = str(time.localtime().tm_year)
myList_data = {
"formData": {
"courseName": "",
"isCompleted": 0, # 获取未学完课程
"year": year
},
"pageData": {
"currentPage": 1, # 获取第一页的课程
"pageSize": 20, # 一页有多少课程默认为5
"sortName": "",
"sortOrder": ""
}
}
response_class = session.post(url, json=myList_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否获取成功
if response_class.status_code == 200 and response_class.json()['code'] == '0':
print("获取未学习课程列表成功")
myList = response_class.json()
course_list = myList['data']['list']
#print(course_list)
else:
print("获取未学习课程列表失败")
course_list = []
return course_list
#刷课时
def swipe_class(token, course_list):
# 判断课程是否分节,比如上中下
url_chapter = 'https://www.casmooc.cn/server/api/course/chapter'
# 获取观看锁
url_submitLock = 'https://www.casmooc.cn/server/api/study/submitLock'
# 提交观看记录
url_submit = "https://www.casmooc.cn/server/api/study/submit"
# 确认课程id
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
def submit_and_detail(belongCourseId, courseId, studyLockUUID):
#此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30 / float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": belongCourseId,
"courseId": courseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
data_detail = {
"id": courseId
}
#提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=10)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
#当前进度信息
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=10)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("该课程已学习时长(秒)")
print(data['data']['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data']['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
return False
else:
return True
else:
print(f"请求失败,状态码:{response_detail.status_code}")
return True
for course in course_list:
# 刷完一个网课休息一分钟
print('一分钟后开始学习')
time.sleep(60)
courseId = course['courseId']
courseName = course['courseName']
data_chapter = {
"chapterName": "",
"firstCourseId": courseId
}
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=10)
#判断视频是否分节, 访问url_chapter若不为空则分节
if response_chapter.json()['data'] != []:
print('该课程需分节学习')
childList_flag = 0 # 用于标记是第几个分节视频
for course_data in response_chapter.json()['data']:
print("正在学习:", course_data['childList'][0]['secondCourseName'])
secondCourseId = course_data['childList'][0]['secondCourseId'] # 分节后的课程ID
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": courseId, # 此处为视频ID 若不分节,此处为空
"courseId": secondCourseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", #文档类学习为courseView
"lockIndex": lockIndex, #由播放时的毫秒级时间戳组成
"is1Lock": 1 #文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
#开始刷课, Flag判断是否学习完学习完为False
Flag = True
while Flag:
# 此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30/float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": courseId,
"courseId": secondCourseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
# 提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=10)
if response_submit.status_code == 200:
# 解析JSON数据
pass
# data = response_submit.json()
# print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
# 当前进度信息
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=10)
if response_chapter.status_code == 200:
# 解析JSON数据
data = response_chapter.json()
# 获取当前时间戳
current_time = time.localtime()
# 格式化时间
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
# 打印时间
print("该课程分节已学习时长(秒) 当前时间:", formatted_time)
print(data['data'][childList_flag]['childList'][0]['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data'][childList_flag]['childList'][0]['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
childList_flag += 1 #data列表索引后移
break
else:
continue
else:
print(f"请求失败,状态码:{response_chapter.status_code}")
else:
print('正在学习:', courseName)
data_detail = {
"id": courseId
}
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=10)
#判断课程是否属于电子阅读类
if response_detail.status_code == 200:
# 解析JSON数据
enterUrl = response_detail.json()['data']['enterUrl']
#如果是文档
if enterUrl.endswith('.pdf'):
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"source": "courseView", # 文档类学习为courseView
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
#如果是视频
else:
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", # 文档类学习为courseView
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"is1Lock": 1 # 文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=10)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
else:
print(f"请求失败,状态码:{response_detail.status_code}")
print('无法判断,学习下一个课程')
continue
if __name__ == '__main__':
# 读取文件并设置全局变量
read_config_file()
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"播放速度: {speed}倍速")
#模拟登录获取token
token = login()
if token != '':
#获取课程列表
course_list = get_class_list(token)
swipe_class(token, course_list)
else:
print('模拟登录失败,请检查用户名密码是否正确')

View File

@@ -0,0 +1,39 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['casmooc.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='casmooc',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['favicon.ico'],
)

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#用户名
usernamedingxr@microsate.com
#密码
passwordWXWXsstc_2018
#学习速度可选1、1.5、2、3倍速默认为1倍速。3倍速下学习1分钟学习进度会增加3分钟。
speed1

BIN
最终版打包/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,15 @@
!!!!!!!!首先在继续教育网选择自己需要学习的课程(视频和文档类课程均可选)
选择完后退出网页。!!!!!!!!
在config.txt中填写用户名和密码
双击运行casmooc.exe
在弹出窗口中会显示课程学习进度一倍速下每学习30秒会更新一次进度
!!!!!!!!!!!!!!!!!
程序运行期间不可在其他地方登录,否则程序无法正常运行。
若窗口闪退请检查用户名和密码是否正确,检查网络环境是否正常。
若学习进度长时间未更新,请检查网络情况。
!!!!!!!!!!!!!!!!!

View File

@@ -0,0 +1,9 @@
使用pyinstaller
1.正常打包
pyinstaller -F -i favicon.ico --console casmooc.py
2.修改当前目录下的xx.spec文件
记事本打开xx.spec并将datas=[]改为datas=[('./common_old.onnx','ddddocr')]
3.用listary或其他文件搜索软件找到common_old.onnx并将其复制到当前文件目录下
common_old.onnx在C:\python\Lib\site-packages\ddddocr下项目所在python环境中
4.执行以下代码
pyinstaller .\casmooc.spec

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,436 @@
('E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\dist\\casmooc.exe',
True,
False,
False,
['E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\favicon.ico'],
None,
False,
False,
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
True,
False,
None,
None,
None,
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\casmooc.pkg',
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\PYZ-00.pyz',
'PYZ'),
('struct',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod03_ctypes.pyc',
'PYMODULE'),
('pyimod04_pywin32',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod04_pywin32.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'C:\\python\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_inspect',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgres',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgres.py',
'PYSOURCE'),
('pyi_rth_cryptography_openssl',
'C:\\python\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\rthooks\\pyi_rth_cryptography_openssl.py',
'PYSOURCE'),
('casmooc',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\casmooc.py',
'PYSOURCE'),
('python39.dll', 'C:\\python\\python39.dll', 'BINARY'),
('cv2\\opencv_videoio_ffmpeg4100_64.dll',
'C:\\python\\lib\\site-packages\\cv2\\opencv_videoio_ffmpeg4100_64.dll',
'BINARY'),
('libopenblas64__v0.3.21-gcc_10_3_0.dll',
'C:\\python\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'BINARY'),
('select.pyd', 'C:\\python\\DLLs\\select.pyd', 'EXTENSION'),
('_lzma.pyd', 'C:\\python\\DLLs\\_lzma.pyd', 'EXTENSION'),
('_bz2.pyd', 'C:\\python\\DLLs\\_bz2.pyd', 'EXTENSION'),
('unicodedata.pyd', 'C:\\python\\DLLs\\unicodedata.pyd', 'EXTENSION'),
('_socket.pyd', 'C:\\python\\DLLs\\_socket.pyd', 'EXTENSION'),
('_decimal.pyd', 'C:\\python\\DLLs\\_decimal.pyd', 'EXTENSION'),
('_hashlib.pyd', 'C:\\python\\DLLs\\_hashlib.pyd', 'EXTENSION'),
('_ctypes.pyd', 'C:\\python\\DLLs\\_ctypes.pyd', 'EXTENSION'),
('_queue.pyd', 'C:\\python\\DLLs\\_queue.pyd', 'EXTENSION'),
('_ssl.pyd', 'C:\\python\\DLLs\\_ssl.pyd', 'EXTENSION'),
('pyexpat.pyd', 'C:\\python\\DLLs\\pyexpat.pyd', 'EXTENSION'),
('win32\\win32api.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32api.pyd',
'EXTENSION'),
('win32\\win32evtlog.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32evtlog.pyd',
'EXTENSION'),
('_multiprocessing.pyd',
'C:\\python\\DLLs\\_multiprocessing.pyd',
'EXTENSION'),
('_overlapped.pyd', 'C:\\python\\DLLs\\_overlapped.pyd', 'EXTENSION'),
('_asyncio.pyd', 'C:\\python\\DLLs\\_asyncio.pyd', 'EXTENSION'),
('cv2\\cv2.pyd', 'C:\\python\\lib\\site-packages\\cv2\\cv2.pyd', 'EXTENSION'),
('numpy\\core\\_multiarray_umath.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\core\\_multiarray_umath.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\core\\_multiarray_tests.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\core\\_multiarray_tests.cp39-win_amd64.pyd',
'EXTENSION'),
('psutil\\_psutil_windows.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\psutil\\_psutil_windows.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\linalg\\_umath_linalg.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp39-win_amd64.pyd',
'EXTENSION'),
('win32\\win32pdh.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32pdh.pyd',
'EXTENSION'),
('numpy\\linalg\\lapack_lite.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\linalg\\lapack_lite.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\mtrand.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\mtrand.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_sfc64.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_sfc64.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_philox.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_philox.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_pcg64.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_pcg64.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_mt19937.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_mt19937.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\bit_generator.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\bit_generator.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_generator.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_generator.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_bounded_integers.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_bounded_integers.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_common.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_common.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\fft\\_pocketfft_internal.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\fft\\_pocketfft_internal.cp39-win_amd64.pyd',
'EXTENSION'),
('onnxruntime\\capi\\onnxruntime_pybind11_state.pyd',
'C:\\python\\lib\\site-packages\\onnxruntime\\capi\\onnxruntime_pybind11_state.pyd',
'EXTENSION'),
('PIL\\_webp.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_webp.cp39-win_amd64.pyd',
'EXTENSION'),
('PIL\\_imagingtk.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_imagingtk.cp39-win_amd64.pyd',
'EXTENSION'),
('_cffi_backend.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\_cffi_backend.cp39-win_amd64.pyd',
'EXTENSION'),
('PIL\\_imaging.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_imaging.cp39-win_amd64.pyd',
'EXTENSION'),
('_elementtree.pyd', 'C:\\python\\DLLs\\_elementtree.pyd', 'EXTENSION'),
('simplejson\\_speedups.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\simplejson\\_speedups.cp39-win_amd64.pyd',
'EXTENSION'),
('cryptography\\hazmat\\bindings\\_openssl.pyd',
'C:\\python\\lib\\site-packages\\cryptography\\hazmat\\bindings\\_openssl.pyd',
'EXTENSION'),
('cryptography\\hazmat\\bindings\\_rust.pyd',
'C:\\python\\lib\\site-packages\\cryptography\\hazmat\\bindings\\_rust.pyd',
'EXTENSION'),
('api-ms-win-crt-convert-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-convert-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-heap-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-stdio-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-stdio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-filesystem-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-filesystem-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-runtime-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-runtime-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-environment-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-environment-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-string-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-math-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-math-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-locale-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-locale-l1-1-0.dll',
'BINARY'),
('VCRUNTIME140.dll', 'C:\\python\\VCRUNTIME140.dll', 'BINARY'),
('api-ms-win-crt-process-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-process-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-conio-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-conio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-time-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-time-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-private-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-private-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-utility-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-utility-l1-1-0.dll',
'BINARY'),
('libcrypto-1_1.dll', 'C:\\python\\DLLs\\libcrypto-1_1.dll', 'BINARY'),
('libffi-7.dll', 'C:\\python\\DLLs\\libffi-7.dll', 'BINARY'),
('libssl-1_1.dll', 'C:\\python\\DLLs\\libssl-1_1.dll', 'BINARY'),
('pywin32_system32\\pywintypes39.dll',
'C:\\python\\lib\\site-packages\\pywin32_system32\\pywintypes39.dll',
'BINARY'),
('python3.dll', 'C:\\python\\python3.dll', 'BINARY'),
('numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'C:\\python\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'BINARY'),
('VCRUNTIME140_1.dll', 'C:\\python\\VCRUNTIME140_1.dll', 'BINARY'),
('MSVCP140.dll', 'C:\\WINDOWS\\system32\\MSVCP140.dll', 'BINARY'),
('MSVCP140_1.dll', 'C:\\WINDOWS\\system32\\MSVCP140_1.dll', 'BINARY'),
('PIL\\VCRUNTIME140.dll',
'C:\\python\\lib\\site-packages\\PIL\\VCRUNTIME140.dll',
'BINARY'),
('PIL\\MSVCP140.dll',
'C:\\python\\lib\\site-packages\\PIL\\MSVCP140.dll',
'BINARY'),
('PIL\\VCRUNTIME140_1.dll',
'C:\\python\\lib\\site-packages\\PIL\\VCRUNTIME140_1.dll',
'BINARY'),
('ucrtbase.dll', 'C:\\WINDOWS\\system32\\ucrtbase.dll', 'BINARY'),
('api-ms-win-core-util-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-util-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-debug-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-debug-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-heap-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-profile-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-profile-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-namedpipe-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-namedpipe-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-datetime-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-datetime-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-errorhandling-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-errorhandling-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processthreads-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-memory-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-memory-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-synch-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-handle-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-handle-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-synch-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-localization-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-localization-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-rtlsupport-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-rtlsupport-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l2-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l2-1-0.dll',
'BINARY'),
('api-ms-win-core-console-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-console-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-timezone-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-timezone-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-libraryloader-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-libraryloader-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-1.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processthreads-l1-1-1.dll',
'BINARY'),
('api-ms-win-core-string-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-sysinfo-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-sysinfo-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processenvironment-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processenvironment-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-interlocked-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-interlocked-l1-1-0.dll',
'BINARY'),
('ddddocr\\common_old.onnx',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\common_old.onnx',
'DATA'),
('base_library.zip',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\base_library.zip',
'DATA'),
('cv2\\config-3.py',
'C:\\python\\lib\\site-packages\\cv2\\config-3.py',
'DATA'),
('cv2\\load_config_py3.py',
'C:\\python\\lib\\site-packages\\cv2\\load_config_py3.py',
'DATA'),
('cv2\\config.py', 'C:\\python\\lib\\site-packages\\cv2\\config.py', 'DATA'),
('importlib_metadata-4.11.3.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\RECORD',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\INSTALLER',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\WHEEL',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\LICENSE',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\LICENSE',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\METADATA',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\top_level.txt',
'DATA'),
('certifi\\cacert.pem',
'C:\\python\\lib\\site-packages\\certifi\\cacert.pem',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.BSD',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.BSD',
'DATA'),
('cryptography-36.0.2.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\INSTALLER',
'DATA'),
('cryptography-36.0.2.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\RECORD',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE',
'DATA'),
('cryptography-36.0.2.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\top_level.txt',
'DATA'),
('cryptography-36.0.2.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\WHEEL',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.PSF',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.PSF',
'DATA'),
('cryptography-36.0.2.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\METADATA',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.APACHE',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.APACHE',
'DATA'),
('wheel-0.37.1.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\RECORD',
'DATA'),
('wheel-0.37.1.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\top_level.txt',
'DATA'),
('wheel-0.37.1.dist-info\\LICENSE.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\LICENSE.txt',
'DATA'),
('wheel-0.37.1.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\METADATA',
'DATA'),
('wheel-0.37.1.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\WHEEL',
'DATA'),
('wheel-0.37.1.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\INSTALLER',
'DATA'),
('wheel-0.37.1.dist-info\\entry_points.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\entry_points.txt',
'DATA'),
('cv2\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\__init__.py',
'DATA'),
('cv2\\version.py',
'C:\\python\\lib\\site-packages\\cv2\\version.py',
'DATA'),
('cv2\\utils\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\utils\\__init__.py',
'DATA'),
('cv2\\typing\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\typing\\__init__.py',
'DATA'),
('cv2\\misc\\version.py',
'C:\\python\\lib\\site-packages\\cv2\\misc\\version.py',
'DATA'),
('cv2\\misc\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\misc\\__init__.py',
'DATA'),
('cv2\\mat_wrapper\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\mat_wrapper\\__init__.py',
'DATA'),
('cv2\\gapi\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\gapi\\__init__.py',
'DATA'),
('cv2\\data\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\data\\__init__.py',
'DATA')],
[],
False,
False,
1766625985,
[('run.exe',
'C:\\python\\lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
'EXECUTABLE')],
'C:\\python\\python39.dll')

View File

@@ -0,0 +1,414 @@
('E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\casmooc.pkg',
{'BINARY': True,
'DATA': True,
'EXECUTABLE': True,
'EXTENSION': True,
'PYMODULE': True,
'PYSOURCE': True,
'PYZ': False,
'SPLASH': True,
'SYMLINK': False},
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\PYZ-00.pyz',
'PYZ'),
('struct',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod03_ctypes.pyc',
'PYMODULE'),
('pyimod04_pywin32',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\localpycs\\pyimod04_pywin32.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'C:\\python\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_inspect',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgres',
'C:\\python\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgres.py',
'PYSOURCE'),
('pyi_rth_cryptography_openssl',
'C:\\python\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\rthooks\\pyi_rth_cryptography_openssl.py',
'PYSOURCE'),
('casmooc',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\casmooc.py',
'PYSOURCE'),
('python39.dll', 'C:\\python\\python39.dll', 'BINARY'),
('cv2\\opencv_videoio_ffmpeg4100_64.dll',
'C:\\python\\lib\\site-packages\\cv2\\opencv_videoio_ffmpeg4100_64.dll',
'BINARY'),
('libopenblas64__v0.3.21-gcc_10_3_0.dll',
'C:\\python\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'BINARY'),
('select.pyd', 'C:\\python\\DLLs\\select.pyd', 'EXTENSION'),
('_lzma.pyd', 'C:\\python\\DLLs\\_lzma.pyd', 'EXTENSION'),
('_bz2.pyd', 'C:\\python\\DLLs\\_bz2.pyd', 'EXTENSION'),
('unicodedata.pyd', 'C:\\python\\DLLs\\unicodedata.pyd', 'EXTENSION'),
('_socket.pyd', 'C:\\python\\DLLs\\_socket.pyd', 'EXTENSION'),
('_decimal.pyd', 'C:\\python\\DLLs\\_decimal.pyd', 'EXTENSION'),
('_hashlib.pyd', 'C:\\python\\DLLs\\_hashlib.pyd', 'EXTENSION'),
('_ctypes.pyd', 'C:\\python\\DLLs\\_ctypes.pyd', 'EXTENSION'),
('_queue.pyd', 'C:\\python\\DLLs\\_queue.pyd', 'EXTENSION'),
('_ssl.pyd', 'C:\\python\\DLLs\\_ssl.pyd', 'EXTENSION'),
('pyexpat.pyd', 'C:\\python\\DLLs\\pyexpat.pyd', 'EXTENSION'),
('win32\\win32api.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32api.pyd',
'EXTENSION'),
('win32\\win32evtlog.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32evtlog.pyd',
'EXTENSION'),
('_multiprocessing.pyd',
'C:\\python\\DLLs\\_multiprocessing.pyd',
'EXTENSION'),
('_overlapped.pyd', 'C:\\python\\DLLs\\_overlapped.pyd', 'EXTENSION'),
('_asyncio.pyd', 'C:\\python\\DLLs\\_asyncio.pyd', 'EXTENSION'),
('cv2\\cv2.pyd', 'C:\\python\\lib\\site-packages\\cv2\\cv2.pyd', 'EXTENSION'),
('numpy\\core\\_multiarray_umath.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\core\\_multiarray_umath.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\core\\_multiarray_tests.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\core\\_multiarray_tests.cp39-win_amd64.pyd',
'EXTENSION'),
('psutil\\_psutil_windows.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\psutil\\_psutil_windows.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\linalg\\_umath_linalg.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp39-win_amd64.pyd',
'EXTENSION'),
('win32\\win32pdh.pyd',
'C:\\python\\lib\\site-packages\\win32\\win32pdh.pyd',
'EXTENSION'),
('numpy\\linalg\\lapack_lite.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\linalg\\lapack_lite.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\mtrand.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\mtrand.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_sfc64.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_sfc64.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_philox.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_philox.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_pcg64.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_pcg64.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_mt19937.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_mt19937.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\bit_generator.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\bit_generator.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_generator.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_generator.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_bounded_integers.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_bounded_integers.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\random\\_common.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\random\\_common.cp39-win_amd64.pyd',
'EXTENSION'),
('numpy\\fft\\_pocketfft_internal.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\numpy\\fft\\_pocketfft_internal.cp39-win_amd64.pyd',
'EXTENSION'),
('onnxruntime\\capi\\onnxruntime_pybind11_state.pyd',
'C:\\python\\lib\\site-packages\\onnxruntime\\capi\\onnxruntime_pybind11_state.pyd',
'EXTENSION'),
('PIL\\_webp.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_webp.cp39-win_amd64.pyd',
'EXTENSION'),
('PIL\\_imagingtk.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_imagingtk.cp39-win_amd64.pyd',
'EXTENSION'),
('_cffi_backend.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\_cffi_backend.cp39-win_amd64.pyd',
'EXTENSION'),
('PIL\\_imaging.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\PIL\\_imaging.cp39-win_amd64.pyd',
'EXTENSION'),
('_elementtree.pyd', 'C:\\python\\DLLs\\_elementtree.pyd', 'EXTENSION'),
('simplejson\\_speedups.cp39-win_amd64.pyd',
'C:\\python\\lib\\site-packages\\simplejson\\_speedups.cp39-win_amd64.pyd',
'EXTENSION'),
('cryptography\\hazmat\\bindings\\_openssl.pyd',
'C:\\python\\lib\\site-packages\\cryptography\\hazmat\\bindings\\_openssl.pyd',
'EXTENSION'),
('cryptography\\hazmat\\bindings\\_rust.pyd',
'C:\\python\\lib\\site-packages\\cryptography\\hazmat\\bindings\\_rust.pyd',
'EXTENSION'),
('api-ms-win-crt-convert-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-convert-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-heap-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-stdio-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-stdio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-filesystem-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-filesystem-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-runtime-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-runtime-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-environment-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-environment-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-string-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-math-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-math-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-locale-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-locale-l1-1-0.dll',
'BINARY'),
('VCRUNTIME140.dll', 'C:\\python\\VCRUNTIME140.dll', 'BINARY'),
('api-ms-win-crt-process-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-process-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-conio-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-conio-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-time-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-time-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-private-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-private-l1-1-0.dll',
'BINARY'),
('api-ms-win-crt-utility-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-crt-utility-l1-1-0.dll',
'BINARY'),
('libcrypto-1_1.dll', 'C:\\python\\DLLs\\libcrypto-1_1.dll', 'BINARY'),
('libffi-7.dll', 'C:\\python\\DLLs\\libffi-7.dll', 'BINARY'),
('libssl-1_1.dll', 'C:\\python\\DLLs\\libssl-1_1.dll', 'BINARY'),
('pywin32_system32\\pywintypes39.dll',
'C:\\python\\lib\\site-packages\\pywin32_system32\\pywintypes39.dll',
'BINARY'),
('python3.dll', 'C:\\python\\python3.dll', 'BINARY'),
('numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'C:\\python\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll',
'BINARY'),
('VCRUNTIME140_1.dll', 'C:\\python\\VCRUNTIME140_1.dll', 'BINARY'),
('MSVCP140.dll', 'C:\\WINDOWS\\system32\\MSVCP140.dll', 'BINARY'),
('MSVCP140_1.dll', 'C:\\WINDOWS\\system32\\MSVCP140_1.dll', 'BINARY'),
('PIL\\VCRUNTIME140.dll',
'C:\\python\\lib\\site-packages\\PIL\\VCRUNTIME140.dll',
'BINARY'),
('PIL\\MSVCP140.dll',
'C:\\python\\lib\\site-packages\\PIL\\MSVCP140.dll',
'BINARY'),
('PIL\\VCRUNTIME140_1.dll',
'C:\\python\\lib\\site-packages\\PIL\\VCRUNTIME140_1.dll',
'BINARY'),
('ucrtbase.dll', 'C:\\WINDOWS\\system32\\ucrtbase.dll', 'BINARY'),
('api-ms-win-core-util-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-util-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-debug-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-debug-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-heap-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-heap-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-profile-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-profile-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-namedpipe-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-namedpipe-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-datetime-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-datetime-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-errorhandling-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-errorhandling-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processthreads-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-memory-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-memory-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-synch-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-handle-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-handle-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-synch-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-synch-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-localization-l1-2-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-localization-l1-2-0.dll',
'BINARY'),
('api-ms-win-core-rtlsupport-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-rtlsupport-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-file-l2-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-file-l2-1-0.dll',
'BINARY'),
('api-ms-win-core-console-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-console-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-timezone-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-timezone-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-libraryloader-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-libraryloader-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processthreads-l1-1-1.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processthreads-l1-1-1.dll',
'BINARY'),
('api-ms-win-core-string-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-string-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-sysinfo-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-sysinfo-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-processenvironment-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-processenvironment-l1-1-0.dll',
'BINARY'),
('api-ms-win-core-interlocked-l1-1-0.dll',
'C:\\WINDOWS\\system32\\api-ms-win-core-interlocked-l1-1-0.dll',
'BINARY'),
('ddddocr\\common_old.onnx',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\common_old.onnx',
'DATA'),
('base_library.zip',
'E:\\projects\\wxwx\\projects_job\\一般需求项目\\中国科学院继续教育网\\最终版打包\\最终版V1.2\\build\\casmooc\\base_library.zip',
'DATA'),
('cv2\\config-3.py',
'C:\\python\\lib\\site-packages\\cv2\\config-3.py',
'DATA'),
('cv2\\load_config_py3.py',
'C:\\python\\lib\\site-packages\\cv2\\load_config_py3.py',
'DATA'),
('cv2\\config.py', 'C:\\python\\lib\\site-packages\\cv2\\config.py', 'DATA'),
('importlib_metadata-4.11.3.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\RECORD',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\INSTALLER',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\WHEEL',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\LICENSE',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\LICENSE',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\METADATA',
'DATA'),
('importlib_metadata-4.11.3.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\importlib_metadata-4.11.3.dist-info\\top_level.txt',
'DATA'),
('certifi\\cacert.pem',
'C:\\python\\lib\\site-packages\\certifi\\cacert.pem',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.BSD',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.BSD',
'DATA'),
('cryptography-36.0.2.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\INSTALLER',
'DATA'),
('cryptography-36.0.2.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\RECORD',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE',
'DATA'),
('cryptography-36.0.2.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\top_level.txt',
'DATA'),
('cryptography-36.0.2.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\WHEEL',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.PSF',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.PSF',
'DATA'),
('cryptography-36.0.2.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\METADATA',
'DATA'),
('cryptography-36.0.2.dist-info\\LICENSE.APACHE',
'C:\\python\\lib\\site-packages\\cryptography-36.0.2.dist-info\\LICENSE.APACHE',
'DATA'),
('wheel-0.37.1.dist-info\\RECORD',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\RECORD',
'DATA'),
('wheel-0.37.1.dist-info\\top_level.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\top_level.txt',
'DATA'),
('wheel-0.37.1.dist-info\\LICENSE.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\LICENSE.txt',
'DATA'),
('wheel-0.37.1.dist-info\\METADATA',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\METADATA',
'DATA'),
('wheel-0.37.1.dist-info\\WHEEL',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\WHEEL',
'DATA'),
('wheel-0.37.1.dist-info\\INSTALLER',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\INSTALLER',
'DATA'),
('wheel-0.37.1.dist-info\\entry_points.txt',
'C:\\python\\lib\\site-packages\\wheel-0.37.1.dist-info\\entry_points.txt',
'DATA'),
('cv2\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\__init__.py',
'DATA'),
('cv2\\version.py',
'C:\\python\\lib\\site-packages\\cv2\\version.py',
'DATA'),
('cv2\\utils\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\utils\\__init__.py',
'DATA'),
('cv2\\typing\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\typing\\__init__.py',
'DATA'),
('cv2\\misc\\version.py',
'C:\\python\\lib\\site-packages\\cv2\\misc\\version.py',
'DATA'),
('cv2\\misc\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\misc\\__init__.py',
'DATA'),
('cv2\\mat_wrapper\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\mat_wrapper\\__init__.py',
'DATA'),
('cv2\\gapi\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\gapi\\__init__.py',
'DATA'),
('cv2\\data\\__init__.py',
'C:\\python\\lib\\site-packages\\cv2\\data\\__init__.py',
'DATA')],
'python39.dll',
False,
False,
False,
[],
None,
None,
None)

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,199 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running your program. Python and
Python 3rd-party packages include a lot of conditional or optional modules. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.
Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named pyimod02_importers - imported by C:\python\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\python\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
missing module named _posixsubprocess - imported by subprocess (optional), multiprocessing.util (delayed)
missing module named grp - imported by shutil (optional), tarfile (optional), pathlib (delayed, optional), subprocess (optional), distutils.archive_util (optional), setuptools._distutils.archive_util (optional)
missing module named pwd - imported by posixpath (delayed, conditional), shutil (optional), tarfile (optional), pathlib (delayed, conditional, optional), subprocess (optional), netrc (delayed, conditional), getpass (delayed), http.server (delayed, optional), webbrowser (delayed), distutils.util (delayed, conditional, optional), distutils.archive_util (optional), psutil (optional), setuptools._distutils.util (delayed, conditional, optional), setuptools._distutils.archive_util (optional)
missing module named org - imported by pickle (optional)
missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional)
missing module named posix - imported by os (conditional, optional), shutil (conditional)
missing module named resource - imported by posix (top-level)
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), pkg_resources._vendor.packaging._manylinux (delayed, optional)
missing module named jnius - imported by pkg_resources._vendor.platformdirs.android (delayed, optional), platformdirs.android (delayed, optional)
missing module named 'pkg_resources.extern.importlib_resources' - imported by pkg_resources._vendor.jaraco.text (optional)
missing module named 'typing.io' - imported by importlib.resources (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named pep517 - imported by importlib.metadata (delayed)
missing module named 'pkg_resources.extern.more_itertools' - imported by pkg_resources._vendor.jaraco.functools (top-level)
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named pkg_resources.extern.platformdirs - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named 'pkg_resources.extern.jaraco' - imported by pkg_resources (top-level), pkg_resources._vendor.jaraco.text (top-level)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named termios - imported by getpass (optional), tty (top-level), psutil._compat (delayed, optional)
missing module named java - imported by xml.sax._exceptions (conditional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional)
missing module named _winreg - imported by platform (delayed, optional)
missing module named 'distutils._log' - imported by setuptools._distutils.command.bdist_dumb (top-level), setuptools._distutils.command.bdist_rpm (top-level), setuptools._distutils.command.build_clib (top-level), setuptools._distutils.command.build_ext (top-level), setuptools._distutils.command.build_py (top-level), setuptools._distutils.command.build_scripts (top-level), setuptools._distutils.command.clean (top-level), setuptools._distutils.command.config (top-level), setuptools._distutils.command.install (top-level), setuptools._distutils.command.install_scripts (top-level), setuptools._distutils.command.register (top-level), setuptools._distutils.command.sdist (top-level)
missing module named usercustomize - imported by site (delayed, optional)
missing module named sitecustomize - imported by site (delayed, optional)
missing module named startup - imported by pyreadline3.keysyms.common (conditional), pyreadline3.keysyms.keysyms (conditional)
missing module named sets - imported by pyreadline3.keysyms.common (optional)
missing module named System - imported by pyreadline3.clipboard.ironpython_clipboard (top-level), pyreadline3.keysyms.ironpython_keysyms (top-level), pyreadline3.console.ironpython_console (top-level), pyreadline3.rlmain (conditional)
missing module named console - imported by pyreadline3.console.ansi (conditional)
missing module named clr - imported by pyreadline3.clipboard.ironpython_clipboard (top-level), pyreadline3.console.ironpython_console (top-level)
missing module named IronPythonConsole - imported by pyreadline3.console.ironpython_console (top-level)
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named 'setuptools.extern.jaraco' - imported by setuptools._reqs (top-level), setuptools._entry_points (top-level), setuptools.command.egg_info (top-level), setuptools._vendor.jaraco.text (top-level)
missing module named setuptools.extern.importlib_resources - imported by setuptools.extern (conditional), setuptools._importlib (conditional), setuptools._vendor.jaraco.text (optional)
missing module named setuptools.extern.tomli - imported by setuptools.extern (delayed), setuptools.config.pyprojecttoml (delayed)
missing module named setuptools.extern.ordered_set - imported by setuptools.extern (top-level), setuptools.dist (top-level)
missing module named setuptools.extern.packaging - imported by setuptools.extern (top-level), setuptools.dist (top-level), setuptools._normalization (top-level), setuptools.command.egg_info (top-level), setuptools.depends (top-level)
missing module named setuptools.extern.importlib_metadata - imported by setuptools.extern (conditional), setuptools._importlib (conditional)
missing module named 'setuptools.extern.more_itertools' - imported by setuptools.dist (top-level), setuptools.config.expand (delayed), setuptools.config.pyprojecttoml (delayed), setuptools._itertools (top-level), setuptools._entry_points (top-level), setuptools.msvc (top-level), setuptools._vendor.jaraco.functools (top-level)
missing module named 'setuptools.extern.packaging.utils' - imported by setuptools.wheel (top-level)
missing module named 'setuptools.extern.packaging.tags' - imported by setuptools.wheel (top-level)
missing module named 'setuptools.extern.packaging.version' - imported by setuptools.config.setupcfg (top-level), setuptools.wheel (top-level)
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
missing module named 'setuptools.extern.packaging.specifiers' - imported by setuptools.config.setupcfg (top-level), setuptools.config._apply_pyprojecttoml (delayed)
missing module named 'setuptools.extern.packaging.markers' - imported by setuptools.config.setupcfg (top-level)
missing module named 'setuptools.extern.packaging.requirements' - imported by setuptools.config.setupcfg (top-level), setuptools._reqs (top-level)
missing module named pickle5 - imported by numpy.compat.py3k (optional)
missing module named numpy.core.integer - imported by numpy.core (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.conjugate - imported by numpy.core (top-level), numpy.fft._pocketfft (top-level)
missing module named dummy_threading - imported by requests.cookies (optional), psutil._compat (optional)
missing module named numpy.lib.imag - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.lib.real - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.lib.iscomplexobj - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.array - imported by numpy (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), numpy.ma.mrecords (top-level)
missing module named numpy.recarray - imported by numpy (top-level), numpy.ma.mrecords (top-level)
missing module named numpy.ndarray - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level)
missing module named numpy.dtype - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.array_api._typing (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level)
missing module named numpy.bool_ - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ma.core (top-level), numpy.ma.mrecords (top-level)
missing module named numpy.expand_dims - imported by numpy (top-level), numpy.ma.core (top-level)
missing module named numpy.iscomplexobj - imported by numpy (top-level), numpy.ma.core (top-level)
missing module named numpy.amin - imported by numpy (top-level), numpy.ma.core (top-level)
missing module named numpy.amax - imported by numpy (top-level), numpy.ma.core (top-level)
missing module named numpy.histogramdd - imported by numpy (delayed), numpy.lib.twodim_base (delayed)
missing module named numpy._typing._ufunc - imported by numpy._typing (conditional)
missing module named numpy.bytes_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.str_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.void - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.object_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.datetime64 - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.timedelta64 - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.number - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.complexfloating - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.floating - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.integer - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ctypeslib (top-level)
missing module named numpy.unsignedinteger - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.generic - imported by numpy (top-level), numpy._typing._array_like (top-level)
missing module named numpy.ufunc - imported by numpy (top-level), numpy._typing (top-level)
missing module named numpy.float64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.float32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.uint64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.uint32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.uint16 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.uint8 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.int64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.int32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.int16 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named numpy.int8 - imported by numpy (top-level), numpy.array_api._typing (top-level)
missing module named _dummy_thread - imported by cffi.lock (conditional, optional), numpy.core.arrayprint (optional)
missing module named numpy.core.ufunc - imported by numpy.core (top-level), numpy.lib.utils (top-level)
missing module named numpy.core.ones - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.hstack - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.atleast_1d - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.atleast_3d - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
missing module named numpy.core.vstack - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
missing module named numpy.core.linspace - imported by numpy.core (top-level), numpy.lib.index_tricks (top-level)
missing module named numpy.core.transpose - imported by numpy.core (top-level), numpy.lib.function_base (top-level)
missing module named numpy.core.result_type - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.float_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.number - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.bool_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.inf - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.array2string - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.signbit - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.isscalar - imported by numpy.core (delayed), numpy.testing._private.utils (delayed), numpy.lib.polynomial (top-level)
missing module named numpy.core.isinf - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
missing module named numpy.core.isnat - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.ndarray - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.lib.utils (top-level)
missing module named numpy.core.array_repr - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.arange - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.float32 - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.iinfo - imported by numpy.core (top-level), numpy.lib.twodim_base (top-level)
missing module named numpy.core.reciprocal - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.sort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.argsort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.sign - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.isnan - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.count_nonzero - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.divide - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.swapaxes - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.matmul - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.object_ - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.asanyarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.intp - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level)
missing module named numpy.core.atleast_2d - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.product - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.amax - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.amin - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.moveaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.geterrobj - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.errstate - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.finfo - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.isfinite - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.sum - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.sqrt - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.multiply - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.add - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.dot - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.core.Inf - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.all - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
missing module named numpy.core.newaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.complexfloating - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.inexact - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.cdouble - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.csingle - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.double - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.single - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.intc - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.empty_like - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
missing module named numpy.core.empty - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.zeros - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
missing module named numpy.core.asarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.utils (top-level), numpy.fft._pocketfft (top-level), numpy.fft.helper (top-level)
missing module named numpy.core.array - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib.polynomial (top-level)
missing module named numpy.eye - imported by numpy (delayed), numpy.core.numeric (delayed)
missing module named onnxruntime.capi.build_and_package_info - imported by onnxruntime.capi.onnxruntime_validation (delayed, conditional, optional)
missing module named 'onnxruntime.training' - imported by onnxruntime.capi.onnxruntime_validation (delayed, optional)
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
missing module named dummy_thread - imported by cffi.lock (conditional, optional)
missing module named thread - imported by cffi.lock (conditional, optional), cffi.cparser (conditional, optional)
missing module named cStringIO - imported by simplejson.compat (conditional, optional), cffi.ffiplatform (optional)
missing module named cPickle - imported by pycparser.ply.yacc (delayed, optional)
missing module named cffi._pycparser - imported by cffi (optional), cffi.cparser (optional)
missing module named xmlrpclib - imported by defusedxml.xmlrpc (conditional)
missing module named UserDict - imported by simplejson.ordered_dict (top-level)
missing module named StringIO - imported by urllib3.packages.six (conditional), simplejson.compat (conditional, optional)
missing module named backports - imported by urllib3.packages.ssl_match_hostname (optional)
runtime module named urllib3.packages.six.moves - imported by http.client (top-level), urllib3.connectionpool (top-level), urllib3.util.response (top-level), 'urllib3.packages.six.moves.urllib' (top-level), urllib3.response (top-level), urllib3.util.queue (top-level)
missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
missing module named Queue - imported by urllib3.util.queue (conditional)
missing module named "'urllib3.packages.six.moves.urllib'.parse" - imported by urllib3.request (top-level), urllib3.poolmanager (top-level)
missing module named win_inet_pton - imported by socks (conditional, optional)
missing module named bcrypt - imported by cryptography.hazmat.primitives.serialization.ssh (optional)
missing module named cryptography.x509.UnsupportedExtension - imported by cryptography.x509 (optional), urllib3.contrib.pyopenssl (optional)
missing module named unicodedata2 - imported by charset_normalizer.utils (optional)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,385 @@
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
import time
# 全局Session对象
session = requests.session()
#全局变量用户名密码和观看速度
#读取用户信息文件内容
def read_config_file():
global username, password, speed
with open('config.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.startswith('username'):
username = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('password'):
password = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('speed'):
speed = line.split('')[1].strip().replace(" ", "").replace("\n", "")
# 模拟登录
def login():
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
# 请求登录接口需要下列请求头
headers = {
'x-access-device-type': 'WEB',
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
#解码后为X-Access-Origin: https://www.casmooc.cn应该是固定字段请求头中必须包含这个值
}
response_code = requests.post(url_code, headers=headers, json=data_code, timeout=10)
if response_code.status_code == 200:
# 解析JSON数据
data = response_code.json()
#print(data)
else:
data = {}
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)
# 定义登录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": username, #"dingxr@microsate.com"
"password": password, #"WXWXsstc_2018"
"code": Captcha_res,
"codeUuid": uuid
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("----------登录成功----------")
print("等待系统初始化")
time.sleep(4)
data_login = response_login.json()
# 获取token
token = data_login['data']['token']
else:
print("!!!!!!!!登录失败!!!!!!!!")
token = ''
return token
# 获取需要学习的网课列表
def get_class_list(token):
url = 'https://www.casmooc.cn/server/api/course/myList'
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
#获取当前年份
year = str(time.localtime().tm_year)
myList_data = {
"formData": {
"courseName": "",
"isCompleted": 0, # 获取未学完课程
"year": year
},
"pageData": {
"currentPage": 1, # 获取第一页的课程
"pageSize": 20, # 一页有多少课程默认为5
"sortName": "",
"sortOrder": ""
}
}
response_class = session.post(url, json=myList_data, headers=headers, timeout=10)
time.sleep(4)
# 检查是否获取成功
if response_class.status_code == 200 and response_class.json()['code'] == '0':
print("获取未学习课程列表成功")
myList = response_class.json()
course_list = myList['data']['list']
#print(course_list)
else:
print("获取未学习课程列表失败")
course_list = []
return course_list
#刷课时
def swipe_class(token, course_list):
try:
# 判断课程是否分节,比如上中下
url_chapter = 'https://www.casmooc.cn/server/api/course/chapter'
# 获取观看锁
url_submitLock = 'https://www.casmooc.cn/server/api/study/submitLock'
# 提交观看记录
url_submit = "https://www.casmooc.cn/server/api/study/submit"
# 确认课程id
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
def submit_and_detail(belongCourseId, courseId, studyLockUUID):
#此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30 / float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": belongCourseId,
"courseId": courseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
data_detail = {
"id": courseId
}
#提交观看记录
try:
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=15)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
except Exception as e:
print(f"提交观看记录时发生错误: {str(e)}")
time.sleep(2)
#当前进度信息
try:
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=15)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("该课程已学习时长(秒)")
print(data['data']['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data']['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
return False
else:
return True
else:
print(f"请求失败,状态码:{response_detail.status_code}")
except Exception as e:
print(f"获取学习进度时发生错误: {str(e)}")
return True
for course in course_list:
try:
# 刷完一个网课休息一分钟
print('一分钟后开始学习')
time.sleep(60)
courseId = course['courseId']
courseName = course['courseName']
data_chapter = {
"chapterName": "",
"firstCourseId": courseId
}
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=15)
#判断视频是否分节, 访问url_chapter若不为空则分节
if response_chapter.json()['data'] != []:
print('该课程需分节学习')
childList_flag = 0 # 用于标记是第几个分节视频
for course_data in response_chapter.json()['data']:
print("正在学习:", course_data['childList'][0]['secondCourseName'])
secondCourseId = course_data['childList'][0]['secondCourseId'] # 分节后的课程ID
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": courseId, # 此处为视频ID 若不分节,此处为空
"courseId": secondCourseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", #文档类学习为courseView
"lockIndex": lockIndex, #由播放时的毫秒级时间戳组成
"is1Lock": 1 #文档类学习没有该属性
}
try:
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=15)
studyLockUUID = response_submitLock.json()['data']
except Exception as e:
print(f"获取学习锁时发生错误: {str(e)}")
continue
#开始刷课, Flag判断是否学习完学习完为False
Flag = True
while Flag:
# 此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30/float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": courseId,
"courseId": secondCourseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
# 提交观看记录
try:
response_submit = session.post(url_submit, headers=headers, json=data_submit, timeout=15)
if response_submit.status_code == 200:
# 解析JSON数据
pass
# data = response_submit.json()
# print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
except Exception as e:
print(f"提交观看记录时发生错误: {str(e)}")
time.sleep(2)
# 当前进度信息
try:
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter, timeout=15)
if response_chapter.status_code == 200:
# 解析JSON数据
data = response_chapter.json()
# 获取当前时间戳
current_time = time.localtime()
# 格式化时间
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
# 打印时间
print("该课程分节已学习时长(秒) 当前时间:", formatted_time)
print(data['data'][childList_flag]['childList'][0]['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data'][childList_flag]['childList'][0]['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
childList_flag += 1 #data列表索引后移
break
else:
continue
else:
print(f"请求失败,状态码:{response_chapter.status_code}")
except Exception as e:
print(f"获取学习进度时发生错误: {str(e)}")
else:
print('正在学习:', courseName)
data_detail = {
"id": courseId
}
try:
response_detail = session.post(url_detail, headers=headers, json=data_detail, timeout=15)
#判断课程是否属于电子阅读类
if response_detail.status_code == 200:
# 解析JSON数据
enterUrl = response_detail.json()['data']['enterUrl']
#如果是文档
if enterUrl.endswith('.pdf'):
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"source": "courseView", # 文档类学习为courseView
}
try:
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=15)
studyLockUUID = response_submitLock.json()['data']
except Exception as e:
print(f"获取学习锁时发生错误: {str(e)}")
continue
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
#如果是视频
else:
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", # 文档类学习为courseView
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"is1Lock": 1 # 文档类学习没有该属性
}
try:
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock, timeout=15)
studyLockUUID = response_submitLock.json()['data']
except Exception as e:
print(f"获取学习锁时发生错误: {str(e)}")
continue
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
else:
print(f"请求失败,状态码:{response_detail.status_code}")
print('无法判断,学习下一个课程')
continue
except Exception as e:
print(f"获取课程详情时发生错误: {str(e)}")
print('跳过此课程,学习下一个课程')
continue
except Exception as e:
print(f"处理课程 {course.get('courseName', '未知')} 时发生错误: {str(e)}")
print("继续处理下一个课程...")
continue
except Exception as e:
print(f"刷课过程中发生严重错误: {str(e)}")
print("程序将继续执行其他任务...")
if __name__ == '__main__':
try:
# 读取文件并设置全局变量
read_config_file()
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"播放速度: {speed}倍速")
#模拟登录获取token
token = login()
if token != '':
#获取课程列表
course_list = get_class_list(token)
if course_list:
swipe_class(token, course_list)
else:
print('未能获取到课程列表')
else:
print('模拟登录失败,请仔细检查用户名密码是否正确')
except Exception as e:
print(f"程序运行时发生未预期的错误: {str(e)}")
finally:
print("\n")
print("\n!!!!!!!!!!!!!!!!!!!!程序运行结束!!!!!!!!!!!!!!!!!!!!")
print("\n")
input("\n按回车键关闭窗口......")

View File

@@ -0,0 +1,39 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['casmooc.py'],
pathex=[],
binaries=[],
datas=[('./common_old.onnx','ddddocr')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='casmooc',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['favicon.ico'],
)

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#用户名
username
#密码
password
#学习速度可选1、1.5、2、3倍速默认为1倍速。3倍速下学习1分钟学习进度会增加3分钟。
speed1

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#用户名
username845246471@qq.com
#密码
passwordWXWXsstc_2018
#学习速度可选1、1.5、2、3倍速默认为1倍速。3倍速下学习1分钟学习进度会增加3分钟。
speed3

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -0,0 +1,6 @@
#用户名
username
#密码
password
#学习速度可选1、1.5、2、3倍速默认为1倍速。3倍速下学习1分钟学习进度会增加3分钟。
speed1

View File

@@ -0,0 +1,6 @@
#用户名
usernamewxwx
#密码
password123456
#学习速度可选1、1.5、2、3倍速默认为1倍速。3倍速下学习1分钟学习进度会增加3分钟。
speed1

View File

@@ -0,0 +1,17 @@
不支持中国科技云通行证账号
!!!!!!!!首先在继续教育网选择自己需要学习的课程(视频和文档类课程均可选)
选择完后退出网页。!!!!!!!!
在config.txt中填写用户名和密码
双击运行casmooc.exe
在弹出窗口中会显示课程学习进度一倍速下每学习30秒会更新一次进度
!!!!!!!!!!!!!!!!!
程序运行期间不可在其他地方登录,否则程序无法正常运行。
若窗口闪退请检查用户名和密码是否正确,当前不支持中国科技云通行证账号。
若学习进度长时间未更新,请检查网络情况。
!!!!!!!!!!!!!!!!!

Binary file not shown.

View File

@@ -0,0 +1,9 @@
使用pyinstaller
1.正常打包
pyinstaller -F -i favicon.ico --console casmooc.py
2.修改当前目录下的xx.spec文件
记事本打开xx.spec并将datas=[]改为datas=[('./common_old.onnx','ddddocr')]
3.用listary或其他文件搜索软件找到common_old.onnx并将其复制到当前文件目录下
common_old.onnx在C:\python\Lib\site-packages\ddddocr下项目所在python环境中
4.执行以下代码
pyinstaller .\casmooc.spec

105
模拟登录.py Normal file
View File

@@ -0,0 +1,105 @@
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("登录失败")

331
秒刷网课.py Normal file
View File

@@ -0,0 +1,331 @@
import requests
from PIL import Image
from io import BytesIO
import base64
import ddddocr
import time
# 全局Session对象
session = requests.session()
#全局变量用户名密码和观看速度
#读取用户信息文件内容
def read_config_file():
global username, password, speed
with open('config.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
if line.startswith('username'):
username = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('password'):
password = line.split('')[1].strip().replace(" ", "").replace("\n", "")
elif line.startswith('speed'):
speed = line.split('')[1].strip().replace(" ", "").replace("\n", "")
# 模拟登录
def login():
#获取验证码图片地址
url_code = 'https://www.casmooc.cn/server/modules/imgCode/detail'
data_code = {
"source": "codeDetail"
}
# 请求登录接口需要下列请求头
headers = {
'x-access-device-type': 'WEB',
'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:
data = {}
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)
# 定义登录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": username, #"dingxr@microsate.com"
"password": password, #"WXWXsstc_2018"
"code": Captcha_res,
"codeUuid": uuid
}
# 发送登录请求
response_login = session.post(login_url, json=login_data, headers=headers)
time.sleep(4)
# 检查是否登录成功
if response_login.status_code == 200 and response_login.json()['code'] == '0':
print("----------登录成功----------")
print("等待系统初始化")
time.sleep(4)
data_login = response_login.json()
# 获取token
token = data_login['data']['token']
else:
print("!!!!!!!!登录失败!!!!!!!!")
token = ''
return token
# 获取需要学习的网课列表
def get_class_list(token):
url = 'https://www.casmooc.cn/server/api/course/myList'
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
#获取当前年份
year = str(time.localtime().tm_year)
myList_data = {
"formData": {
"courseName": "",
"isCompleted": 0, # 获取未学完课程
"year": year
},
"pageData": {
"currentPage": 1, # 获取第一页的课程
"pageSize": 20, # 一页有多少课程默认为5
"sortName": "",
"sortOrder": ""
}
}
response_class = session.post(url, json=myList_data, headers=headers)
time.sleep(4)
# 检查是否获取成功
if response_class.status_code == 200 and response_class.json()['code'] == '0':
print("获取未学习课程列表成功")
myList = response_class.json()
course_list = myList['data']['list']
#print(course_list)
else:
print("获取未学习课程列表失败")
course_list = []
return course_list
#刷课时
def swipe_class(token, course_list):
# 判断课程是否分节,比如上中下
url_chapter = 'https://www.casmooc.cn/server/api/course/chapter'
# 获取观看锁
url_submitLock = 'https://www.casmooc.cn/server/api/study/submitLock'
# 提交观看记录
url_submit = "https://www.casmooc.cn/server/api/study/submit"
# 确认课程id
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': token
}
def submit_and_detail(belongCourseId, courseId, studyLockUUID):
#此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30 / float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": belongCourseId,
"courseId": courseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
data_detail = {
"id": courseId
}
#提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
#当前进度信息
response_detail = session.post(url_detail, headers=headers, json=data_detail)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("该课程已学习时长(秒)")
print(data['data']['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data']['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
return False
else:
return True
else:
print(f"请求失败,状态码:{response_detail.status_code}")
return True
for course in course_list:
# 刷完一个网课休息一分钟
print('一分钟后开始学习')
time.sleep(60)
courseId = course['courseId']
courseName = course['courseName']
data_chapter = {
"chapterName": "",
"firstCourseId": courseId
}
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter)
#判断视频是否分节, 访问url_chapter若不为空则分节
if response_chapter.json()['data'] != []:
print('该课程需分节学习')
childList_flag = 0 # 用于标记是第几个分节视频
for course_data in response_chapter.json()['data']:
print("正在学习:", course_data['childList'][0]['secondCourseName'])
secondCourseId = course_data['childList'][0]['secondCourseId'] # 分节后的课程ID
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": courseId, # 此处为视频ID 若不分节,此处为空
"courseId": secondCourseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", #文档类学习为courseView
"lockIndex": lockIndex, #由播放时的毫秒级时间戳组成
"is1Lock": 1 #文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
#开始刷课, Flag判断是否学习完学习完为False
Flag = True
while Flag:
# 此处设置观看速度 30为正常速度数字越小速度越快必须为正整数
if speed in ['1', '1.5', '2', '3']:
submit_time = 30/float(speed)
else:
submit_time = 30
time.sleep(submit_time)
data_submit = {
"belongCourseId": courseId,
"courseId": secondCourseId,
"isRecordAudio": 0,
"lastLearnTime": 0,
"recordDuration": '30',
"studyLockUUID": studyLockUUID
}
# 提交观看记录
response_submit = session.post(url_submit, headers=headers, json=data_submit)
if response_submit.status_code == 200:
# 解析JSON数据
pass
#data = response_submit.json()
#print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
# 当前进度信息
response_chapter = session.post(url_chapter, headers=headers, json=data_chapter)
if response_chapter.status_code == 200:
# 解析JSON数据
data = response_chapter.json()
print("该课程分节已学习时长(秒)")
print(data['data'][childList_flag]['childList'][0]['trueStudyTime'])
print("该课程学习进度(百分比)")
trueStudyProgress = data['data'][childList_flag]['childList'][0]['trueStudyProgress']
print(trueStudyProgress, '%')
if trueStudyProgress > 95.0:
print('该课程学习完毕')
childList_flag += 1 #data列表索引后移
break
else:
continue
else:
print(f"请求失败,状态码:{response_chapter.status_code}")
else:
print('正在学习:', courseName)
data_detail = {
"id": courseId
}
response_detail = session.post(url_detail, headers=headers, json=data_detail)
#判断课程是否属于电子阅读类
if response_detail.status_code == 200:
# 解析JSON数据
enterUrl = response_detail.json()['data']['enterUrl']
#如果是文档
if enterUrl.endswith('.pdf'):
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"source": "courseView", # 文档类学习为courseView
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
#如果是视频
else:
lockIndex = int(time.time() * 1000)
data_submitLock = {
"belongCourseId": '', # 此处为视频ID 若不分节,此处为空
"courseId": courseId, # 此处ID为具体播放视频ID
"source": "courseVideoComponent", # 文档类学习为courseView
"lockIndex": lockIndex, # 由播放时的毫秒级时间戳组成
"is1Lock": 1 # 文档类学习没有该属性
}
response_submitLock = session.post(url_submitLock, headers=headers, json=data_submitLock)
studyLockUUID = response_submitLock.json()['data']
# 开始刷课
Flag = True
while Flag:
Flag = submit_and_detail('', courseId, studyLockUUID)
else:
print(f"请求失败,状态码:{response_detail.status_code}")
print('无法判断,学习下一个课程')
continue
if __name__ == '__main__':
# 读取文件并设置全局变量
read_config_file()
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"播放速度: {speed}倍速")
#模拟登录获取token
token = login()
if token != '':
#获取课程列表
course_list = get_class_list(token)
swipe_class(token, course_list)
else:
print('模拟登录失败,请检查用户名密码是否正确')

1
视频锁.txt Normal file
View File

@@ -0,0 +1 @@
78C6C9169B8340A2B8392332F84D8DC9

70
题库爬虫.py Normal file
View File

@@ -0,0 +1,70 @@
import requests
import json
import os
import time
# 试卷名URL
url_submit = "https://www.casmooc.cn/server/api/study/submit"
url_detail = "https://www.casmooc.cn/server/api/course/detail"
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Content-Length': '118',
'Content-Type': 'application/json;charset=UTF-8',
'Cookie': 'BMAP_SECKEY=2Sq_06ybvD0Wg-a66PwUigT9UeYuT7Uw_ysn5t6J4OfrpszAHdr7_mkaZqRt9gnTLpUq1p-aip3ur40AYi2VtsxgVrhFaTJxoLZyGcgrMjKgCbXYmb6fc4iOVEmP77vqbRokn6fbDpi_xvHfy8HlyycbaZ_v8d3elOyE5wQuYRHTNmjOqify4LxNb9OW6bTO; SECKEY_ABVK=4xWRKdQvkKXaHdjRs0UoD2SGQ7KafNB/ESlqXVzqXe4%3D',
'Host': 'www.casmooc.cn',
'Origin': 'https://www.casmooc.cn',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0',
'sec-ch-ua': '"Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': "?0",
'sec-ch-ua-platform': "Windows",
'x-access-browser-info': 'chrome 125.0.0.0',
'x-access-origin': 'aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==',
'x-access-token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MTg3NzU4NjcsIm9wZXJhdG9ySWQiOiIxMTA0OTI5OTg0In0.uakXO5tMLwQm1FaRnUxHSVwqWAHrpQqG9Wi0-dj5rSc',
}
# 初始化一个空字典来存储试卷id和name值
data_submit = {
"belongCourseId": "1711952903276",
"courseId": "1711953127084",
"isRecordAudio": 0,
"lastLearnTime": 31.989123,
"recordDuration": "3600",
"studyLockUUID": "A4B6E763AA6D4A4DB6CC23CC84BECBEF"
}
data_detail = {
"id": "1711952903276",
"firstCourseId": ""
}
response_submit = requests.post(url_submit, headers=headers, json=data_submit)
response_detail = requests.post(url_detail, headers=headers, json=data_detail)
# 检查响应状态码
if response_submit.status_code == 200:
# 解析JSON数据
data = response_submit.json()
print("提交数据结果\n", data)
else:
print(f"请求失败,状态码:{response_submit.status_code}")
time.sleep(2)
if response_detail.status_code == 200:
# 解析JSON数据
data = response_detail.json()
print("视频播放进度\n", data)
print(data['data']['trueStudyTime'])
else:
print(f"请求失败,状态码:{response_detail.status_code}")

31
验证码.txt Normal file
View File

@@ -0,0 +1,31 @@
heya:1FA8C4C7BDD9408BAD02699471B5629A
nnpb:DCCADE02E9D246209EC015C047446AD2
bgjg:7D047B2859364B688B02B4086967C8F2
ykwx:CFAB208B47CF4E26B5F06066D9E934C8
teuc:89AF6320D6C849F2BC8755BEB5D3596F
POST /server/modules/imgCode/detail HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Content-Length: 23
Content-Type: application/json;charset=UTF-8
Cookie: SECKEY_ABVK=4xWRKdQvkKXaHdjRs0UoD5w3iplLLapwWcJSs9KQ/0Y%3D; BMAP_SECKEY=2Sq_06ybvD0Wg-a66PwUisBp_qmW8L5L1SDfPfuzOdyoWPXWkP0TuomxwjXqXbB-N0aT8G0vQLNLhmUCHsONYCP9EazK-9Od5zUWfJ8x9Dld5YG--QoGk_6IiTaVlL3k6nWqGovimt3s63nJx9U6Ma3IXw3dlW2aUAdp2SMtnskdMyoMJx3sjF0yMGuktdgrRIB0f6RVZUJCY8H1ehiHfQ
Host: www.casmooc.cn
Origin: https://www.casmooc.cn
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0
sec-ch-ua: "Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
x-access-browser-info: chrome 125.0.0.0
x-access-device-mac:
x-access-device-name:
x-access-device-system: Win10
x-access-device-type: WEB
x-access-location-info:
x-access-origin: aHR0cHM6Ly93d3cuY2FzbW9vYy5jbg==
x-access-token:

30
验证码解密.py Normal file
View File

@@ -0,0 +1,30 @@
import hashlib
# 示例数据
examples = {
'heya': '1FA8C4C7BDD9408BAD02699471B5629A',
'nnpb': 'DCCADE02E9D246209EC015C047446AD2',
'bgjg': '7D047B2859364B688B02B4086967C8F2',
'ykwx': 'CFAB208B47CF4E26B5F06066D9E934C8',
'teuc': '89AF6320D6C849F2BC8755BEB5D3596F'
}
# 目标解析值
target_uuid = 'F02450C8858C498E84924B725AC6B6EB'
# 尝试找到可能的解码方式
def find_key_by_hash(target_hash):
for key, value in examples.items():
# 将key编码成字节
key_bytes = key.encode()
# 使用md5进行哈希
hashed_key = hashlib.md5(key_bytes).hexdigest().upper()
print(key)
print(hashed_key)
if hashed_key == target_hash:
return key
return None
# 查找目标值的对应key
result = find_key_by_hash(target_uuid)
print(f'解析结果: {result}') # 期望输出 'hape'