/bjuthelper

PHP 版本 野生工大助手

Primary LanguagePHPMIT LicenseMIT

工大野生助手

TODO LIST

  • 更新README,以适应重构后的代码
  • 制作API
  • 双学位课程的加权问题

访问量

(注:最新的单日最高PV是3.5万)

预览

功能

  • 查某学期期末考试的各科成绩。
  • 查所有学期总的加权平均分和平均GPA。

运行模式

  • 这两个PHP页面运行在Apache中;
  • Apache安装在我的电脑上;
  • 电脑连了学校的内网,也就是bjut-wifi或者插网线;
  • 将自己电脑的80端口映射到外网。映射的方法很多,我用的是ngrok这个开源工具,也可以用花生壳等。
  • 【手机端(扫二维码访问登陆页面)】<--->【外网映射服务器】<--(学校网关)-->【内网电脑,运行着Apache】<--->【教务网站】
  • 更新:ngrok的开源版本有内存泄漏的BUG,实测大约20000个访问就会造成服务挂掉。我已替换为同类软件frp。

细节

  • login_grade.php负责登陆,require_grade.php负责具体的查询。

login_grade.php

  • UI用的是「WeUI」,微信团队做的,和微信的视觉效果一致;
  • 每个学校的正方教务都不太一样,我的代码中的各种http header参数、post参数基本符合北工大的教务网站。
  • 教务系统的默认登陆页面是default2,可以换换default后面的数字,可以有不需要验证码的登陆页面。

require_grade.php

  • 中文编码容易出现乱码,涉及到本地IDE的编码、PHP的编码和网站的编码;
  • 有两种post,第一种是登陆,第二种是获取成绩信息。获取成绩信息的时候有多次post,分别是获取某学期的成绩和获取总成绩;
  • 构造POST的思路:打开浏览器开发者工具,先正常走一遍查询成绩的流程,观察POST数据的key和value,并在代码中构造;
  • 由于页面返回的是一坨DIV,而且既没有name属性也没有id属性,所以需要将table标签整个转成array,并观察所需要的信息的位置,通过数组下标的方式访问;
  • 总的平均GPA无法区分主修专业和二专业/辅修专业,因为查询所有科目的总成绩页面中没有任何标签能区分这两者。

其他

  • 其实就是个爬虫,模拟了登陆正方教务系统并查询成绩的过程。Python写爬虫的话可能更方便,Python有个库requests,非常好用。
  • PHP中嵌入HTML感觉很不优雅,但HTML中嵌入PHP也好不到哪里去,有什么更好的办法吗?
  • 网上有很多关于正方教务的东西,虽然不太容易直接照搬,但学习价值很大。table转html的函数我就是从网上找的。
  • 交流请联系 807103724@qq.com,微信同QQ。
  • 欢迎提交Issue和Pull Request!

外网使用

更新后的野生助手可以安装在外网机器上,只需要提供 https://vpn.bjut.edu.cn/ 网关登录账户即可。

配置方式:只需要在主目录中创建 config.php 这个文件,内容包含 VPN 的用户名和密码。该用户名和密码可能与教务系统有所不同。

<?php
$proxyUserName="18010101";
$proxyPassword="123456";

LICENSE(假装写出了一个开源的东西)

MIT