[JS 分析] 天_眼_查 字体文件

0. 参考

js分析 猫_眼_电_影 字体文件 @font-face

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 Selectorfrom fontTools.ttLib import TTFonturl = '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)                       #红:32418name = cmap_dict.get(code, None)    #_#228if name is not None:# index = glyf_list.index(name)   #238# rst = ocr[index]                #美rst = mydict.get(name, t)else:rst = tresult.append(rst)print(text, ' >>> ', ''.join(result))print('#'*10)
View Code

 

6.运行结果 

 

转载于:https://www.cnblogs.com/my8100/p/js_tianyancha.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入学习Redis(4):哨兵

前言在 深入学习Redis&#xff08;3&#xff09;&#xff1a;主从复制 中曾提到&#xff0c;Redis主从复制的作用有数据热备、负载均衡、故障恢复等&#xff1b;但主从复制存在的一个问题是故障恢复无法自动化。本文将要介绍的哨兵&#xff0c;它基于Redis主从复制&#xff0c;…

1805. 字符串中不同整数的数目

1805. 字符串中不同整数的数目 给你一个字符串 word &#xff0c;该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。例如&#xff0c;“a123bc34d8ef34” 将会变成 " 123 34 8 34" 。注意&#xff0c;剩下的这些整数为&#xff08;相邻彼此至…

经天测绘测量工具包_公共土地测量系统

经天测绘测量工具包部分-乡镇第一师 (Sections — First Divisions of Townships) The PLSS Townships are typically divided into 36 Sections (nominally one mile on a side), but in the national standard this feature is called the first division because Townships …

洛谷 P4012 深海机器人问题【费用流】

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1&#xff1a; 1 1 2 2 1 2 3 4 5 6 7 2 8 10 9 3 2 0 0 2 2 2 输出样例#1&#xff1a; 42 说明 题解&#xff1a;建图方法如下&#xff1a; 对于矩阵中的每…

day5 模拟用户登录

_user "yangtuo" _passwd "123456"# passd_authentication False #flag 标志位for i in range(3): #for 语句后面可以跟else&#xff0c;但是不能跟elifusername input("Username:")password input("Password:")if username _use…

opencv实现对象跟踪_如何使用opencv跟踪对象的距离和角度

opencv实现对象跟踪介绍 (Introduction) Tracking the distance and angle of an object has many practical uses, especially in robotics. This tutorial explains how to get an accurate distance and angle measurement, even when the target is at a strong angle from…

spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config

我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的&#xff0c;这次我们来看下spring cloud 团队自己创建的一个全新项目&#xff1a;Spring Cloud Config.它用来为分布式系统中的基础设施和微服务提供集中化的外部配置支持&#xff0c;分为服务端和客户端两个…

458. 可怜的小猪

458. 可怜的小猪 有 buckets 桶液体&#xff0c;其中 正好 有一桶含有毒药&#xff0c;其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药&#xff0c;你可以喂一些猪喝&#xff0c;通过观察猪是否会死进行判断。不幸的是&#xff0c;你只有 minutesToTest…

熊猫数据集_大熊猫数据框的5个基本操作

熊猫数据集Tips and Tricks for Data Science数据科学技巧与窍门 Pandas is a powerful and easy-to-use software library written in the Python programming language, and is used for data manipulation and analysis.Pandas是使用Python编程语言编写的功能强大且易于使用…

图嵌入综述 (arxiv 1709.07604) 译文五、六、七

应用 图嵌入有益于各种图分析应用&#xff0c;因为向量表示可以在时间和空间上高效处理。 在本节中&#xff0c;我们将图嵌入的应用分类为节点相关&#xff0c;边相关和图相关。 节点相关应用 节点分类 节点分类是基于从标记节点习得的规则&#xff0c;为图中的每个节点分配类标…

聊聊自动化测试框架

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”有…

1971. Find if Path Exists in Graph

1971. Find if Path Exists in Graph 有一个具有 n个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 …

移动磁盘文件或目录损坏且无法读取资料如何找回

文件或目录损坏且无法读取说明这个盘的文件系统结构损坏了。在平时如果数据不重要&#xff0c;那么可以直接格式化就能用了。但是有的时候里面的数据很重要&#xff0c;那么就必须先恢复出数据再格式化。具体恢复方法可以看正文了解&#xff08;不格式化的恢复方法&#xff09;…

python 平滑时间序列_时间序列平滑以实现更好的聚类

python 平滑时间序列In time series analysis, the presence of dirty and messy data can alter our reasonings and conclusions. This is true, especially in this domain, because the temporal dependency plays a crucial role when dealing with temporal sequences.在…

基于SmartQQ协议的QQ自动回复机器人-1

0. 本项目的原始代码及我二次开发后的代码 1. 软件安装:【myeclipse6.0 maven2】 0. https://blog.csdn.net/zgmzyr/article/details/6886440 1. https://blog.csdn.net/shuzhe66/article/details/45009175 2. https://www.cnblogs.com/whgk/p/7112560.html<mirror><…

1725. 可以形成最大正方形的矩形数目

1725. 可以形成最大正方形的矩形数目 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。 如果存在 k 同时满足 k < li 和 k < wi &#xff0c;就可以将第 i 个矩形切成边长为 k 的正方形。例如&#xff0c…

帮助学生改善学习方法_学生应该如何花费时间改善自己的幸福

帮助学生改善学习方法There have been numerous studies looking into the relationship between sleep, exercise, leisure, studying and happiness. The results were often quite like how we expected, though there have been debates about the relationship between sl…

Spring Boot 静态资源访问原理解析

一、前言 springboot配置静态资源方式是多种多样&#xff0c;接下来我会介绍其中几种方式&#xff0c;并解析一下其中的原理。 二、使用properties属性进行配置 应该说 spring.mvc.static-path-pattern 和 spring.resources.static-locations这两属性是成对使用的&#xff0c;如…

深挖“窄带高清”的实现原理

过去几年&#xff0c;又拍云一直在点播、直播等视频应用方面潜心钻研&#xff0c;取得了不俗的成果。我们结合点播、直播、短视频等业务中的用户场景&#xff0c;推出了“省带宽、压成本”系列文章&#xff0c;从编码技术、网络架构等角度出发&#xff0c;结合又拍云的产品成果…

学习总结5 - bootstrap学习记录1__安装

1.bootstrap是什么&#xff1f; 简洁、直观、强悍的前端开发框架&#xff0c;说白了就是给后端二把刀开发网页用的&#xff0c;让web开发更迅速、简单。 复制代码 2.如何使用&#xff1f; 如图所示到bootstrap中文网进行下载 复制代码 下载完成之后&#xff0c;如图所示&#x…