标签:Python 爬虫、逆向分析、RSA 加密、Requests、BeautifulSoup
环境:Windows 10 x64 + Python 3.11 + requests 2.32 + beautifulsoup4 4.12
示例站点:文中涉及的域名、Cookie 名均已脱敏,替换为example.edu.cn/learning.example.edu.cn等占位符,仅供技术研究。
1 缘起:为什么要写这个脚本?
在很多高校或企业的在线教学 / 教务平台中,都会使用 CAS 单点登录(Central Authentication Service)。 当我们想定时抓取课表、下载资料或做自动签到时,反复手动输入学号密码极不方便,于是需要一个“无头”脚本自动完成登录。
2 第一步:明确目标与拆分任务
| 子任务 | 说明 | 成功判据 |
|---|---|---|
① 拿到 execution | CAS 登录页的动态隐藏字段 | 打印值形如 e1s1 … |
| ② 获取公钥 | /cas/v2/getPubKey 返回 modulus、exponent | 能解析为大整数 |
| ③ 复刻前端加密 | security.js → encryptedString() | 与浏览器输出一致 |
| ④ 提交表单 | 含账号、密文密码、execution | 服务器 302,Location 携带 ticket= |
| ⑤ 跟随票据 | .../fromcas?ticket=ST-... | 服务器 Set‑Cookie 下发 AUTHORIZATION= |
| ⑥ 打印 Cookie | sess.cookies.get("AUTHORIZATION") | 终端输出 32 字节十六进制串 |
3 第二步:抓包 & 还原登录流程
- 工具:浏览器 DevTools (Network)、Fiddler、Charles 均可。
- 步骤概览
- 访问
https://auth.example.edu.cn/cas/login?service=https://learning.example.edu.cn/api/fromcas。 - 填账号密码并提交,返回 302,Location 带
ticket=ST-...。 浏览器自动 GET 该 ticket 地址,服务端再次 302 到首页,同时发放业务域 Cookie:
Set-Cookie: AUTHORIZATION=3EE2248EABJH8CBB920881E67729341A; Domain=.example.edu.cn; Path=/
- 访问
- 关键发现
execution每次刷新都会变;旧值会提示“页面闲置时间过长”。- 密码并非明文,也非 Base64,而是经 RSA + 十六进制空格分块。
4 第三步:识别动态参数 execution
在登录页源码中搜索 execution 即可发现类似:
<input type="hidden" name="execution" value="e3s1" />
在脚本里,用正则或 BeautifulSoup 提取即可:
CodeBlock Loading...
5 第四步:深入 security.js —— 反向 RSA 加密
前端的核心逻辑(已简化)如下:
CodeBlock Loading...
- 反转:明文整体倒序。
- Little‑Endian:
encryptedString()把两个字节拼成一 digit,低字节在前。 - 输出:每块密文转小写十六进制,块间空格隔开,无 Base64 或 PKCS#1 填充。
6 第五步:用 Python 复刻前端加密
CodeBlock Loading...
7 第六步:拼好第一次 POST
CodeBlock Loading...
成功标志:resp.status_code == 302 且 Location 含 ticket=。
8 第七步:跟踪 302,拿到业务 Cookie
CodeBlock Loading...
9 第八步:写成完整脚本
完整脚本已脱敏示例:
CodeBlock Loading...
10 第九步:常见坑 & 调试经验
| 症状 | 原因 | 解决 |
|---|---|---|
| 提示“页面闲置时间过长” | execution 过期 | 每次先 GET 登录页,立即提交 |
| 返回 200 而非 302 | 密码加密不符 | 再对比浏览器密文,注意反转 & Little‑Endian |
AUTHORIZATION=None | 未访问 ticket URL / ticket 失效 | 跟随重定向或重新登录 |
| 验证码出现 | 失败次数过多被风控 | 人工输入或接入打码平台 |
11 尾声:可能的拓展方向
- 定时任务:使用 cron 或 Windows 计划任务定时执行脚本。
- 批量下载资料:抓取课程文件列表接口 + 循环下载。
- 邮件/消息通知:检测新公告后 SMTP 推送。
- GUI 工具:PyQt 或 Tkinter 封装图形界面分享给同学。
免责声明
本文所有技术仅供个人学习与研究,示例域名与 Cookie 均为虚构,不对应任何真实系统。请勿将脚本用于未经授权的批量访问,否则后果自负。