hwt字體轉換ttf_五分鐘教你弄懂了字體反爬是個啥

今天的文章內容主要是關于字體反爬。

目前已知的幾個字體反爬的網站是貓眼,汽車之家,天眼查,起點中文網等等。

以前也看過這方面的文章,今天跟個老哥在交流的時候,終于實操了一把,弄懂了字體反爬是個啥玩意。下面聽我慢慢道來。

本文用到的第三方庫

fontTools

1、目標網站

url = “https://su.58.com/qztech/”

2、反爬蟲機制

網頁上看見的

3726fa9c712d9617653f4ec5482dd99b.png

后臺源代碼里面的

712335bc68df1efd74023387734a3496.png

從上面可以看出,生這個字變成了亂碼,請大家特別注意箭頭所指的數字。

3、解決

1、確定反爬方法

在看了別人的解析文章之后,確定采取的是字體反爬機制,即網站定義了字體文件,然后進行相應的查找替換,在前端看起來,是沒有任何差異的。其實從審查元素的也是可以看到的:

7c8340284d6d9291cd669aa6aa8ad746.png

和大眾點評的反爬差不多,都是通過css搞得。

2、尋找字體文件

以上面方框里的”customfont“為關鍵詞搜了一下,發現就在源代碼里面:

0e9ddbaa129dcb2976bca7ce72f28721.png

而且還有base64,直接進行解密,但是解密出來的其實是亂碼,這個時候其實要做的很簡單,把解密后的內容保存為.ttf格式即可。

ttf文件: *.ttf是字體文件格式。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字體文件格式,隨著windows的流行,已經變成最常用的一種字體文件表示方式。
@font-face 是CSS3中的一個模塊,主要是實現將自定義的Web字體嵌入到指定網頁中去。

因為我們要對字體進行研究,所以必須將它打開,這里我是用的是FontCreator,打開以后是這個樣子(其實很多字,在這里為了看的清楚,所以只截了下面的圖):

5c1949468e2cbc8191a06edc7a2d91ae.png

很明顯,每個字可以看到字形和字形編碼。

觀察現在箭頭指的地方和前面箭頭指的地方的數字是不是一樣啊,沒錯,就是通過這種方法進行映射的。

所以我們現在的思路似乎就是在源代碼里找到箭頭指的數字,然后再來字體里找到后替換就行了。

恭喜你,如果你也是這么想的,那你就掉坑里了。

因為每次訪問,字體字形是不變的,但字符的編碼確是變化的。因此,我們需要根據每次訪問,動態解析字體文件。

字體:

5795da6e3f603b6bd3fb424c45c204df.png

所以想通過寫死的方式也是行不通的。

這個時候我們就要對字體文件進行更深一步的研究了。

3、研究字體文件

剛剛的.ttf文件我們是看不到內部的東西的,所以這個時候我們要對字體文件進行轉換格式,將其轉換為xml格式,然后來查看:

具體操作如下:

from fontTools.ttLib import TTFontfont_1 = TTFont('58_font_1.ttf')font_base.saveXML('font_1.xml')

xml的格式如下:

7fc1dd5dda506bd968755f75feaff7a5.png
e11895c1ce2876e999e55a593032177e.png

文件很長,我只截取了一部分。

仔細的觀察一下,你會發現~這倆下面的x,y,on值都是一毛一樣的。所以我們的思路就是以一個已知的字體文件為基本,然后將獲取到的新的字體文件的每個文字對應的x,y,on值進行比較,如果相同,那么說明新的文字對就 可以在基礎字體那里找到對應的文字,有點繞,下面舉個小例子。

假設: “我” 在基本字體中的名為uni1,對應的x=1,y=1,n=1新的字體文件中,一個名為uni2對應的x,y, n分別于上面的相等,那么這個時候就可以確定uni2 對應的文字為”我”。

查資料的時候,發現在特殊情況下,有時候兩個字體中的文字對應的x,y不相等,但是差距都是在某一個閾值之內,處理方法差不多,只不過上面是相等,這種情況下就是要比較一下。

其實,如果你用畫圖工具按照上面的x與y值把點給連起來,你會發現,就是漢字的字形~

所以,到此總結一下:

一、將某次請求獲取到的字體文件保存到本地[基本字體];
二、用軟件打開后,人工的找出每一個數字對應的編碼[
一定要保證順序的正確,要不然會出事];
三、我們以后訪問網頁時,需要保存新字體文件;
四、用Fonttools庫對基本字體與新字體進行處理,找
到新的字體與基本字體之間的映射;
五、替換;

4、上代碼

微信里上代碼真的太丑了,

還是算了吧,微信后臺關鍵詞“字體加密” 即可獲取github地址。

看一下成果

45fe8c49abc78ffaf1996eff0bc1bb8b.png

總結

其實這個流程最大的問題就是我們人工錄入的基本字體的字典數據有可能是會發生變化的,這就導致我們后面還要手動去改。

現在,如果你已經看懂了本文,可以找找其他的網站試試啦!

如果有任何問題,歡迎交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode【5--最長的回文子串】 LeetCode【6--Z字形變換】

最長的回文子串 題目描述 給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。 解題思路 可以跟無重復的最長子串一樣,用一個滑動窗口,只不過這個窗口的右邊界往右,左邊界每回要從右邊界的下標往左…

androidstudio 日歷視圖怎么顯示農歷_中秋國慶旅游攻略怎么做?用這個便簽軟件很簡單...

九月已經到來,中秋節和國慶節距離我們也不遠了,今年的中秋和國慶節重疊了有足足八天的假期。不少人都想趁著這個小長假出門旅游,要想保證旅游質量,那么就要做好攻略。中秋國慶旅游攻略怎么做?要想做好一份中秋國慶旅游…

c++ select函數_PySpark 操作函數一覽

PySpark 操作函數一覽Created: Sep 14, 2020 10:28 AM Tags: Big Data, PySpark, Python, SparkPyspark.sql.functionsfrom pyspark.sql import functions as F函數使用說明基本數學函數類abssin、cos、tan、asin、acos 、atan、sinh、cosh、tanhceil、round、floorexp、log、l…

LeetCode【7--整數反轉】 LeetCode【8--字符串轉整數】

整數反轉 題目描述 給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。 解題思路 x%10 取一位,x/10下一位,注意越界, 代碼實現 class Solution { public:int reverse(int x) {int sum 0;while(x){if(s…

word2003如何設置護眼模式_ERP系統上線,如何設置采購收貨的模式,提升企業的采購效率...

如何合理的規劃采購計劃上次去拜訪一個朋友,他們說公司既然出現沒有下達采購訂單,供應商也有送貨過來的事情,對于公司來說,這個是非常嚴重的問題。若用了ERP系統之后,如何避免類似的事情發生,今天我們來分享…

LeetCode【9-- 回文數】LeetCode【10 --正則表達式的匹配】

回文數 題目描述 判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 解題思路 判斷該數的逆序數是不是和原數相同 代碼實現 class Solution { public:bool isPalindrome(int x) {if(…

sun鍵盤沒有stop鍵_請教Sun鍵盤

請教Sun鍵盤(2011-12-24 06:01:11)標簽:計算機雜談請教Sun鍵盤Sun鍵盤上,Help和F1之間的空白鍵是干啥的?Space旁邊的兩個菱形標志的呢?Compose呢?謝謝!請教Sun鍵盤Space旁邊的兩個菱形標志是一個類似Ctrl、Alt的修飾鍵,叫Meta。可以用Meta;鍵名來定義…

LeetCode【11--盛水最多的容器】LeetCode【12 -- 整數轉羅馬數字】

盛水最多的容器 題目描述 給定 n 個非負整數 a1,a2,…,an,每個數代表坐標中的一個點 (i, ai) 。在坐標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共…

LeetCode【13--羅馬數字轉整數】LeetCode【14--最長的公共前綴】

羅馬數字轉整數 題目描述 羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。 例如, 羅馬數字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X II 。 27 寫做 XXVII, 即為 XX…

linux 編譯3g驅動_linux下使用3G撥號上網 以及3g驅動設置

中興WCDMA模塊 Linux撥號流程Version 1.0目錄1. 測試準備……………………………………………………..…32. 撥號腳本………………………………………………………133. 撥號過程………………………………………………………161. 測試準備本文檔測試模塊:MF210(中興W…

文件壓縮(基于LZ77的壓縮)

LZ77壓縮原理 初始LZ77 LZ77是基于字節的通用壓縮算法,它的原理就是將源文件中的重復字節(即在前文中出現的重復字節)使用(offset,length,nextchar)的三元組進行替換 這里的 長度–offset,距離—length,先行緩沖匹配…

好中的圖像處理方面的期刊_約會中,注意這四個方面,幫助你把握好自己的真愛...

兩個人想要擁有一段美好的感情,那么男生就要掌握好一些技巧去追求對方,在追求的過程中,兩個人的約會也非常重要,畢竟只有約會過程中,女孩子才能夠看到你光鮮亮麗的一面,才能夠慢慢的接受你,如果…

kafka consumer配置拉取速度慢_Kafka消費者的使用和原理

這周我們學習下消費者,仍然還是先從一個消費者的Hello World學起:public class Consumer { public static void main(String[] args) { // 1. 配置參數 Properties properties new Properties(); properties.put("key.des…

前綴和

前綴和 輸入一個長度為n的整數序列。 接下來再輸入m個詢問,每個詢問輸入一對l, r。 對于每個詢問,輸出原序列中從第l個數到第r個數的和。 輸入格式 第一行包含兩個整數n和m。 第二行包含n個整數,表示整數數列。 接下來m行,…

子矩陣的和

題目描述 輸入一個n行m列的整數矩陣,再輸入q個詢問,每個詢問包含四個整數x1, y1, x2, y2,表示一個子矩陣的左上角坐標和右下角坐標。 對于每個詢問輸出子矩陣中所有數的和。 輸入格式 第一行包含三個整數n,m,q。 …

jmeter 循環取值賦值給form_JMeter系列(三)邏輯控制器詳解

循環控制器:指定迭代次數,可以用具體數字,也可以通過變量控制永遠:表示無限循環點擊查看示例:Jmeter實例(四)_圖片爬蟲簡單控制器:這是最基礎的一個控制器,它可以讓腳本分層,變成一個…

c 復雜的前置后置面試題_OPPO Reno拆解:優秀工藝由外而內,復雜用料不負旗艦之名...

OPPO的新系列Reno手機最近吸引了不少注意力,不管是消費者還是手機極客都對其優秀的性能和強大的配置抱有極大的興趣。最近,知名數碼博主愛玩客對Reno十倍變焦版進行了拆解,從內部結構向我們揭示了這部手機的強大之處。并且點評道:…

差分矩陣

題目描述 輸入一個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一個子矩陣的左上角坐標和右下角坐標。 每個操作都要將選中的子矩陣中的每個元素的值加上c。 請你將進行完所有操作后…

python常用的開發環境包括_Python語言主要包括哪些集成開發環境?_學小易找答案...

【填空題】Python的標準隨機數生成器模塊是【簡答題】Why does critical thinking matter?【簡答題】采集瓶子的外形進行創意設計 用點、線、面進行裝飾填充 A4紙手繪,構圖要有新意,要飽滿【簡答題】How can a lack of critical thinking cause a loss of personal freedom?【…

最長連續不重復子序列

題目描述 給定一個長度為n的整數序列,請找出最長的不包含重復數字的連續區間,輸出它的長度。 輸入格式 第一行包含整數n。 第二行包含n個整數(均在0~100000范圍內),表示整數序列。 輸出格式 共一行,包…