一、脚本功能概述
该脚本用于自动登录在线学习平台(glanquan.gsjtpxzx.com),完成以下任务:
-
自动登录:使用从数据库获取的账号密码登录。
-
课程学习:
-
获取用户的课程列表。
-
对每个课程的每个课时进行人脸识别验证(优先使用用户头像,失败则尝试数据库中的备用图片)。
-
验证成功后,上报学习时长。
-
-
自动考试:
-
获取考试列表,根据
kcname(课程名称)匹配对应的考试。 -
如果考试分数低于60分且允许重考,则从题库(Excel文件)中查找答案,自动答题并提交。
-
-
状态更新:将处理结果(成功/失败/异常信息)更新到数据库的
qingka_wangke_order表中。
二、环境准备
1. Python 版本
-
推荐 Python 3.7 或更高版本。
2. 安装依赖包
运行脚本需要以下 Python 库:
-
requests:发送 HTTP 请求 -
openpyxl:读取 Excel 题库 -
pymysql:连接 MySQL 数据库 -
(可选)
asyncio为 Python 内置,无需安装
使用 pip 安装:
pip install requests openpyxl pymysql
三、配置文件修改
脚本中数据库连接信息是硬编码的,必须修改为您自己的数据库配置。找到以下代码段:
db_config = { 'user': '29_2024dream_cn', 'password': 'iCcE28aHH4Dx6Tmc', 'host': '175.24.176.252', 'port': 3306, 'database': '29_2024dream_cn', 'charset': 'utf8mb4', 'autocommit': True, }
将其中的 user、password、host、port、database 替换为实际值。
四、数据库表结构说明
脚本依赖以下两个表(实际只使用了 qingka_wangke_order,但注释中提到 uploaded_images,为完整起见一并说明):
1. qingka_wangke_order 表
该表存储待处理的账号、课程及状态。必须包含以下字段(按脚本查询的字段):
-
user(varchar) :账号 -
pass(varchar) :密码 -
kcname(varchar) :课程名称(用于匹配考试) -
status(varchar) :状态(’待处理’、’补刷中’、’处理中’、’异常’、’已完成’ 等) -
remarks(text) :处理结果备注 -
image_url(text) :备用图片路径(用于人脸识别) -
cid(int) :脚本中查询条件为cid = '1',可根据需要修改
2. uploaded_images 表(可选)
如果人脸识别需要备用图片,可以从该表读取。但脚本中实际使用的是 qingka_wangke_order 的 image_url 字段,所以此表非必需。
注意:脚本中有一段代码从 qingka_wangke_order 读取图片路径:
sql = "SELECT image_url FROM qingka_wangke_order WHERE user = %s"
请确保表中存在 image_url 字段,并已存入有效的图片路径(平台要求的格式)。
五、题库文件准备
脚本需要一个 Excel 文件 question.xlsx,放在与脚本相同的目录下。该文件用于自动答题,格式要求:
-
第一行为表头(程序从第二行开始读取数据)。
-
第一列:题目ID(对应平台考试题目的
id)。 -
第二列:答案(多个答案用
|分隔,支持,、,、、自动替换为|)。
示例:
| 题目ID | 答案 |
|---|---|
| 12345 | A |
| 12346 | B|C |
| 12347 | 正确 |
六、运行脚本
1. 启动脚本
在命令行中进入脚本所在目录,执行:
python 脚本文件名.py
脚本名为您保存的文件名,例如 auto_learn.py。
2. 查看日志
脚本运行时会输出详细日志,包括登录状态、课程处理进度、人脸识别结果、考试答题情况等。日志级别为 INFO,可按需修改 logging.basicConfig(level=logging.INFO) 中的级别。
3. 停止脚本
按 Ctrl + C 可以安全中断脚本(程序捕获了 KeyboardInterrupt)。
七、注意事项
1. 数据库安全
-
绝对不要将包含真实数据库密码的脚本上传到公开仓库或分享给他人。
-
建议使用环境变量或外部配置文件(如
config.ini)来存储敏感信息,并在脚本中读取。 -
示例使用环境变量:
import os db_config = { 'user': os.environ.get('DB_USER'), 'password': os.environ.get('DB_PASSWORD'), ... }
2. 账号安全
-
脚本会从数据库读取明文密码,请确保数据库访问权限严格控制。
-
平台登录时密码明文传输,脚本未做额外加密(但平台可能已使用 HTTPS),注意网络环境安全。
3. 题库格式
-
题库文件必须为
.xlsx格式,且与脚本在同一目录。 -
如果题目ID在题库中找不到对应答案,脚本会跳过该题并最终可能导致提交失败(因为题目未全部回答)。请确保题库完整覆盖可能出现的题目。
4. 人脸识别
-
脚本优先使用用户头像进行人脸识别,如果失败则尝试数据库中的备用图片(从
qingka_wangke_order.image_url读取)。 -
备用图片路径必须是平台可访问的 URL 或相对路径,格式需与头像路径一致(例如去除前缀后的路径)。
-
人脸识别成功后,备用图片不会被删除;识别失败则会从数据库中删除该图片路径(
DELETE FROM qingka_wangke_order WHERE user = %s AND image_url = %s),防止重复使用无效图片。
5. 考试处理逻辑
-
脚本仅处理状态为“进行中”(
status字段?实际代码中根据exam_starttime和exam_endtime判断)且class_name与kcname完全匹配(去除空格后)的考试。 -
分数低于60分且允许重考(
is_retest == 1)时才会自动答题。 -
提交试卷前会等待随机时间(25-40秒)模拟人工。
-
提交后重新获取考试列表,提取最新的成绩信息作为备注。
6. 平台反爬与频率限制
-
脚本在每次请求之间加入了
await asyncio.sleep(2)或await asyncio.sleep(5)等延时,以降低请求频率。 -
如果平台有严格的频率限制,可能需要调整延时时间。
-
脚本实现了重试机制(指数退避),对网络波动有一定容忍度。
7. 异常处理
-
脚本会捕获大部分异常并记录日志,但某些未预料的异常可能导致脚本退出。建议在
main_loop外层添加更全面的异常捕获,或使用守护进程运行。 -
脚本会定期检查数据库连接健康,并重新连接,减少因数据库超时导致的失败。
8. 并发处理
-
脚本是单线程异步,但实际 I/O 操作(requests)是同步的,因此是串行处理每个账号。如果账号数量多,处理速度可能较慢。
-
可以修改为使用
aiohttp实现真正的异步并发,但当前设计已满足基本需求。
9. 操作系统兼容性
-
脚本末尾使用了
os.system("pause"),仅在 Windows 下有效。如果需要在 Linux 下运行,建议删除或替换为其他等待方式(如input("按回车键退出..."))。
10. 合规性提醒
-
请确保您拥有使用此脚本的合法授权,仅用于个人学习或工作目的,遵守平台用户协议。
-
过度频繁的自动化请求可能导致账号被封禁,请谨慎使用。
八、常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 数据库连接失败 | 配置错误、网络不通、防火墙 | 检查数据库地址、端口、用户名密码是否正确,测试能否远程连接 |
| 题库文件未找到 | 文件不存在或路径错误 | 确认 question.xlsx 位于脚本同目录 |
| 登录失败 | 账号密码错误、平台接口变更 | 检查数据库中的密码是否正确,尝试手动登录平台 |
| 获取学习列表为空 | 账号无课程、接口返回异常 | 检查平台账号是否正常,是否有课程 |
| 人脸识别一直失败 | 头像路径无效、备用图片无效 | 检查头像路径是否正确,备用图片是否有效,是否已完成当日人脸验证次数 |
| 考试匹配不到 | kcname 与 class_name 不匹配 |
检查数据库中 kcname 值是否与平台考试中的 class_name 一致(去除空格后) |
| 提交试卷失败 | 答案格式错误、网络问题 | 检查日志中的返回信息,确认答案格式是否正确(多个答案用 | 分隔) |
| 脚本卡住不动 | 网络超时、数据库连接丢失 | 查看日志最后输出,等待重试或手动重启 |
九、自定义修改建议
-
查询条件:脚本中查询待处理账号的条件是
cid = '1',可根据需求修改。 -
考试状态判断:脚本根据
exam_starttime和exam_endtime判断是否在有效期内,可调整逻辑。 -
人脸识别图片来源:当前从
qingka_wangke_order.image_url读取,可改为从其他表读取。 -
备注格式:最终更新到数据库的备注包含了考试信息,可按需修改格式。
最后提醒:使用自动化脚本时,请务必遵守相关法律法规及平台规定,合理使用,风险自负。





暂无评论内容