ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
陕西理工大学课表自动推送助手
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗课格是面向陕西理工大学的课表自动推送与只读课表网站,以松石绿为主色,一次抓取生成邮件内容和网站使用的脱敏 JSON 快照。
截图均使用合成数据,不含真实个人信息。
| 手机今日 · 浅色 | 手机今日 · 深色 | 手机周课表 |
|---|---|---|
界面规格见 设计文档,实际实现以 web/ 为准。
定时任务 / CLI
└─ 金智 CAS 登录 → 树维 EAMS 抓取 → CourseTable
├─ formatter → 邮件(可选 Server酱)
└─ snapshot → data/timetable.json
│ 只读
FastAPI 网站
│
浏览器本地渲染
snut/webapp.py 不得 import auth / course / captcha,网站访问不得触发学校请求。
快照通过字段白名单排除学号、内部学生 ID 与课程编码;仍包含课程、教师和教室信息,不能理解为完全匿名数据。
当前 Web 共用 Config,会加载学校账号配置,因此不能宣称网站进程不持有凭证。详见 架构说明。
代码兼容 Python 3.8 语法;依赖安装以所用 Python 版本与依赖包支持范围为准。前端自测另需 Node.js,CI 使用 Node.js 20。
git clone https://github.com/genhaoer66/snut-course-notifier.git
cd snut-course-notifier
python -m venv .venv
激活虚拟环境:Windows PowerShell 执行 .venv\Scripts\Activate.ps1;Linux / macOS 执行 source .venv/bin/activate。
python -m pip install -r requirements.txt
# 可选:验证码 OCR
python -m pip install -r requirements-optional.txt
复制 配置模板 为 .env(PowerShell:Copy-Item .env.example .env;Linux / macOS:cp .env.example .env)。
填写自己的 SNUT_USERNAME、SNUT_PASSWORD,并按学校校历填写 SEMESTER_START。模板日期不是每学期都适用。
需要邮件时再填写 SMTP_USER、SMTP_AUTH_CODE、MAIL_TO;其中授权码不是邮箱登录密码。
python -m snut.main --dry-run
python -m uvicorn snut.webapp:app --host 127.0.0.1 --port 8000
打开 http://127.0.0.1:8000。--dry-run 仍会登录学校、抓取课表、保存会话与更新快照,只是不发推送;它不是离线模式。
首次未生成快照时,网站提示暂无数据。需要助手引导配置时可参阅 AGENT_SETUP.md。
以下逐项对应 .env.example 与 snut/config.py。环境变量优先,字符串会去除首尾空白;空字符串按缺省值处理。
| 变量 | 代码缺省值 / 要求 | 说明 |
|---|---|---|
SNUT_USERNAME | 必填 | 自己的学校账号;示例使用 2024XXXXXXXX |
SNUT_PASSWORD | 必填 | 教务登录密码,仅在本地配置 |
AUTH_BASE | https://authserver.snut.edu.cn/authserver | 金智 CAS 地址 |
EAMS_BASE | http://jwgl.snut.edu.cn/eams | 树维 EAMS 地址 |
SMTP_HOST | smtp.qq.com | SMTP 主机 |
SMTP_PORT | 465 | 整数端口;发送端使用 SMTP_SSL |
SMTP_USER | 空 | SMTP 登录账号,需自行填写 |
SMTP_AUTH_CODE | 空 | SMTP 授权码 |
MAIL_TO | 空 | 收件地址,需自行填写 |
MAIL_FROM_NAME | 课表小助手 | 邮件发件人显示名 |
SERVERCHAN_KEY | 空 | 填入 SendKey 才启用 Server酱 |
WEB_PASSWORD | 空 | 空表示课表公开;填写后启用共享访问口令 |
HTTP_TIMEOUT | 30 | 请求超时秒数;模板为 60,慢速教务系统建议沿用模板 |
REQUEST_INTERVAL | 2.0 | 请求最小间隔秒数;模板为 3,建议不低于 2 |
DEBUG_SAVE_RAW | False | 模板为 0;1/true/yes/on(不区分大小写)启用原始响应调试保存 |
SEMESTER_START | 空 | 第 1 周周一,格式 YYYY-MM-DD;空则无法按教学周准确过滤,模板日期需按校历更新 |
邮件仅在 SMTP_USER、SMTP_AUTH_CODE、MAIL_TO 三项齐全时启用。
logs/、.session/、data/、web/ 路径由代码相对项目根目录确定,不是环境配置项。
补充:snut/webapp.py 单独读取可选的 SNUT_OG_BASE,用于分享卡片站点根地址,例如 https://example.edu.cn,它不在上述模板与 Config 中。
节次时间来自可选 data/periods.json,缺少时只显示节次;更新该文件后需重新生成快照才能反映到网站。
python -m snut.main # 推送今天
python -m snut.main --for tomorrow # 推送明天
python -m snut.main --dry-run # 不推送,仍更新快照
python -m snut.main --dry-run --week 9 # 指定教学周次
python -m snut.main --dry-run --no-snapshot # 不推送、不更新快照,仍请求学校
python -m snut.main --help
诊断工具会访问学校系统,请按需使用并保留限速,不要密集重试:
python scripts/test_login.py
python scripts/debug_course.py
python scripts/captcha_login.py fetch
python scripts/captcha_login.py submit <验证码>
snut/
auth.py 登录门面、密码加密与会话恢复编排
auth_http.py HTTP 会话、限速、重试与协议纠正
login_page.py 登录页纯解析与结果判断
session_store.py Cookie 持久化与兼容恢复
course.py EAMS 请求、课表解析与 CourseTable / Activity
captcha.py 可选验证码 OCR
config.py 环境配置、校验与运行目录
formatter.py 文本 / HTML 格式化与教学周计算
notify.py 邮件、Server酱和失败告警
snapshot.py 快照白名单、原子写入与读取
main.py CLI 流程编排
web_security.py HMAC 令牌、失败限速与请求身份解析
webapp.py 快照 API、静态资源与 HTTP 响应
web/ 无构建的前端及品牌资源
scripts/ 登录诊断、抓取诊断和部署工具
deploy/ systemd 服务单元
tests/ unittest、合成 fixtures 与 js/ui-selftest.js
docs/ 架构、设计规格与合成截图
.github/ CI 与问题模板
运行时产生的配置、会话、快照和日志均不属于仓库产物。
python -m pip install -r requirements.txt -r requirements-dev.txt
python -m unittest discover -s tests
python -m compileall -q snut scripts tests
node --check web/app.js
node tests/js/ui-selftest.js
Python 测试使用模拟请求和临时数据,覆盖认证、解析、配置、快照、推送及 Web 路由。 前端自测无需浏览器,覆盖周次、过滤排序、跨周下一次课程、跨零点、颜色哈希、资源约定与错误分类。 CI 分别运行 Python 与前端检查。
定时任务和网站服务独立运行。部署前端时上传 web/ 全部文件,并更新 CSS/JS 引用版本号;只更新前端无需重新抓课表。
定时抓取频率按个人需要设置,避免反复登录;定时任务可错开整点。
陕西理工大学使用金智 CAS 统一认证与树维 EAMS,课表接口返回 JavaScript,不能套用正方系统的 JSON 接口教程。
| 问题 | 当前处理 |
|---|---|
| 登录页多套表单的 ID 重复 | login_page.py 固定 cllt=userNameLogin、dllt=generalLogin,密码按 AES-CBC/PKCS7 加密 |
startWeek=1 只取第 1 周 | 传空串取整学期,且不传会导致失败的 project.id |
ids 不是学号 | 从课表页 JS 提取学生记录内部 ID |
| 周次位图整体偏移风险 | 下标 i 就是第 i 周,第 0 位仅占位,不能再加 1 |
| 节次索引偏移风险 | index = 星期 * unitCount + 节次,星期与节次都从 0 开始 |
| CAS 重定向到不可达的 80 端口 | auth_http.py 将学校认证主机的 HTTP 请求提升为 HTTPS |
学校防刷提示可能以 HTML 返回;请求要限速。Cookie 保存必须保留 domain/path,才能复用 CAS 票据。
SEMESTER_START 需依据学校校历或调课通知手工维护;空白周可能是实训周,不能据此反推假期或开学日。
这些学校行为来自既有实测记录,后续接口变化仍需重新验证。
当前只实现陕西理工大学。学校相关逻辑主要在 auth.py、auth_http.py、login_page.py 与 course.py;
不能仅改域名就假设兼容其他学校。先核实认证表单、加密方式、会话策略、学期接口及课表响应格式。
移植时以 CourseTable / Activity 为数据边界:保持字段和周次、星期、节次语义,格式化与快照模块即可复用;网站只依赖快照 JSON。
如需多校支持,可定义 AuthProvider.ensure_login()、CourseProvider.load_table(),再按学校注入实现。
这是后续扩展建议,当前没有 SCHOOL 配置或 provider 插件体系。
欢迎提供脱敏后的接口结构与复现记录,不要提交真实响应和凭证。
.env、.session/、data/、logs/ 保持未跟踪;Cookie 等同登录凭证。限制本地配置权限,勿粘贴到问题或提交中。name/teachers/room/day/units/weeks 等必要内容,新增对象字段不会自动公开;教师与教学安排仍需由部署者判断访问范围。WEB_PASSWORD 是共享口令,不是多用户账户系统;空值表示公开。HMAC 令牌有效期为 30 天,修改口令会使旧令牌失效。noindex 与 robots.txt 是爬虫约定,不能替代访问控制。本项目用于查询自己的课表,请遵守学校网络与信息系统使用规定。 不得用于批量抓取、代刷或获取他人数据;保留限速,避免给学校系统增加压力。 教务接口可能随时变化,项目不保证持续可用,使用者需自行核对重要教学安排并承担使用后果。 公开示例与截图应仅使用虚构数据,不提交账号、密码、Cookie 或个人信息。
外部实现与资料只作参考,具体接口和行为应在授权范围内实测后采纳。