惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
V
V2EX
量子位
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 【当耐特】
爱范儿
爱范儿
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
小众软件
小众软件
IT之家
IT之家
博客园_首页
博客园 - 聂微东
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗

遐说

2026第一场日出日落-黄山 [徒步]宁波九龙爱心线 [徒步]仙居公盂徒步+丽人谷溯溪(多图) 文献引用批量标注蓝色-Zotero/EndNote [出差]内蒙草原风光 [徒步]浙东小九寨 [徒步]西湖小猫线 微软Office365家庭版拼车5年180 2024浏阳跨年烟火 一路向北-广西 落日余晖——武汉东湖 博士论文盲审通过 青海出差 我开盒了我自己 hexo-butterfly+artalk无法显示文章PV浏览次数 记第一次进藏 2024川西大环线 Python读取NetCDF文件-裁剪&计算 2024武汉东湖樱花园 zotero批量修改条目语言解决”等”和”et al”混排问题 torch_geometric_temporal安装报错找不到to_dense_adj 武汉冻雨&乡村春节 云南镇雄县凉水村滑坡:卫星影像解析 博客聚合平台RSS订阅-BlogFinder&博友圈&十年之约 腾讯云CDN正式取消免费10G流量包 2023跨年闲逛武汉 观感|小米SU7技术发布会 【留痕】解密微信聊天记录工具:年度报告、聊天导出一键搞定! 小米电脑管家 vs. MIUI+: 手机与PC协同体验大比拼! Waline私有化部署(Docker+VPS)
记某站字体混淆解析方案
Dorad · 2024-07-24 · via 遐说

记某站字体混淆解析方案

发表于|更新于|编程Python

|总字数:716|阅读时长:2分钟|浏览量:|

因需,需定期抓取某网站数据进行分析。

近期该网站HTTP POST获取的数据采用字体加密,以避免被简单的抓取。

具体而言,返回的关键数据被套上:#MI35nElclt_1721813502875otltag䓡䑱#FontTag

其中括号内#(MI35nElclt_1721813502875)otltag(䓡䑱)#FontTag 分别是字体文件名称和字体加密后的数据。

难点:

  1. 字体文件是动态的,无法“一次识别,一直使用”;

  2. 字体直接 OCR 识别,效率低、费用高、准确率低(存在生僻字)。

¶解决思路

分析字体文件后发现,所用字体文件中,字体并不多,仅 1k+个。

在综合采用 OCR 等思路后,最后得到基于 imagehash 的方案如下:

  1. OCR 识别:下载字体文件,采用WindowsPowerToys 对字体文件进行识别解析,并人工校正;

  2. 建立字典:采用footToolsPILttf字体文件中的每个字渲染为 64*64 的图片,并采用imagehash计算其hash值,并根据 OCR 识别结果,建立hash:char 字典;

  3. 字体文件解析:每次抓取数据后,针对字体文件的每个字符,计算其imagehash,并从hash:char 字典中找到相似度最高的 char 作为对应字符,得到字体文件unicode:char字典;

  4. 数据解析:根据字体文件unicode:char字典,解析返回的数据。

¶核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import imagehash
from fontTools.ttLib import TTFont
from PIL import Image, ImageDraw, ImageFont

def _calculate_imagehash(font_path, char, font_size=64):
font = ImageFont.truetype(font_path, font_size)
ascent, descent = font.getmetrics()
bbox = font.getbbox(char)
text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]

image = Image.new('L', (font_size, font_size), 255)
draw = ImageDraw.Draw(image)

draw.text(((image.width-text_width)//2, (image.height-ascent-descent)//2), char, font=font, fill="black")

image_hash = imagehash.average_hash(image)
return image_hash

¶优劣分析

¶优势

  1. 可动态解析字体文件,无需畏惧网站动态改变字体文件所涵字体数量;

  2. 单个网站的多个页面,构建单个hash:char 即可,后续若有新字体加入,适当追加即可;

  3. 当字体存在细微修改,其所构建的hash计算相似度时依旧有效;

  4. 相较于 OCR 方式,准确性更有保障;

¶劣势

  1. 由于每次需要解析整个字体文件,耗时略长(1k字符/5s),不过在可接受范围;

  2. 当网站更新字体时,可能无法继续工作;

¶参考

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 遐说

请喝果茶

  • Wechat

    Wechat

  • Alipay

    Alipay