前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GlidedSky 字体加密1

GlidedSky 字体加密1

作者头像
andrew_a
发布2019-11-07 15:25:16
5973
发布2019-11-07 15:25:16
举报

一个月没写文章了。。。

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

字体加密:

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

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

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

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

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

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

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

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

找到字体文件:

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

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

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

直接上代码:

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

代码语言:javascript
复制
import requests
from lxml import etree

import tools
import base64
from fontTools.ttLib import TTFont   # 字体解析库
import xml.dom.minidom
from bs4 import BeautifulSoup
代码语言:javascript
复制
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 打开,给大家百度网盘的链接:

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

打开就是这样:

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

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

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

代码语言:javascript
复制
dict = {
            'zero': '0',
            'one': '1',
            'two': '2',
            'three': '3',
            'four': '4',
            'five': '5',
            'six': '6',
            'seven': '7',
            'eight': '8',
            'nine': '9',
        }

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

代码语言:javascript
复制
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’获取。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫scrapy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档