一个本地运行的 Python 脚本,用于监控中国人民大学学务中心活动页中的“形势与政策讲座”相关活动,支持登录态复用、活动去重、邮件提醒与定时循环检测。
- Playwright 持久化浏览器上下文,复用登录状态
- 自动筛选:
- 活动大类:素质拓展认证
- 活动小类:形势与政策
- 小类子类:形势与政策讲座
- 活动状态:未开始
- 解析活动列表(标题 / 状态 / 时间)
- 本地 JSON 历史记录与新活动识别
- 仅对“新活动”发送 SMTP 邮件通知
- 邮件中包含活动直达链接(可直接打开活动详情页)
- 固定时间窗口内自动循环检测
- 循环时复用同一个浏览器实例,避免每轮弹出新窗口
- 登录失效检测与登录失效提醒邮件
LectureMonitor/
├─ main.py
├─ monitor.py
├─ notifier.py
├─ storage.py
├─ models.py
├─ page_selectors.py
├─ requirements.txt
├─ config.example.json
├─ README.md
├─ .gitignore
├─ data/
│ └─ .gitkeep
└─ logs/
└─ .gitkeep
运行后会自动生成:
data/seen_activities.jsondata/browser_profile/logs/monitor.log
- Python 3.11+
- Chromium(由 Playwright 安装)
- 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate或使用conda等创建虚拟环境。
- 安装依赖
pip install -r requirements.txt
playwright install chromium- 准备配置
cp config.example.json config.json配置内容:
{
"url": "https://v.ruc.edu.cn/campus#/search",
"check_interval_minutes": 10,
"monitor_start_hour": 8,
"monitor_end_hour": 22,
"browser": {
"headless": false,
"slow_mo_ms": 100,
"profile_dir": "data/browser_profile"
},
"timeouts": {
"page_load_ms": 30000,
"ui_wait_ms": 8000,
"login_check_delay_ms": 3500,
"login_recover_retry_count": 4,
"login_recover_retry_wait_ms": 2000
},
"email": {
"smtp_host": "smtp.example.com",
"smtp_port": 465,
"sender": "your_email@example.com",
"password": "your_app_password",
"receivers": [
"your_email@example.com",
"another_email@example.com"
],
"use_ssl": true
}
}关键字段:
check_interval_minutes:轮询间隔(分钟)monitor_start_hour/monitor_end_hour:监控时段(按小时)timeouts.login_check_delay_ms:登录检测前额外等待,避免误判timeouts.login_recover_retry_count:登录后自动回跳目标页重试次数timeouts.login_recover_retry_wait_ms:重试间隔email.receivers:收件人列表(支持多个)browser.headless: 设置为true可以不弹出浏览器窗口,请确保您已经登录并记住登录状态后再设置。
在运行前请您先修改email的配置内容,关于smtp服务器配置,可自行搜索您邮箱对应的配置,一个qq邮箱的示例为:
"email": {
"smtp_host": "smtp.qq.com",
"smtp_port": 465,
"sender": "your_email@qq.com",
"password": "your_app_password",
"receivers": [
"your_email@qq.com"
],
"use_ssl": true
}安全提示:
config.json含邮箱敏感信息,请注意个人信息保护- 邮箱
password应使用授权码,不要使用登录密码。 - 如果敏感信息曾泄露,建议立即更换授权码。
- 运行
python main.py --config config.json- 默认循环监控:
python main.py --config config.json- 仅执行一轮(调试):
python main.py --config config.json --once- 登录失效时不等待手动恢复(默认会等待):
python main.py --config config.json --no-manual-login- 默认情况下,检测到登录失效后脚本会等待你手动登录。
- 登录后如果页面被重定向到大厅首页,请直接根据终端提示在终端中按下回车,脚本会自动多次跳回目标检索页并重试检测。
- 仅在检测到“新活动”时发送邮件。
- 同一进程内,登录失效提醒会做去重,避免反复轰炸。
- 筛选失败
- 检查
page_selectors.py中的筛选项文本与页面实际文本是否一致。 - 用
playwright codegen https://v.ruc.edu.cn/campus#/search辅助定位。
- 登录后仍提示失效
- 适当增大:
timeouts.login_check_delay_mstimeouts.login_recover_retry_counttimeouts.login_recover_retry_wait_ms
- 不自动输入用户名、密码、验证码
- 不做验证码识别/绕过
- 不自动报名