js分析 天_眼_查 字体文件
0. 参考
1. 分析
1.1 定位目标元素
1.2 查看网页源代码
1.3 requests 请求提取得到大量错误信息
对比猫_眼_电_影抓取到unicode编码,天_眼_查混合使用正常字体和自定义字体,难点在于如何从 '红' 转化为 '美'。
一开始认为一定有js进行了转化,最后发现直接通过 FontCreator 搜索 '红' 返回结果为 '美' 。。。
1.4 查看目标元素 CSS Computed 信息,使用了网络请求字体
1.5 查看 字体文字 请求
1.6 使用 FontCreator 打开字体文件 {'eight': 0, 'four': 1} 能够解密上文的数字映射
1.7 ctrl + f 搜索 ‘红’ 出现对应的 '美',注意 hex(ord('红')) 结果为 '0x7ea2' ,也可搜索十进制的unicode编码 32418
1.8 全局搜索 tyc-num
1.9 全局搜索 tyc-num.woff
1.10 全局搜索 font.css 看起来是动态生成文件(每天一更,使用不同的中文字集合)
2. JS分析
线索:全局搜索 .tyc-num tyc-num
根据下文 xml 文件信息考虑搜索 0x, 也可以考虑搜索 js 将中文转为 unicode 的方法关键字, 以及 65535/65536
另外不经意看到 'code point' 相关代码
最终还是找不到如何从 '红' 转 '美' 的相关 js 代码
考虑到上文 FontCreator 搜索 '红' 返回结果为 '美',似乎可以直接绕开 js 解密。。。
3. 字体文件分析
3.1 字体文件 woff 转 xml
详见参考文章
对比前后两天下载的 woff 字体文件,应该是批量生成的历史文件
3.2 根据步骤 1.7 搜索 '7ea2' 结果集中在 <cmap>
3.3 根据上图继续搜索 '_#228', 根据参考文章可知,下图方框的 name="_#228" 对应于某个字形定义,用于渲染显示
4. 使用 python 实现 '红' >>> '美'
思路:提取 '红',计算unicode编码,根据 <cmap> 匹配到name='_#228', 再使用 '_#228' 根据 <glyf> 到某一字形定义'美'
4.1 fontTools 读取 <cmap> 字典 {十进制的unicode编码: '_#xxx', ...}
4.2 fontTools 读取 <glyf> name 列表 ['_#xxx', ...]
4.3 手动建立真实字符列表
使用微信小程序识别效果令人惊叹
成功对应
5. 完整代码
import requests from scrapy import Selector from fontTools.ttLib import TTFont url = 'https://www.tianyancha.com/company/59837300?' ocr = """ .01234689愿功近西真差全当表华 心八姐六防金步夫尚放很子变提便司依密林住 诸职建保快左亦节特势善她气国族朝叫甚合论 选船三起况员些突觉拿共没边条刘奇先口约最 着立德留治根降且马手大去细无増问物联同害 找连父待加母礼受之张方价臣识考足看似始也 维九终业满思帝及声望干黄动房右到属府绝跟 许云际收火二历回营得设数苦目易体那切年查 字安研容资社品江为破罗把吗笑土另听片客本 代产走布已告喜虽若省算企置影书形未复东四 求任孩再高失极自现点比谓花级河师罪案黑直 争革乎由程响英费反像红应注将视决面别美达 示县计宗清开春威克台护天度飞路分京次学就 质五守做平何间轻重击才队即包敢会卫致装这 儿关欲说消新系围亲参供写亚改道城团地件敌 量必干答陈较精周相 """.replace('\n', '') print(len(ocr)) font = TTFont('tyc-num_1.woff') cmap = font['cmap'] cmap_dict = cmap.getBestCmap() print(len(cmap_dict)) glyf_list = list(font['glyf'].keys()) print(len(glyf_list)) mydict = dict((k, v.strip()) for k, v in zip(glyf_list, ocr)) print(mydict) r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) print(r.status_code, len(r.content)) sel = Selector(text=r.text) # text = '45619.888888万红元 6887-82-60' # 15298.000000万美元 2007-03-26 for text in sel.css('.tyc-num::text').extract(): result = [] for t in text: code = ord(t) #红:32418 name = cmap_dict.get(code, None) #_#228 if name is not None: # index = glyf_list.index(name) #238 # rst = ocr[index] #美 rst = mydict.get(name, t) else: rst = t result.append(rst) print(text, ' >>> ', ''.join(result)) print('#'*10)
6.运行结果
js分析 天_眼_查 字体文件的更多相关文章
- js分析 猫_眼_电_影 字体文件 @font-face
0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...
- JS 计算时间差,(引入外部字体文件)
JavaScript Date() 对象: new Date() :时间对象,会把当前时间作为其初始值: setFullYear() :用于设置月份,可有三个参数,setFullYear(year,m ...
- underscore.js源码解析【'_'对象定义及内部函数】
(function() { // Baseline setup // -------------- // Establish the root object, `window` (`self`) in ...
- 数据挖掘-diabetes数据集分析-糖尿病病情预测_线性回归_最小平方回归
# coding: utf-8 # 利用 diabetes数据集来学习线性回归 # diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况. # 数据 ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- 宏定义中的##操作符和... and _ _VA_ARGS_ _
1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...
- 凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网
凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网 凡客副总裁被曝离职:或因IPO受阻 2013年05月07日 00:56 每日经济新闻 我有话说 每经 ...
随机推荐
- python 条件分支与循环
一.if判断: 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...
- python之动态参数 *args,**kwargs和命名空间
一.函数的动态参数 *args,**kwargs, 形参的顺序1.你的函数,为了拓展,对于传入的实参数量应该是不固定,所以就需要用到万能参数,动态参数,*args, **kwargs 1,*args ...
- badboy安装及使用
badboy下载 下载地址:http://www.badboy.com.au/download/index 直接点击[continue] badboy安装 badboy录制 默认是录制状态 访问sog ...
- linux下将普通用户加入到docker组,使它可以运行docker命令
方法特别简单 gpasswd -a ${USER} docker eg: gpasswd -a jenkins docker 然后使用jenkins用户就可以执行docker命令了
- 【转载】C++ vector的用法
http://www.cnblogs.com/Nonono-nw/p/3462183.html
- 关于缓存和 Chrome 的“新版刷新”
在读本文前你要确保读过我的上篇文章<扼杀 304,Cache-Control: immutable>,因为本文是接着上文写的.上文说到,在现代 Web 上,“条件请求/304 响应”绝大多 ...
- Coroutine的原理以及实现
最近在写WinForm,在UI界面需要用到异步的操作,比如加载数据的同时刷系进度条,WinForm提供了不少多线程的操作, 但是多线程里,无法直接修改主线程里添加的UI的get/set属性访问器(可以 ...
- mask rcnn
Mask RCNN Mask RCNN 中主要改进是在faster rcnn中box regression 的branch 上加入mask prediction branch,能够得到点到点的预测. ...
- Python3 字符串与hex之间的相互转换
在字符串转换上,python2和python3是不同的,在查看一些python2的脚本时候,总是遇到字符串与hex之间之间的转换出现问题,记录一下解决方法. 1. 在Python2.7.x上,hex字 ...
- php程序员招聘
岗位要求:-1年以上WEB端开发经验.-熟悉PHP语言的开发工作,熟练掌握LNMP开发,并具备良好的编程风格.-熟悉 http协议,掌握css js ajax 相关技术应用.-熟悉关系型数据,NOSQ ...