耿健桓
吳倩
一切的靈感都來自於 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,應該符合領導在某次開大會時候公佈的數字。