最近在抓取58同城履歷資料的時候,發現網頁使用font-face進行字元替換。比如23歲,頁面中編碼是。也就是說,2的編碼是0xe045,3的編碼是0xe032。同時,對比多個網頁,發現同一個字元,在頁面中的編碼不一樣,如2在不同頁面中的編碼可能不斷變化。
這樣替換有個好處,即使浏覽器将頁面渲染出來,顯示出來的文字仍然是不可複制粘貼的,這是因為字元的編碼值和常用文字編碼的編碼值不一緻。
font-face實際上是一種字型,58用的是woff字型格式。可以學習一下woff字型的編碼。注意,這裡用的是woff,不是woff2。woff的字型定義見:https://www.w3.org/TR/2012/REC-WOFF-20121213。我下面的映射是基于其編碼來的,是以需要好好看一下。
字元映射的原理是y=x-a的分段函數,x是網頁編碼,y最終是從0開始編号,表示字元在字型檔案中的編号,通過這個編号尋找字型資料。
看了一篇文章,也是講這個事,但是同一個字元,其y是不變的,比如2,始終對應1,也就是第1個字型(渲染出來,人看起來就是2的樣子)。但58這裡的替換,同一個字元,最終在字型檔案中的編号不斷變化。每次的字型資料也相應的不斷變化。
那怎麼辦?首先想到的是,58的程式員,總不會為每個字元創造很多種字型(字元的樣子)吧?也就是說,每個字元,在字型檔案中的最終編号雖然不一樣,但是其字型是不變的,那隻需要記錄下字元的最終字型就行,這個映射不變。
怎麼記錄呢?我用了一個簡單的方法,就是使用了字元字型的外輪廓,每個字型的外輪廓不一樣(當兩個字長得差不多時,可能存在重複,但58替換的少,隻替換46個字元,夠用,更好的方式是比較每個字元的完整字型)。對外輪廓的編碼求個MD5,也就是找到了真實的字元和MD5的唯一映射。
搞定。
順便附上最終得到的映射。部分代碼見這裡:58同城字元替換破解。注意啊,全部的代碼我沒保留,這裡隻是核心代碼,有需要全部代碼的,留言給我,我重新寫一下。
技 139d979591546d5dbc67ef91180759e3
校 dbbc6996c0cfde0b6af4c73a84bed4a4
驗 3cf694ead2e8983b3fdbd5b8360eff2e
中 3aee43e816b4eaa008a17de313975eac
經 dd3b6cfa12821ea9e4f1083b5e44cd4c
0 696e5a800eb8b73e7609f0953b8254a3
1 0d8c09783cace0527eb025dff0fc83ce
3 4d7937f2d5e3479e16bf60e3e018fd11
4 faab9407ed648109eb20040c3bffe748
6 0463607c2f7089996e85a5b77d1977e8
男 d18ab46a7dcaf6766243814e322ea12c
無 d412dfb05aa6cdf7fcb96c975f45a2d3
2 01851bb3d5cb6d3511a277be33bde3fc
女 225a7e68d2b009df8536a0d53a457aa1
以 fe9c6f98807ad953f7a6c53b8d2cdf16
高 d223d8e6f3721839503b4aabe23c169e
下 97ac383894335937280c318b99372570
大 a71fe52bd36a921ee17e3c480e891ce1
士 963823d9856cdfd835df4b70f1498975
應 d74f6f1cbd4da0d2fee7d3d2c688de04
屆 7f03322c4deacee2465cc6f0f34eb631
生 e58d3419c2d13a060955b9a9a367434d
8 94437ab8cdac55c8dba31eee0ee50e9c
9 a223deb187cdf1691fd397af0f21f4c7
7 b2b5ebca99ae3f12215dddc28a60a34a
5 05ffa80920e6d92e38e6b81c0c712cce
吳 8c3da9829dd22c3f623597d1a3039a97
黃 f80914b5be8a7838a458a3151e306dee
周 95848d87bed78e2acdc818f3dd316511
張 948c6bf8ba5562cc613a09f21ceb60f0
李 f5f7b638abfde33a37d0c9c1048e473b
A 10d07153249839f1e1f499b1f782022e
B 8dcbbc18474b3311f7a7e351989e44cb
E 6d955c023912da9e571ff21992aa5770
M 706cdc353a59d5351264e7b51ddbdad8
科 84c7a0208ae400af4dada6be5d707531
本 6e291343b641d51614b38dcf0bd985c0
王 dc486d0f76401ee48cda346e5d2f1cc4
陳 5c03f34140b9d9bafc7cb8832a0624d0
楊 0e657fa46f946686401a4f5fec56c7d5
劉 2d7920835b210d00b4c6ca316609830c
博 60f7762c5e1a6fb18348bd4b774e6817
趙 5df029b99c890618ad6ed66cb60ba767
碩 bd1547d220e511af1e3b21b1750152ab