NJUST 师生/校友搜索引擎

利用学校「图书馆研修小间管理系统」中的一个接口,实现了对全校历史上所有录入过系统的师生、校友进行姓名、学号(工号)的搜索。支持 shell 下直接输出格式化的搜索结果,也提供了基于 PHP 的 Web 查询界面。

Demo 地址:https://rpi.jasongzy.com/njust-search.php

不得不说,这实际上是一种很 hack 的实现方式,接口随时可能受到限制!🤫

👉 代码见 GitHub

依赖

  • Python 3
  • requests
  • beautifulsoup4
  • selenium
  • chromedriver
  • PHP

部署方法

在校园网环境下部署时,需要获得一个合法的学号以登录图书馆研修小间管理系统,并相应修改 njustSearch.py 中的以下内容:

1
2
3
4
5
6
7
data={
        "__VIEWSTATE": data1,
        "__EVENTVALIDATION": data2,
        "txtUserName": "9171040GXXXX", # 学号
        "txtPassword": "", # 密码(初始为空)
        "BtnLogin": "登录",
    },

若需要从外网访问,还需要一套可登录学校「智慧理工服务门户」系统(统一身份认证)的学号及密码,并修改 njustSearch_getcookie.py 中的以下内容:

1
2
3
4
# 学号
driver.find_element_by_id("username").send_keys("9171040GXXXX")
# 密码
driver.find_element_by_id("password").send_keys("pw")

PHP 默认调用的是外网版脚本 njustSearch_cookie.py。在内网下使用只需修改 njust-search.php 中的调用文件名为 njustSearch.py 即可:

1
$data_str = exec('njustSearch.py ' . $_POST['keyword'] . '"');

注意:.py 后的空格请保留。

注意事项

  • 支持关键词的部分匹配
  • 图书馆研修小间管理系统仅可从校园网访问,因此在内网环境下可直接访问接口请求数据,速度较快;从外网访问则需要先使用无头浏览器模拟登录学校 VPN 系统并获取 cookie,因此初次使用时速度较慢。成功登录 VPN 后会保存本次获得的 cookie 值,在此 cookie 过期前,外网搜索速度将与内网相近
  • 由于接口限制,当关键词太模糊时,只能搜索到前 10 条结果

闲话

曾经有段时间非常喜欢约几个人一起去巨图的研讨室里自习,几次之后发现了这个只能用校园网访问的研讨室在线预约系统(估计也没有几个人真的会去用它来预约😂)。虽然这个系统的预约操作相当繁琐,必须手动一个一个搜索添加成员,但它的优势是不需要像线下预约设备那样刷每个成员的校园卡。

然而正是这个繁琐的成员搜索添加操作让我意识到,这个系统虽然简陋偏僻且难用,但很可能直接对接了学校的学籍数据库!测试了一下发现,它能够直接找到毕业十几年的校友,也能找到最近刚入学的新一级学生,我甚至在上面查到某个毕业于本校的老师有两条记录——一个是他现在的工号,一个是他当年的本科学号。

这个系统简陋到几乎没有验证措施(只取了登录页面中的两个明文随机字符串作为验证),甚至系统的初始密码为空,也就是说一般情况下只要有一个合法的学号即可完成登录。我很快就找到了搜索的接口地址:

http://202.119.83.29/xabseat/AllAspx/PC_SmallRoom/Ajax.ashx

POST 参数包括:

1
2
3
"key": "SGetMenber"
"type": "1"
"val": "keyword"

登录系统后,改变 val 的值作为关键词发送 POST 请求,就能收到以 json 格式返回的数据,包含相关师生的姓名及学号/工号。

我把程序放在宿舍里连着校园网的树莓派上,并用 PHP 写了一个简易的 Web 页面作为前端界面。实测效果不错,是用来 了解那个你只知道名字的小姐姐的学院年级班级 鉴别表白墙上本校学生身份真伪的极好方式。

寒假把树莓派带回家之后,校园网环境自然是没有了,但是学校提供了 VPN 来访问校内服务。VPN 的登录用的是学校的统一身份认证,请求参数是加密的,一时半会儿搞不定,于是祭出了 selenium 和 chromedriver 模拟登录,搞定了部署在外网的访问问题。唯一的缺点是模拟浏览器的速度实在不敢恭维,因此完成模拟登录获取 cookie 并检索的全过程大约要花费 15s。

-------------本文结束    感谢您的阅读-------------
0%