GlidedSky 字体加密1

一个月没写文章了。。。

还是这个网站,字体加密1, 不过这个 1 比较简单。我会写的很详细,大佬轻喷,内容适合新手小白看,也是自己记录一下,方便自己理解查看。

字体加密:

字体文件的本质是,给定字符、字号等参数,输出一组像素点信息,用于在设备上展示。

特别简单一点来说,就是网页上显示数据和你真实获取到的数据,通过某一种关系表连接起来。这样就可以达到 1 是 2, 3 是 7 的效果。我说的都是比较浅显的理解,可以去百度或者 Google 一下。我截个图理解一下。

上面的图应该可以帮助你理解一下。当然这是简单的字体加密。

而现在我们需要拿真实的响应数据,根据对应关系,去匹配页面上你所看到的数据。

其实这个对应关系也就是字体文件,需要找到这个字体文件。

第一步:打开网站,打开 network

打开网页你会看到,你看到的和你拿到的数据并不是一致,所以有时候眼睛看到的也不一定是真的。

而且当你刷新页面的时候,你拿到的数据和上一次也不一样,说明字体文件更新了。所以最好把这 1000 页的 HTML 内容保存下来,方便理解。

找到字体文件:

第二步:就是处理这个字体加密

拿到的是 base64 加密的数据,上面的图圈起来的 base64 后面的,不要把前面的内容也搞出来,解密后保存为 ttf 文件。

至于怎么获取这 1000 页的内容,看你自己

直接上代码:

1 、获取页面的 base64 加密的字体文件。使用的库

import requests
from lxml import etree

import tools
import base64
from fontTools.ttLib import TTFont   # 字体解析库
import xml.dom.minidom
from bs4 import BeautifulSoup
f = open(f'page/font-puzzle-{i}.html').read()
soup = BeautifulSoup(f, "html.parser")
html = str(soup.select('style'))
str_base64 = html.split('base64,', 1)[1]
font_face_base64 = str_base64.split(') format', 1)[0]
# base64 解密
b = base64.b64decode(font_face_base64)
# 保存为 ttf 格式的文件
with open('ttfji/{}.ttf'.format(i), 'wb') as f:
    f.write(b)

font = TTFont('ttfji/{}.ttf'.format(i))
# 转为 xml 格式文件,并保存
font.saveXML('dictxml/{}.xml'.format(i))

可以使用工具 FontCreator 打开,给大家百度网盘的链接:

链接: https://pan.baidu.com/s/1xzdNQeOUX7JHACpG3CJb_A 提取码: ebcq 复制这段内容后打开百度网盘手机App,操作更方便哦

打开就是这样:

而 xml 文件中是这样:其实是没有 10 的,name 向上对应就是你打开 ttf 看到的。GlyphOrder 中显示的就是对应关系。

而 name 的值代表的数字,就是自己个翻译过来的数字。可以看看 cmap.

也就是这样:该字体加密恰巧数字对应它自己的英文名。每一个字体加密都需要去找 name 对应的 value .

dict = {
            'zero': '0',
            'one': '1',
            'two': '2',
            'three': '3',
            'four': '4',
            'five': '5',
            'six': '6',
            'seven': '7',
            'eight': '8',
            'nine': '9',
        }

到这里基本就理解完了,剩下的就是怎么获取 xml 中的对应关系,就是写代码了。理解了写代码就容易多了。

newdict = {}
dom = xml.dom.minidom.parse('dictxml/{}.xml'.format(i))
root = dom.documentElement
bb = root.getElementsByTagName('GlyphID')
for j in range(1, 11):
    # 下标从 1 开始,获取的是zero,
    k = bb[j].getAttribute("name")
    # 在字体文件 xml 中对应关系就是 j-1, 也就是0, zero对应的就是0,注释仅针对第一个字体文件
    # 建立对应关系,取出真实的 name 对应的数字。
    newdict[dict[k]] = str(j - 1)

完整代码,公众号后台回复 ‘font’获取。

本文分享自微信公众号 - Python爬虫scrapy(python_scrapy)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏中科院渣渣博肆僧一枚

ET.parse().getroot()

Creates and returns a tree iterator for the root element. The iterator loops ove...

16830
来自专栏测试技术圈

Sonar Scanner系列之架构与Java篇

本文系列将介绍Sonar在实际工程项目中落地的场景,例如: 1)多语言项目的扫描,如JAVA/JS/C++/C#/PLSQL 2)多分支扫描 3)覆盖率如何统计...

12310
来自专栏码客

JqueryForm的使用方式

上面的第一种情况也可以用jquery ajax来实现 但是一旦表单中有文件上传就必须用jqueryform了

16020
来自专栏码客

Apache Tomcat 负载均衡 集群

Apache配置负载均衡和集群使用mod_jk的方式比较多。 但是mod_jk已经停止更新,并且配置相对复杂。 Apache2.2以后,提供了一种原生的方式配置...

7110
来自专栏好好学java的技术栈

Java SSM 框架面试,附答案!!!

作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。

9530
来自专栏码客

Nginx Tomcat 负载均衡 集群

Nginx和Tomcat的负载均衡配置 只能用http 协议 但是nginx的优秀性能 值得你去尝试

8340
来自专栏菲宇

微信小程序视图层之wxml

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

7620
来自专栏码客

android广播

android广播其实上是发布-订阅模型,发布有两种方式,订阅也有两种方式 发布的两种方式是无序方式(普通广播)和有序方式(有序广播) 订阅的两种方式是静态订阅...

8420
来自专栏码客

iOS XMPP系列教程(Swift)一 概述与环境搭建

现在很多软件都加入了聊天功能,也有许多公司直接提供了app聊天的组件,简单集成就行,但是弊端在于组件一是要收费,二是不灵活,没法自定义

4910
来自专栏前端菜鸟变老鸟

WEB性能(7)--XMLHttpRequest

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

6810

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励