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 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分析 天_眼_查 字体文件的更多相关文章

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

    0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...

  2. JS 计算时间差,(引入外部字体文件)

    JavaScript Date() 对象: new Date() :时间对象,会把当前时间作为其初始值: setFullYear() :用于设置月份,可有三个参数,setFullYear(year,m ...

  3. underscore.js源码解析【'_'对象定义及内部函数】

    (function() { // Baseline setup // -------------- // Establish the root object, `window` (`self`) in ...

  4. 数据挖掘-diabetes数据集分析-糖尿病病情预测_线性回归_最小平方回归

    # coding: utf-8 # 利用 diabetes数据集来学习线性回归 # diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况. # 数据 ...

  5. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

  6. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  7. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  8. 宏定义中的##操作符和... and _ _VA_ARGS_ _

    1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...

  9. 凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网

    凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网 凡客副总裁被曝离职:或因IPO受阻 2013年05月07日 00:56   每日经济新闻    我有话说     每经 ...

随机推荐

  1. 作业二:分布式版本控制系统Git的安装与使用

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 1.下载安装配置用户名和邮箱. (1)下载安装Github配置 ...

  2. Python 离线 安装requests第三方库

    一.介绍 requests是Python的一个HTTP客户端库,跟urllib,urllib2类似,不过requests的优势在于使用简单,相同一个功能,用requests实现起来代码量要少很多.毕竟 ...

  3. C/C++ const

    一 含义 const修饰的变量在C和C++中的含义是什么?一样吗? 在C中用const修饰的变量仅仅表示这个符合表示的变量不能被赋值,是只读的,那么它与常量有啥区别呢?区别就是一个是常量,一个是变量. ...

  4. nginx 返回数据被截断

    nignx 代理 buffer proxy_buffers 16 512k; proxy_buffer_size 512k;   fastcgi buffer fastcgi_buffers 4 64 ...

  5. 部分安卓机型1px边框无法显示解决方法

    实践发现css样式中使用1px solid 在部分安卓机型无法显示. 网上找到解决方案:使用行内样式设置边框.

  6. 什么是Tensor

    https://blog.csdn.net/kansas_lh/article/details/79321234 tensor是tensorflow基础的一个概念——张量. Tensorflow用到了 ...

  7. PTA数组作业一查找整数

    代码 #include<stdio.h> int main(void){ int a[20],n,flag=0,x; int i; scanf("%d%d",& ...

  8. 我眼里K-Means算法

    在我眼里一切都是那么简单,复杂的我也看不懂,最讨厌那些复杂的人际关系,唉,像孩子一样交流不好吗. 学习K-Means算法时,会让我想起三国志这个游戏,界面是一张中国地图,诸侯分立,各自为据.但是游戏开 ...

  9. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  10. 启动多个logstash脚本

    一台服务器上启动多个logstash脚本 # more logstash_click #!/bin/sh # Init script for logstash # Maintained by Elas ...