吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3147|回复: 20
收起左侧

[Python 原创] 记一次字体反爬

[复制链接]
仿佛_一念成佛 发表于 2023-4-30 21:05
本帖最后由 仿佛_一念成佛 于 2023-4-30 21:17 编辑

前言

最近在网上冲浪,看到有喜欢的网页内容,开开心心的复制内容打算发给我的好兄弟看,但是一看发出去的内容和网站上的内容不一样,当时我就奇了怪了,怎么回事呢。在经过半天的调研时间,我发现原来这一类技术叫做字体反爬。有了目标那么就明白了,直接分析是个什么情况

出带着十六岁化女儿发作寺庙祈福。 # 复制的内容
我带着十六岁的女儿来到寺庙祈福。 # 网站显示内容

过程

很快啊,我就在网页源代码上看到了特别的东西

iLZdbU.png

仔细一看 font-face 元素。这是什么呢?

问的好!上百度!

@ font-face的是一个CSS规则,允许你输入自己的字体出现在网站上,即使在特定的字体在访问者的计算机上没有安装。这条规则最重要的是,它为设计师打开了一个全新的世界。您可以使用任何你喜欢的字体。

简单来讲,就是这个css元素来修改了网站上的显示内容和原内容。

来看看font-face里面都有什么吧

  1. font-family # 不管
  2. font-display # 不管
  3. font-weufgt # 不管
  4. font-style # 不管
  5. src # 关键内容

前四个都是无关紧要的,最后一个才是最重要的。那么它又是什么呢?

问的好!

它是一个网络链接,指向外部的网络链接。是一个字体库文件,在这个字体库文件里能够找到隐藏的文字和显示的文字

当然,看网页源代码未免也太枯燥了,抓包也能够达到一样的效果。在前言提到这是关于字体反爬,那么我们选择font找到文件下载到本地也是可以的,具体步骤请看图

iLZPiQ.png

很快啊,我就下载过来了。但是怎么打开呢?

问的好!

下载一个FontCreator能够打开,当然,用vscode安装一些插件也能够直接打开(不愧是最强的vscode啊

这里就用FontCreator 打开了,请看图

iLZYCX.png

是不是感觉无从下手?

我也是这么想的,那就先放在这里了。先吃饭

很快啊,过了两个半小时,我脑子突然灵光一闪,文字的code-points对应的是什么呢?

iLi4VN.png

又是两个半小时,我知道了!

code-points对应的是文字的映射内容!

打个比方,以上图为例,文字它的code-points是什么呢?

没错,是$7406

这又代表什么呢?

我们用FontCreator来搜索一下

iLiCUa.png

结果是。这代表着在网站上显示的文字和审查元素里的文字分别理。

懂了这个字体后那么就好办多了,能够用python来批量获取原始文字和映射文字了

实现

模块 TTFont

安装:TTFont

导入:from fontTools.ttLib import TTFont

一个小函数

def font():
    dict_translate = {}
    # 加载字体文件:
    font = TTFont('1.woff') # 需自己下载或者正则匹配字体文件
    # 获取字体编码:
    font_map = font.getBestCmap() # 获取它的unicode和映射的unicode(code-points)
    # 获取字体编码对应的字体:
    font_map = {hex(k): v for k, v in font_map.items()}
    for key, value in font_map.items():
        # print(key, value)
        key = chr(int(key, 16)) # 把得到的十六进制转换为中文字符
        value = value.replace('uni', '\\u')
        values = value.encode().decode('unicode_escape') # unicode转中文
        dict_translate[key] = values
    return dict_translate

把得到的映射字典再作为返回值甩到另外一个函数里

def translate_strs(font_dict, strs): # 参数为上一个函数的字典和需要翻译的内容
    for i in range(0, len(strs)):
        if strs[i] in font_dict.keys():
            strs = strs.replace(strs[i], font_dict[strs[i]]) # 进行替换
    print(strs)

iLimoF.png

那么到这里也就差不多结束了,剩下的就是python的工作了,我就又可以继续网上冲浪了

结言

字体反爬从来就不是一个很难的内容,相比验证码,那真是小巫见大巫。而随着反爬和爬虫的高速发展使,很有可能今天的内容对于明天就是无用功,一直学习下去才能够不被淘汰。

最后,相关类型的网站有很多,在这里就不提供了。我只提供思路,代码也不能对所有的网页都生效。不过,持之以恒的学习能够让代码一直的更新迭代,一直的有效!

免费评分

参与人数 6吾爱币 +12 热心值 +6 收起 理由
Justman + 1 + 1 我很赞同!
Fiverya + 1 + 1 谢谢@Thanks!
wizarrr + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xlln + 1 + 1 我很赞同!
话痨司机啊 + 2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Timoney 发表于 2023-5-1 01:58
本帖最后由 Timoney 于 2023-5-1 05:12 编辑

有意思,受教了~

补充下,code-points那里填的是Unicode字符集的编码,Unicode是字符编码标准之一,每个字都有一个唯一的编码,一般由数字和字母构成。

比如理的unicode编码就是7406,字的unicode编码可以通过一些在线字典查到。

字体文件比如ttf文件里的每个字体其实只是矢量图,为了能让浏览器、系统之类的能正确认出和解析这些矢量图,就得给它们一个唯一的编码。
seansyx 发表于 2023-4-30 22:01
wangguang 发表于 2023-4-30 22:17
 楼主| 仿佛_一念成佛 发表于 2023-4-30 23:06
wangguang 发表于 2023-4-30 22:17
老哥网站贴个链接

搜索一下字体反爬这种网站多了去了
Zhaofeiyan 发表于 2023-4-30 23:21
讲得很清楚,可以安装在本地电脑吗
 楼主| 仿佛_一念成佛 发表于 2023-4-30 23:54
Zhaofeiyan 发表于 2023-4-30 23:21
讲得很清楚,可以安装在本地电脑吗

有python环境就可以
 楼主| 仿佛_一念成佛 发表于 2023-5-1 04:44
Timoney 发表于 2023-5-1 01:58
有意思,受教了~

补充下,code-points那里填的是Unicode字符集的编码,Unicode是字符编码标准之一,每个 ...

原来如此 感谢指教
wangkaixuan0122 发表于 2023-5-1 07:43
wangguang 发表于 2023-4-30 22:17
老哥网站贴个链接

谢谢分享

免费评分

参与人数 2吾爱币 -4 热心值 +1 收起 理由
李玉风我爱你 -3 请勿灌水,提高回帖质量是每位会员应尽的义务!
wangguang -1 + 1 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

zhiaipojie0313 发表于 2023-5-1 09:34
讲得很清楚,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表