这是一个用于监控南京大学电费充值页面剩余电量的Python脚本,并提供可视化网页面板。
- 自动登录南京大学电费充值系统
- 支持两种验证方式:传统验证码(ddddocr OCR)和滑块验证(captcha-recognizer AI识别)
- 自动检测验证方式:智能识别当前页面是验证码还是滑块,自动切换处理流程
- 多轮重试机制:传统验证码(外层×内层)和滑块验证(完整流程重试)确保高成功率
- ChromeDriver 自动匹配:本地版本不匹配时自动回退 Selenium Manager 下载
- 提取剩余电量信息
- 支持无头模式运行
- 数据保存为JSON和CSV格式
- 详细的日志记录
- 可视化网页面板,支持交互式电量曲线与数据表格
- 一键批处理启动与网页自动打开
📖 完整使用指南:请查看 GUIDE.md,包含详细的安装部署、配置说明、验证机制详解、故障排除和开发指南。
本项目已集成 Github Actions 自动定时监控与数据更新,无需本地部署即可自动采集和推送电量数据。
- 自动定时任务:每天多次自动运行,采集电量数据并推送到仓库。
- 自动安装依赖、中文字体、ChromeDriver、Tesseract OCR。
- 自动生成数据文件和可视化图片。
- 运行日志和数据自动提交到仓库。
如何启用/配置自动运行:
- 在仓库设置 Secrets,添加
NJU_USERNAME和NJU_PASSWORD。 - config_workflow.json中可以配置参数,
NJU_USERNAME和NJU_PASSWORD不变即可 - Actions 会自动拉取凭据并运行,无需手动操作。
- 可在 Actions 页面查看运行日志和结果。
config_workflow.json 部分参数:
captcha_retry_count: 验证码识别重试次数(建议 3–10 次,当前示例为 4)save_captcha_images: 是否保存验证码图片用于调试(默认 true)test_mode: 是否在关键步骤保存页面快照到data/test_snapshots_workflow(默认 false,仅调试时建议开启)enable_email_alert: 是否启用电量低于阈值时的邮件通知(默认 true)alert_threshold_warn: 一般提醒阈值(单位:度,默认 200)alert_threshold_high: 重要提醒阈值(单位:度,默认 10)alert_threshold_critical: 紧急提醒阈值(单位:度,默认 5)
💡 首次使用? 建议先阅读 完整使用指南 GUIDE.md,包含详细的安装部署、配置说明和故障排除。
Github Actions 中已支持电量预警邮件:当剩余电量低于配置的阈值时,会自动发送带有近期电费曲线图的提醒邮件。
- Python 3.9+(推荐 3.11,与 Github Actions 一致)
- Chrome浏览器
- ChromeDriver(已包含在chromedriver-win64目录中)
pip install -r requirements.txt在运行主脚本之前,建议先运行环境测试:
python tests/test_environment.py如果遇到 module 'PIL.Image' has no attribute 'ANTIALIAS' 错误,请运行:
python src/fix_pil_compatibility.py确保项目根目录下有 chromedriver-win64 文件夹,并包含 chromedriver.exe 文件。
首次运行时会自动创建 config.json 配置文件,或者手动创建:
captcha_retry_count: 验证码识别重试次数(默认5次)save_captcha_images: 是否保存验证码图片用于调试(默认true)
{
"username": "你的用户名",
"password": "你的密码",
"auto_login": true,
"headless_mode": true,
"captcha_retry_count": 5,
"save_captcha_images": true,
"log_level": "INFO"
}run_auto_monitor.batpython src/nju_electric_monitor_auto.py或指定配置文件:
python src/nju_electric_monitor_auto.py config.jsonrun_web_panel.bat- 会自动激活虚拟环境并启动网页服务
- 自动用Edge或Chrome浏览器打开 http://127.0.0.1:5000/
- 支持桌面快捷方式
python src/web_panel.py然后浏览器访问 http://127.0.0.1:5000/
- 页面结构调试:
python tests/debug_page_structure.py
- 验证码识别测试:
python tests/test_captcha_recognition.py
data/electricity_data.json:电量数据(JSON 行格式)data/electricity_data.csv:电量数据(CSV 格式,列为 time/num/unit)data/electricity_trend.png:完整历史电量变化曲线图data/recent_20_changes.png:最近 20 次电量变化曲线图(workflow/auto 版本)data/captcha_debug.png:最近一次验证码截图(用于快速查看验证码样式)data/captcha_auto/*.png:本地 auto 版本每轮重试保存的验证码图片,识别成功后会按识别结果重命名为PCET.png等data/captcha_workflow/*.png:GitHub Actions workflow 运行时每轮重试保存的验证码图片,识别成功后同样按识别结果重命名logs/nju_electric_monitor-YYYY-MM-DD-HH.log:主脚本按小时滚动生成的运行日志logs/workflow_wrapper_*.log:CI 包装脚本输出的完整运行日志(包含环境信息、字体诊断等)
- 实时展示电量变化曲线(可缩放、拖动、悬停查看数据)
- 数据表格美观展示,支持一键刷新
- 科技感UI设计,适配桌面与移动端
- 建议优先使用 Github Actions 自动运行,无需本地部署。
- 本地运行时确保Chrome浏览器版本与ChromeDriver版本兼容。
- 如果验证码识别失败,脚本会提示手动输入。
- 建议在无头模式下运行以提高性能。
- 请妥善保管登录凭据。
- 重要:如遇PIL兼容性问题,请运行
src/fix_pil_compatibility.py - 如果无法提取电量信息,请运行
tests/debug_page_structure.py分析页面结构。 - 如果验证码识别不正确,请运行
tests/test_captcha_recognition.py测试识别效果。
如果遇到 module 'PIL.Image' has no attribute 'ANTIALIAS' 错误:
-
运行修复脚本:
python src/fix_pil_compatibility.py
-
手动修复:在脚本开头添加:
from pil_compatibility_patch import *
-
降级Pillow版本(如果修复脚本不起作用):
pip install Pillow==9.5.0
如果遇到环境配置问题:
- 运行
python tests/test_environment.py检查环境配置 - 确保所有依赖正确安装:
pip install -r requirements.txt - 检查Python版本是否满足要求(建议 >= 3.9,推荐 3.11)
如果遇到ChromeDriver相关错误,请检查:
chromedriver-win64/chromedriver.exe文件是否存在- ChromeDriver版本是否与Chrome浏览器版本匹配
- 脚本已内置自动回退:本地版本不匹配时,会自动使用 Selenium Manager 下载匹配版本
- 如需手动更新,下载对应版本: https://chromedriver.chromium.org/downloads
如果验证码识别失败:
- 检查网络连接
- 确保 ddddocr 安装成功(
pip install -r requirements.txt会自动安装) - 尝试手动输入验证码
- 运行
python tests/test_captcha_recognition.py测试识别效果 - 适当调大
captcha_retry_count或查看data/captcha_auto/data/captcha_workflow中的验证码截图,人工比对识别结果
如果滑块验证失败:
- 确保 captcha-recognizer 已安装(
pip install -r requirements.txt) - 运行滑块验证测试:
python tests/test_verification_flow.py - 滑块验证已内置多轮重试(默认3轮),单次失败会自动重新截取、识别、拖拽
- 查看日志中
滑块缺口 box=信息,确认缺口检测是否准确
如果无法提取电量信息:
- 运行
python tests/debug_page_structure.py分析页面结构 - 根据分析结果调整脚本中的选择器
如果验证码识别不正确:
- 运行
python tests/test_captcha_recognition.py测试不同的图像处理方法 - 查看生成的调试图片,选择最清晰的处理方法
- 适当调大
captcha_retry_count,或直接在本地通过手动输入验证码兜底
MIT License

