天天看點

解決58同城使用font-face進行字元替換

最近在抓取58同城履歷資料的時候,發現網頁使用font-face進行字元替換。比如23歲,頁面中編碼是。也就是說,2的編碼是0xe045,3的編碼是0xe032。同時,對比多個網頁,發現同一個字元,在頁面中的編碼不一樣,如2在不同頁面中的編碼可能不斷變化。

這樣替換有個好處,即使浏覽器将頁面渲染出來,顯示出來的文字仍然是不可複制粘貼的,這是因為字元的編碼值和常用文字編碼的編碼值不一緻。

解決58同城使用font-face進行字元替換
解決58同城使用font-face進行字元替換

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
           

繼續閱讀