面向正方教务系统的异步课程任务工具,附带一个无需构建环境、可直接在浏览器中打开的配置生成器。核心网络与页面解析层基于 Scrapling,支持浏览器 TLS 指纹、持久 Cookie、连接池和自适应元素定位。
Important
默认接口来自山东农业大学旧版正方教务系统,该校目前已更换系统。不同学校可能采用短信、滑块、前端 RSA/AES 加密或定制接口,需要结合实际系统适配。
Warning
本项目仅供技术交流与合规研究。请勿绕过访问控制、制造高频恶意请求或违反学校规定。账号封禁、选课结果异常等后果由使用者自行承担。
- 使用
FetcherSession代替requests.Session,由 Scrapling 统一维护 Cookie、连接池和浏览器指纹。 - 使用 Scrapling CSS 选择器解析
csrftoken,并保存元素特征以应对小范围页面结构变化。 - 使用
asyncio并发执行课程任务,不再为每个任务创建独立线程。 - 登录、查询、提交使用同一持久会话,网络错误由 Scrapling 请求重试与任务级重试共同处理。
- WebUI 改为 GitHub 风格,支持系统深色模式、响应式布局、配置校验和安全提示。
├── core/
│ ├── grabber.py
│ └── requirements.txt
├── frontend/
│ ├── index.html
│ ├── style.css
│ └── app.js
├── README.md
└── LICENSE
直接打开 frontend/index.html:
- 填写教务系统地址、学号、密码、学年和学期。
- 添加课程任务及可选的教师、时间、地点过滤条件。
- 点击 Download ZIP 获取完整本地运行包。
页面完全在浏览器本地处理配置,不会主动上传登录凭证。生成的 config.json 包含明文密码,请勿提交到公开仓库。
Scrapling 需要 Python 3.10 或更高版本:
cd core
pip install -r requirements.txt将 WebUI 生成的 config.json 放到 core/grabber.py 同一目录,或首次运行脚本生成空白配置后再填写:
{
"base_url": "https://jw.example.edu.cn",
"username": "2026000000",
"password": "your-password",
"xkxnm": "2026",
"xkxqm": "12",
"retry_delay": 1.0,
"verify_ssl": true,
"impersonate": "chrome",
"tasks": [
{
"type": "tongshi",
"kch_id": "XT108010",
"teacher": "",
"sksj": "",
"jxdd": ""
}
]
}base_url 只填写协议和域名,不要包含 /jwglxt。verify_ssl 建议保持开启,仅在旧系统证书确有问题时关闭。
python grabber.py课程类别目前保留原项目的两种映射:
type |
正方代码 | 用途 |
|---|---|---|
tongshi |
10 |
通识课 |
tiyu |
15 |
体育课 |
教师采用包含匹配,时间和地点采用完整字符串匹配。如果目标系统的路径、字段或成功标志不同,请修改 core/grabber.py 中对应常量和解析函数。