利用学校「图书馆研修小间管理系统」中的一个接口,实现了对全校历史上所有录入过系统的师生、校友进行姓名、学号(工号)的搜索。支持 shell 下直接输出格式化的搜索结果,也提供了基于 PHP 的 Web 查询界面。
Demo 地址:https://rpi.jasongzy.com/njust-search.php
👉 代码见 GitHub
需要说明的是,这实际上是一种 hack 实现,所用到的接口随时可能受到限制!🤫
依赖
- Python 3
- requests
- beautifulsoup4
- selenium
- chromedriver
- PHP
部署方法
在校园网环境下部署时,需要获得一个合法的学号以登录图书馆研修小间管理系统,并相应修改 njustSearch.py
中的以下内容:
1 |
|
若需要从外网访问,还需要一套可登录学校「智慧理工服务门户」系统(统一身份认证)的学号及密码,并修改 njustSearch_getcookie.py
中的以下内容:
1 |
|
PHP 默认调用的是外网版脚本 njustSearch_cookie.py
。在内网下使用只需修改 njust-search.php
中的调用文件名为 njustSearch.py
即可:
1 |
|
注意:.py
后的空格请保留。
注意事项
- 支持关键词的部分匹配
- 图书馆研修小间管理系统仅可从校园网访问,因此在内网环境下可直接访问接口请求数据,速度较快;从外网访问则需要先使用无头浏览器模拟登录学校 VPN 系统并获取 cookie,因此初次使用时速度较慢。成功登录 VPN 后会保存本次获得的 cookie 值,在此 cookie 过期前,外网搜索速度将与内网相近
- 由于接口限制,当关键词太模糊时,只能搜索到前 10 条结果
闲话
曾经有段时间非常喜欢约几个人一起去巨图的研讨室里自习,几次之后发现了这个只能用校园网访问的研讨室在线预约系统(估计也没有几个人真的会去用它来预约😂)。虽然这个系统的预约操作相当繁琐,必须手动一个一个搜索添加成员,但它的优势是不需要像线下预约设备那样刷每个成员的校园卡。
然而正是这个繁琐的成员搜索添加操作让我意识到,这个系统虽然简陋偏僻且难用,但很可能直接对接了学校的学籍数据库!测试了一下发现,它能够直接找到毕业十几年的校友,也能找到最近刚入学的新一级学生,我甚至在上面查到某个毕业于本校的老师有两条记录——一个是他现在的工号,一个是他当年的本科学号。
这个系统简陋到几乎没有验证措施(只取了登录页面中的两个明文随机字符串作为验证),甚至系统的初始密码为空,也就是说一般情况下只要有一个合法的学号即可完成登录。我很快就找到了搜索的接口地址:
http://202.119.83.29/xabseat/AllAspx/PC_SmallRoom/Ajax.ashx
POST 参数包括:
1 |
|
登录系统后,改变 val
的值作为关键词发送 POST 请求,就能收到以 json 格式返回的数据,包含相关师生的姓名及学号/工号。
我把程序放在宿舍里连着校园网的树莓派上,并用 PHP 写了一个简易的 Web 页面作为前端界面。实测效果不错,是用来 了解那个你只知道名字的小姐姐的学院年级班级 鉴别表白墙上本校学生身份真伪的极好方式。
寒假把树莓派带回家之后,校园网环境自然是没有了,但是学校提供了 VPN 来访问校内服务。VPN 的登录用的是学校的统一身份认证,请求参数是加密的,一时半会儿搞不定,于是祭出了 selenium 和 chromedriver 模拟登录,搞定了部署在外网的访问问题。唯一的缺点是模拟浏览器的速度实在不敢恭维,因此完成模拟登录获取 cookie 并检索的全过程大约要花费 15s。