关于字体反爬

关于字体反爬

月光魔力鸭

2021-03-24 23:32 阅读 72 喜欢 2 字体反爬

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

字体反爬

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

比如,我们定义一个字体<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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
需求:可能会有在页面加载的时候想执行某个js,例如统计页面的DOM等等。
扩展程序中会有需要请求外部接口获取数据的时候,如果直接在JS中写的话,会跨域,但是谷歌扩展程序支持这种情况,只需要配置一下即可。
写到这里,基本上就完成了我之前一篇文章中写的,我要做一个自己的图床的小程序了。在最初我要做图床的时候,发现在谷歌扩展程序上一无所知,所以才开始学习的这个,到这一步,至少能勉强能跑通自己的小程序了。
chrome 如何查看placeholder样式以及其他伪类样式
最近在做直播,是用的webrtc,然后找的免费的starrtc ,当然,可能由于种种原因吧.. 用起来并没有特别顺畅,后续还希望能够深入这部分,从现在开始学习..当然,websocket 是顺带的,可以用来发消息什么的肯定也是要用到的。
一直有跑着puppeteer在做pdf的生成,可以今天突然发现一个问题:预览与打印生成的PDF不一致,猜测可能是边距导致的,应该是没设置好... 然后当我在本地尝试的时候也发现了这个问题..要么是字符,要么是版本
最近有个小功能需要一些基础数据,找了一下在小程序上有发现,暂时还没找到他的网站,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到微信变更了加密方式,以前反编译的路子走不通了。
接下来,我们综合上面的配置,再加一个选项页面配置,做一个天气预报的小栗子。