爬虫 - 动态字体 -破解

爬取的woff字体动态变化,且字体坐标会随机偏移一点点(如下图1.woff和2.woff),无法形成统一的'unicode——字体坐标矩阵'映射,只能求两矩阵的相识度,这里使用距离相识度(参考机器学习KNN分类算法概念)。
1.woff:

2.woff:

放大后两者是有区别的:

解决办法:
以2.woff为标准,人为设置基础矩阵字体映射,然后读取1.woff,按字体坐标信息与2.woff的最大相识度求出1.woff的字体映射表。

from fontTools.ttLib import TTFont
import numpy as np```


```# 比较两个数组的欧式距离
def compare_axis(axis1, axis2):
    # 以坐标(0,0)补填空缺
    if len(axis1) < len(axis2):
        axis1.extend([0, 0] for _ in range(len(axis2) - len(axis1)))
    elif len(axis2) < len(axis1):
        axis2.extend([0, 0] for _ in range(len(axis1) - len(axis2)))
    # 将列表转换为 Numpy 中的数组
    axis1 = np.array(axis1)
    axis2 = np.array(axis2)
    # 计算并返回欧式距离
    return np.sqrt(np.sum(np.square(axis1 - axis2)))```


```#  读取font信息
def read_font(path):
    '''
    :param path: 文件路径
    :return: 读取后的unicode;字体矩阵映射字典
    '''
    font = TTFont(path)
    series = font.getGlyphNames()
    arr_dict = {}
    for i in series:
        arr_dict[i] = list(font['glyf'][i].coordinates)
    del arr_dict['.notdef']
    return arr_dict```


# 解析woff文件,返回解析后映射字典
```def parse_font_code(woff_path):
    '''
    :param woff_name: 传入待解码woff文件路径
    :return: 解码后的{'unicode':num,...}
    '''

    #  生成基础矩阵字体映射
    base_dict = {
        'unia173': 6,
        'unie794': 3,
        'unif841': 2,
        'unia735': 0,
        'unif312': 8,
        'unif231': 1,
        'unic574': 9,
        'unic275': 4,
        'unic456': 5,
        'unif356': 7,
    }
    base_code_dict = read_font('2.woff')
    new_code_dict = read_font(woff_path)
    # print(new_code_dict)
    res_dict = {}
    for new_k, new_v in new_code_dict.items():
        res = float('inf')
        for base_k, base_v in base_code_dict.items():
            dis = compare_axis(new_v, base_v)
            if dis < res:
                res = dis
                res_dict[new_k] = base_k
    for i, v in res_dict.items():
        res_dict[i] = base_dict[v]
    return res_dict```


```if __name__ == '__main__':
    print(parse_font_code('1.woff'))```
posted @ 2020-12-15 22:52  旁人怎会懂  阅读(218)  评论(0)    收藏  举报