一切的灵感都来自于 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.
那就确定数据范围,开始爬取这些照片吧。
这事无意侵犯同学们的隐私,所以自打一开始,就只想到去拿照片,避免将个人信息与照片建立联系。
这样认识你的人还是认识你,不认识你的人依旧是路人,路人对他人相貌的好恶就无外乎隐私了,而照片也是公开渠道拿到的。谁又没走在校园里对迎面走过的俊男美女稍加点评几句过呢?
目录无法访问,但测试了自己和同学的学号发现,文件是可以随机访问的。
一个新的问题来了,学号的模式是什么呢?我不清楚院系和专业的编号规则以及对应专业下有多少人。
但是,基本可以假设这些编码都是有序自增的。
2008 30 258 0021
用二分的方式可以很容易确定 258
所在位的取值范围,0-269
。
不过很快发现这个范围不是连续的,即学院和专业不是顺序编号的。
怎么办呢?还是优先考虑时间问题,先用概率算法解决,枚举每个专业代码的前五个人,如果都失败了,则视为这个专业代码不存在。
脚本只执行了一遍,有效的专业编码至少成功传递了两张照片,结果看起来还是比较理想的。
实际只有 69 个专业代码是有效的。
那么每个专业代码下又各有多少人头呢?
曾听说过的一个事实,说经管是武大最大的院系,某些专业下的人数也很多,他们 08 级好像也没过 400 人。所以这里假设一个专业下最多有 400 人,然后对 69 个有效专业代码下进行从
1..400
的二分查找。
不到十分钟可以对这 69 个专业代码进行一次二分遍历得到有效学号的上限。
但是这个实验进行一次是不行的,因为在检验结果的时候发现,连续的学号中存在无效的学号,嗯,这些人凭空消失了,不会有他们的照片,目测是退学之类的。
所以,如果在二分的时候落在了这样的学号上,最终结果会比实际结果收缩,不理想。
想了下解决方式,简单调整下二分查找中的上下限坐标,就可以改变落到这些点的概率,再多改变几次做多次实验基本可以均衡掉这个问题,最后取多次实验的最大值即为该学号的有效人数上限。
再简单对最终实验结果进行抽测,结果令人满意。
最终 69 个专业的人数上限之和为 7289,应该符合领导在某次开大会时候公布的数字。