1. 程式人生 > 實用技巧 >字型反爬個人心得

字型反爬個人心得

這裡拿四個網站舉例吧,應該涵蓋了目前字型加密的80%了吧,還有什麼網站也可以留言我後面看

1.入門菜,最基礎的字型加密

第一種字型加密是最原始的,他的字型規則是一套固定的樣式,不會隨著網頁的改變而改變,我願將之稱為“靜態字型加密“(狗頭)

例子:實習僧https://www.shixiseng.com/com/com_tyju1cjdpntm

開啟該網頁

f12定位一下

這種可以肯定它就是字型加密了

那它到底是怎麼實現的呢?

我們開啟右鍵開啟網頁原始碼,Ctrl+F搜尋 /天

這樣就很好理解了,伺服器將一份字型檔案,和該網頁原始碼一同傳送給客戶端,遊覽器會根據font-face中指定的字型來進行網頁的渲染,頁就是將這些&#x這種程式碼轉換為我們看到的數字

我們的目標code(編碼)-> name(該字名) -> glyph(字形) -> 字(目標)

好,那我們第一步就去找該網頁的字型檔案,一般現在都選擇用base64加密後攜帶在網頁中,這樣可以更快的載入網頁

將該字型base64解密儲存為woff檔案用FontCreator開啟

這就可以看到它所有加密過的字型了,接下來我們將其儲存為XML檔案檢視細節

from fontTools.ttLib import ttFont
baseFont = ttFont.TTFont("字型.woff")
baseFont.saveXML('字型.XML')

你在後頭看看字型檔案數字上的uni30,沒錯這以為著0-->uni30-->id=2,也就是id為2的字型的編碼就是我們要找的0

baseCodeName = baseFont.getBestCmap()#getBestCmap返回一個字典,該字典有code(字編碼)和name(子名字)的對應關係
for code,name in baseCodeName.items():#字名字(你叫什麼都可以),比如數字0對應的就是uni30
    print(hex(code),name)#將code轉換為16進位制,因為網頁上是16進位制

這樣我們就找到了0的編碼了,但這是我們手動搜尋並對應字型檔案得出的0xe315就代表0,要想程式明白0xe315對應的是0,我們需要建立一個number字形對應的字典

我只將對應的數字和幾個常見的英文,一個漢字的關係找出來了,一個一個對應還是比較無聊的,重點是掌握方法

解釋下:baseFont是一個ttfont物件,baseFont['glyf']:可以返回這個字型的所有形狀,獲取name和形狀的一個字典,就是所給對應的name返回對應的字形

之後我們對比字形,如果該字形和0對應的字形相當,我們就認為它是0的字形,輸出0的編碼,和0

執行

最後用re的sub將網頁中的code替換為字就行了,執行替換成功

最後來理一遍流程,1.下載字型檔案2.儲存為XML,用fontcreator手動找出其中code和name的對應關係3.比較字形,字形相同的為我需要的字型4.講網頁中原本的code替換為目標字

光看你可能不是很能理解,我建議你自己動手試試,按流程來,並理解我所說的code,name,glyph代表什麼,找他們之間的聯絡,你就懂了

2.每次的字形是一樣的但是code和name的對應關係不同

例子:58同城https://cd.58.com/chuzu/?PGTID=0d000000-0000-0f12-e270-c701f230eff6&ClickID=1

我預設你已經懂了第一種再來閱讀這個

58比實習僧要稍微多了一個點但基本流程都是一樣的

儲存兩個字型到本地,發現他們字形沒變,但是code和name對應不同,這其實和上面是一個思路稍微變一點

就是我先儲存一份字型到本地作為基準,我們先肉眼把本地的基準字型0對應什麼1對應什麼的關係找到,然後我們每次爬取獲取該頁面的字型檔案

將他與我們的基準檔案的字形做對比(因為字形不改變),如果基準字形與該字形對應,我們就認為它和基準字型中的某某是同一個字,意思如圖

其實無非就是實習僧用一套字型,這個需要多套的區別,核心程式碼和實習僧的一樣,加一個每次下載字型到本地

最終結果,爬取正常

3.第三種就是貓眼電影這種字形也變,對應關係也變的了

解決思路也很清晰,就是把本地一套字型,每次獲取它當前的字型,我們對比字形座標,因為它字形雖然會變但是區別不會特別大,所以我們只要找到當前字型與本地字型中座標差值最小的那個,我們就認為它們是同一個字,當然這裡有個坑就是座標排序的順序會改變,還需要先找出座標最相近的,再做差值

說起來不難,第一次實踐還是整了挺久的,查了很多部落格才整出來,這裡就不展開講了,思路已經給你了

執行,結果正確

4.王炸GlidedSky字型加密2

我一開始做的時候一頭霧水,後面直呼作者牛逼,有興趣的可以研究下

網站是http://glidedsky.com/,題目描述如下,你要先解決前幾道題才看的到這題

就問你懵逼不懵逼,如果你能把這到題做出了,我想字型加密應該差不多了吧(個人認為,還有什麼網站可以告訴我)

給大家提供點思路吧,總共程式碼40行,重點是思路。最核心的對映關係自己找吧,我說說後面

1.做到後面會發現解析出的漢字和真實網頁上的漢字不對應的情況,查了下,是什麼漢字字典對應的關係什麼鬼,反正就是同一個漢字長得一樣不一定真的一樣。。。比如說

這兩個衣就不一樣,第二個是網頁中給出來的,第一個是我用unicode轉字元的,他們是不能夠對應的,那怎麼辦,我一開時以為這種就幾個特殊的情況,就手動查該字的編碼表,一個一個換

換了幾十個我放棄了,不知道到底有多少個,後面沒用這個方法,但我看網上有那個康熙字典,按理來說應該可以

https://blog.csdn.net/qq_40734108/article/details/105104412

2.我的做法是閱讀XML檔案,找他如何從unicode編碼來到真實的0x這種16進位制編碼,是的,通過unicode(name)去找code,這樣反倒還簡單

要是哪裡有錯誤,歡迎指正,指不定哪裡是錯的