武汉大学 Facemash

向李莉老师不断致意,是你使我求学之路由险峻变坦途。

起源

一切的灵感都来自于 The Social Networks

看着 HUST Facemash 上蓝底的照片,我立刻联想到毕业生标准照片。

模式

想起之前学院要求同学们集体到一个网址上去确认一下自己的信息,立刻询问班长发哥,很快发哥就把网址给了我。

http://dean.whu.edu.cn/8888/pho12/

打开后便得知对隐私是毫不设防啊,只要知道学号和生日就可以查到该毕业生的完整信息。

不过生日不好搞,而且我只需要照片。

用自己的信息登录进去,直接用 Chrome Inspector 那张照片的地址

http://dean.whu.edu.cn/8888/pho12/photo12/2008302580021.jpg

耶,显而易见的模式。看样子有时间的话,之前年级的毕业生信息也可以一网打尽。

起手

这东西做起来不麻烦,那就争取在事情的初期做出比较好的规划。

首先,复习 Facemash 用到的公式,弄明白业务逻辑。看罢公式后,忍不住对数学一阵唏嘘,同时更加认定概率是数学中最有趣味性的分支。

然后,定义架构和 API。HUST Geek 的站不知道是后期访问量过大还是受到愤怒的男女发动的 ddos 攻击或者直接对 mysql 进行读写的缘故等等?总之是慢些了。

插曲

期间去 Who-is 查了 www.hust-facemash.com 这个网址的信息,6 月 14 日在 GoDaddy 注册的,注册信息都是假的。

开动

为了拿照片,我的第一反应就是直接把 photo12 目录拖下来。

好吧,403 错误,看来我们的管理员没有那么愚蠢(也没准是默认配置)。错误信息显示这是一台部署在 IIS 6.0 用 ASP.NET 作为脚本语言驱动的服务器上。一种违和感油然而生…

不过,下一瞬间我就打消了去黑掉它的想法,一来性质就变了,二来时间有限。

Time is money, friend.

那就确定数据范围,开始爬取这些照片吧。

立场

这事无意侵犯同学们的隐私,所以自打一开始,就只想到去拿照片,避免将个人信息与照片建立联系。

这样认识你的人还是认识你,不认识你的人依旧是路人,路人对他人相貌的好恶就无外乎隐私了,而照片也是公开渠道拿到的。谁又没走在校园里对迎面走过的俊男美女稍加点评几句过呢?

Kid Stuff

目录无法访问,但测试了自己和同学的学号发现,文件是可以随机访问的。

专业

一个新的问题来了,学号的模式是什么呢?我不清楚院系和专业的编号规则以及对应专业下有多少人。

但是,基本可以假设这些编码都是有序自增的。

2008 30 258 0021

用二分的方式可以很容易确定 258 所在位的取值范围,0-269

不过很快发现这个范围不是连续的,即学院和专业不是顺序编号的。

怎么办呢?还是优先考虑时间问题,先用概率算法解决,枚举每个专业代码的前五个人,如果都失败了,则视为这个专业代码不存在。

脚本只执行了一遍,有效的专业编码至少成功传递了两张照片,结果看起来还是比较理想的。

实际只有 69 个专业代码是有效的。

人头

那么每个专业代码下又各有多少人头呢?

曾听说过的一个事实,说经管是武大最大的院系,某些专业下的人数也很多,他们 08 级好像也没过 400 人。所以这里假设一个专业下最多有 400 人,然后对 69 个有效专业代码下进行从 1..400 的二分查找。

不到十分钟可以对这 69 个专业代码进行一次二分遍历得到有效学号的上限。

但是这个实验进行一次是不行的,因为在检验结果的时候发现,连续的学号中存在无效的学号,嗯,这些人凭空消失了,不会有他们的照片,目测是退学之类的。

所以,如果在二分的时候落在了这样的学号上,最终结果会比实际结果收缩,不理想。

想了下解决方式,简单调整下二分查找中的上下限坐标,就可以改变落到这些点的概率,再多改变几次做多次实验基本可以均衡掉这个问题,最后取多次实验的最大值即为该学号的有效人数上限。

再简单对最终实验结果进行抽测,结果令人满意。

最终 69 个专业的人数上限之和为 7289,应该符合领导在某次开大会时候公布的数字。