关于字体反爬

关于字体反爬

月光魔力鸭

2021-03-24 23:32 阅读 930 喜欢 4 字体反爬

反爬有很多手段,字体反爬就是其中之一。之前一直都是听过,但是却没怎么在实际爬虫中遇到过,最近在一个爬虫题目网站上看到了,试了试,发现还挺麻烦,当然自己从头研究字体肯定麻烦,简单的是模块多的是,选几个就过了。

字体反爬

爬虫与反爬一直在不停的斗争,手段层次不穷。字体反爬算是常见的一种手段,大抵的思路是通过字体文件将浏览器渲染结合起来,让浏览器看到的内容与肉眼看到的内容不一致,达成一定的反爬目的。

比如,我们定义一个字体<1> 但是对应的svg显示为<5> ,那么肉眼看到的是5 ,通过源码或抓取得到的确是1。 之前的时候是通过一个字体文件,现在慢慢演变为动态字体,每次看到的都不同,所以现在我们需要对字体进行解析,得到最终的数据。

反爬

这里有个题目http://glidedsky.com/level/crawler-font-puzzle-1 ,不是打广告哈,关于字体反爬的一个题目。

我按照这个题目进行整理实现思路,可能不具有通用性。

目标地址

http://glidedsky.com/level/web/crawler-font-puzzle-1 ,根据给定的地址,我们可以看到源码与数字是不同的,那么我们可以通过控制台很容易找到这个字体,而且可以找到该字体是通过页面中的base64来指定的字体文件。

示例图

先将base64 转为 ttf 文件

代码或工具都可以: https://www.motobit.com/util/base64-decoder-encoder.asp 工具转换。

代码转换(nodejs):

const base64str = `xxxx由于太长,此处不写了`;//data:font;charset=utf-8;base64, 之后的内容,不要逗号
const fs = require('fs');
fs.writeFileSync('./demo.ttf',Buffer.from(base64str,'base64'));

通过fontcreator软件打开后可以看到,字体展示与unicode标注的都是不同的。

但是...

目前,还没找到除了ocr识别外的更好的办法,之前看文档有说可以从ttf中拿到映射关系的,不过我没处理出来..能力有限。而且,这个我也没有使用ocr,直接使用了一个下标判断。

将ttf解析为xml ,并转为对象,然后获取下标,得到映射

const font = require('font-carrier');
const xml2json = require('xml2json');

//加载字体
let transFont = font.transfer('./demo.ttf');
let str = transFont.toString();
let json = xml2json.toJson(str);
let obj = JSON.parse(json);
let fonts = obj.svg.defs.font.glyph;
let map = {};
//就目前来看,还没找到对应的映射关系,比较理想的是,根据下标,除去第一个,从0开始。
fonts.forEach((t, i) => {
  if (i>0) {
    let code = t.unicode;//4
    let index = i - 1;//0
    //对应的意思就是:给浏览器一个字符串4 ,显示出来是 0 。
    map[code] = index;
  }
})
console.log(map);

剩下的就是一页一页的抓取,然后获取ttf并解析,最终进行匹配了..


关于ocr 一直不太懂,而且python也不会,最近也一直想了解下这部分的内容,正在努力学习中.. 其实一直想实现的就是给定一张图,从图中找到某个字,并返回对应字体在图中的位置..感觉好多地方都会用到,可惜实力不允许,太菜了。

转载请注明出处: https://chrunlee.cn/article/spider-font-back.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
整理一些相关的信息,防止后续再找不到。
最近有个小功能需要一些基础数据,找了一下在小程序上有发现,暂时还没找到他的网站,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到微信变更了加密方式,以前反编译的路子走不通了。
最近看某站壁纸挺好看的,抓了几百张放本地...可总不能每天手动去换吧,就做了一个随机更换的小工具。
docker build 执行yum失败,找不到repo
最开始其实只是网站的一个小改版,导致的需要发送邮件的功能,本身功能不复杂,不做工具的话,几行代码应该就可以搞定的.. 不过后来想想,这个功能应该还是有一定的小需求的,就做成了工具。
写到这里,基本上就完成了我之前一篇文章中写的,我要做一个自己的图床的小程序了。在最初我要做图床的时候,发现在谷歌扩展程序上一无所知,所以才开始学习的这个,到这一步,至少能勉强能跑通自己的小程序了。
之前做了一段时间的上传相关的断点续传和秒传功能,这里整理下大体思路
ubuntu 配置nginx反向代理,这里简单记录下,后续再复习..