字体反爬

 

1.页面看到的文字实际由另一个字经过字体库映射而得 

 

2.网页会在加载的时候载入字体库 (可能有多个字体库),将此字体下载下来,通过font creator(字体工具)打开可以看到对应表,遍找到了映射关系。(笨方法到这直接对着写map就可以了)

 

3.用python 将.woff的字体文件 转成 XML 读取其中的映射。下图为第一层映射,根据code 可以得到 name (简单的一步映射就直接能得到结果)。

4.天眼查这个还需要再做一层,如图将上一步得到的name值 映射得到id值 ,这个id值就是 刚才fontcreator 看到的汉字的排序。在这里做个map对应即可得到映射汉字。

5.上述方法也还是要写一个map 。下图是"_#103" 所对应的字形,python的这个库肯定有一个方法直接根据字形得到汉字的 ,不然贼蠢,但我没找到。。。欢迎大家补充一下。

附录代码:

from fontTools import unichr
from fontTools.ttLib import TTFont
import re

'''
解析字体方法1:
'''
font = TTFont('./tyc-num.woff')  # 打开文件
# font.saveXML('./tyc-num.xml')

mappings = {}
for k, v in font.getBestCmap().items():
    if v.startswith('uni'):
        # 形如 <map code="0xe040" name="uni45"/>  可直接转换得到结果
        mappings['{:x}'.format(k)] = unichr(int(v[3:], 16))
    else:
        mappings['{:x}'.format(k)] = v

key = re.search('.*u([0-9a-f]{4}).*', str('电'.encode('unicode_escape'))).group(1)
value = mappings[key]
# 得到另一个映射
id = font.getGlyphID(value)

# 根据下载的字体弄个map 再根据 id做key  获取对应value
maps = {'1': '苏', '2': '你'}

 

-------------------------------------------------我是分割线--------------------------------------------------

欢迎关注博主个人公众号,一起来嗨皮呀


 

### Python字体技术的实现方法 #### 使用 Network 看并分析字体请求 对于一些网站采用字体文件形式进行数据加密的情况,可以通过浏览器开发者工具中的 `Network` 面板来找加载的字体资源。这种方法虽然可能较为隐蔽不易被察觉,但对于熟悉开发工具的人来说并不复杂[^1]。 ```python import requests def get_font_file(url): response = requests.get(url) with open('font.woff', 'wb') as file: file.write(response.content) url = "http://example.com/path/to/font/file" get_font_file(url) ``` 此代码片段展示了如何利用 `requests` 库下载指定 URL 的字体文件到本地环境。 #### 处理基于图片加 CSS 实现的字体 当遇到像自如这样的平台使用图像配合样式表(CSS)背景位置属性模拟字符显示时,则需解析网页上的 HTML 和 CSS 文件以定位这些特殊处理过的元素及其对应的视觉表现方式[^2]。 #### 解析自定义字体映射关系 如果目标网站确实应用了 WebFont 或其他类型的矢量字库来进行内容混淆,在获取到相应 `.ttf`, `.woff` 等格式的字体包之后,下一步便是建立原始编码与实际意义之间的转换逻辑。这通常涉及到读取 @font-face 定义以及 font-family 属性值,并尝试匹配已知的标准字体集或者借助第三方服务完成解码工作[^3]。 ```python from bs4 import BeautifulSoup import re html_content = "<HTML CONTENT HERE>" soup = BeautifulSoup(html_content, 'lxml') style_tags = soup.find_all('style') for tag in style_tags: css_text = str(tag.string or '') matches = re.findall(r'@font-face\s*\{([^}]*)\}', css_text) for match in matches: print(match.strip()) ``` 上述脚本可以用来提取页面内的所有 `@font-face` 声明部分,为进一步研究提供了基础材料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值