Cttc Auto Learn

Automation

烟草网络学院 (mooc.ctt.cn) 自动学习脚本,支持刷学时、刷专题、刷课程、刷任务四种模式。 用户说"帮我刷学时"即可自动完成登录、播放视频、累计学时全流程。 触发词:烟草、网络学院、mooc、cttc、自动学习、学时。

Install

openclaw skills install @gandli/cttc-auto-learn

烟草网络学院自动学习

用户只需安装此 SKILL,说"帮我刷学时"即可。Agent 自动完成环境搭建、登录、学习。

支持模式

模式命令说明
刷学时uv run python main.py --mode hours播放视频累计学时(默认)
刷专题uv run python main.py --mode topics完成专题课程
刷课程uv run python main.py --mode courses完成所有未完成课程
刷任务uv run python main.py --mode tasks完成指定任务

触发词对应模式:

  • "帮我刷学时" / "累计学时" → --mode hours
  • "帮我刷专题" / "完成专题" → --mode topics
  • "帮我刷课程" / "完成课程" → --mode courses
  • "帮我刷任务" / "完成任务" → --mode tasks

Agent 执行流程(按顺序执行)

Step 1: 克隆项目(如果还没有)

# 检查项目是否存在
if [ ! -d ~/Desktop/cttc-auto-learn ]; then
  git clone https://github.com/gandli/cttc-auto-learn.git ~/Desktop/cttc-auto-learn
fi
cd ~/Desktop/cttc-auto-learn

Step 2: 安装依赖

cd ~/Desktop/cttc-auto-learn
uv sync

Step 3: 清理环境

# 杀掉残留 Chrome 进程(注意:不要误杀其他 Chrome)
taskkill //F //IM chrome.exe 2>/dev/null || true
# 清除 Python 缓存
find . -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true

Step 4: 首次登录(需要用户扫码)

检查凭证文件是否存在且有效:

ls output/auth-state.json 2>/dev/null

如果不存在或已过期,需要用户扫码登录:

cd ~/Desktop/cttc-auto-learn
uv run python main.py

登录流程特性:

  • 事件驱动:监听页面跳转 (framenavigated),扫码后立即检测成功
  • 双二维码:同时提供 APP 和微信两种扫码方式
  • 自动刷新:二维码过期时自动刷新并重新保存图片
  • 即时响应:无需轮询,登录成功后立即开始学习

二维码图片位置:

  • output/qrcode-app.png — APP 扫码
  • output/qrcode-wechat.png — 微信扫码

Agent 操作步骤:

  1. 启动脚本后,等待二维码生成(约 5 秒)
  2. 监控日志获取二维码路径:
    tail -20 ~/Desktop/cttc-auto-learn/logs/cttc.log | grep "QR_PATHS"
    
  3. 读取二维码图片并发送给用户
  4. 用户扫码后,脚本自动检测登录成功
  5. 凭证自动保存到 output/auth-state.json

如果已存在,跳到 Step 5。

Step 5: 运行自动学习

cd ~/Desktop/cttc-auto-learn
uv run python main.py

脚本会自动:

  1. 恢复登录状态(使用 output/auth-state.json
  2. 通过 API 获取课程列表
  3. 逐个播放未完成的视频
  4. 监控学时进度
  5. 达到目标后自动退出

Step 6: 监控运行

脚本运行后,Agent 必须主动监控状态并定期向用户汇报进展。

6.1 检查脚本是否在运行

# 检查 Python 进程
tasklist 2>/dev/null | grep -i python || echo "脚本未运行"

# 或检查状态文件是否存在
ls ~/Desktop/cttc-auto-learn/output/status.json 2>/dev/null && echo "脚本已启动" || echo "脚本未运行"

6.2 读取实时状态(推荐)

状态文件 output/status.json 每 30 秒自动更新,Agent 可直接读取:

cat ~/Desktop/cttc-auto-learn/output/status.json

状态字段说明:

字段类型说明
statusstringplaying / completed / error
current_videostring当前播放的课程名称
video_progressfloatDOM 进度百分比 (0-100)
api_completed_rateintAPI 返回的完成率
study_hours_currentfloat当前学时
study_hours_targetfloat目标学时
courses_completedint已完成课程数
courses_pendingint待学课程数
courses_totalint总课程数
errors_countint累计错误次数
stall_recoveriesint停滞恢复次数
uptime_secondsint运行时长(秒)
last_updatestring最后更新时间

6.3 终端监控面板

在另一个终端运行实时监控(有进度条和颜色):

cd ~/Desktop/cttc-auto-learn
uv run python scripts/monitor.py

6.4 查看日志

tail -50 ~/Desktop/cttc-auto-learn/logs/cttc.log

6.5 Agent 主动汇报模板

Agent 应定期(每 5-10 分钟或用户询问时)读取状态并向用户汇报:

📊 当前状态
- 状态: playing
- 视频: 全链路数智化转型 (48.1%)
- 学时: 28.1/50.0h (56.2%)
- 课程: 0 完成 / 76 待学
- 运行: 25 分钟
- 错误: 0 次

关键事件必须立即通知用户:

  • ✅ 视频完成(status 变为 completed 或新视频开始)
  • 📈 学时增长(study_hours_current 变化)
  • ❌ 错误发生(errors_count 增加)
  • 🎯 达到目标(study_hours_current >= study_hours_target

运行参数

main.py 中可调整:

参数默认值说明
target_hours50目标学时(小时)
headlessFalse无头模式(不显示浏览器窗口)

常见问题

问题原因解决
40909 多开限制localStorage 残留旧会话脚本已自动处理(启动时清除)
40904 错误studyTime 不正确脚本已自动修正为增量值
浏览器崩溃GPU 进程异常脚本已加 --disable-gpu 参数
学时不增长服务器异步结算持续运行,隔天检查
二维码过期超过 2 分钟未扫码脚本会自动刷新二维码

技术细节(供参考)

  • 加密:video-progress API 使用 AES-128-ECB,密钥 d8cg8gVakEq9Agup
  • 防挂机:每 25 分钟自动触发 mousemove 事件
  • 单实例:文件锁防止多个脚本同时运行
  • 标签页管理:自动关闭多余标签页,确保只播放一个视频
  • 弹窗处理:自动关闭弹窗,但排除视频播放器区域