抖音字体加密

起因:

前天本来接的一个小单子,一开始客户上来问抖音粉丝能获取吗?我寻思这玩意看起来是字体加密,但是我并不知道这个字体文件是多久更新一次,要是像猫眼字体反爬那样,刷新一下就变,那就太孤儿了,所以就磨蹭了一会儿看看是不是会更新(好吧我承认我之前没搞过抖音字体加密所以还没分析过),结果,人客户走了,走了,了。。好吧,索性后面就来分析一波,发现他这个抖音字体加密字体文件是不会变的,那就好整了阿,分分钟的事。

分析:
字体文件:

第一步当然是确定加密字体在哪里,我们可以打开开发者工具,按F12,进入泰克模式(进入开发者工具)
在这里插入图片描述
上图中的框框里就是我们想要的粉丝数量,But,他是一个一个小正方形,在源代码中显示的是JavaScript中的unicode编码,我们获取不到我们想要的粉丝数量。其实这是因为他用了自己的一套字体加密规则,所以我们只要找到这套规则,就可以获取到我们的数据了。

获取字体文件:

在这里插入图片描述
从这个我们就可以进入到他的加载字体的地方,我们进去看到如下:
在这里插入图片描述
而我们要的字体文件就在这个地方,一般的字体文件后缀都是ttfwoff
我们找woff这个文件的,并且在浏览器中可以直接下载他,然后接下来就数撸代码的时候了。

这里我就不再介绍如何去获取页面的信息了,本文主要是分析一下字体加密。

获取字体映射规则:

这里我们介绍fonttool这个工具,有了这个库我们就可以在python中操作字体文件了。

安装:

pip install fontTools

使用:

https://blog.csdn.net/weixin_43411585/article/details/103484643

分析映射规则:

我们在保存的字体文件中找到这个后缀会xml的文件,打开并且找到cmap(cmap 是字符与字体字形对应的表)
在这里插入图片描述
我们看到了一一对应的关系,而这个 num_ 这些有时什么玩意呢?其实这些就算抖音的字体映射了,我们可以利用一些工具获取到他的对应规则
在这里插入图片描述
是不是很简单!当然这种是傻瓜式的操作,后期我会更新一个方法就算他的字体每天变一次都是没有关系的。工具在上面的使用中有介绍,并且有安装链接,我就不再赘述了

代码部分:
# -*- coding: utf-8 -*-
# @Time    : 2020/3/27 23:43
# @Author  : Key-lei
# @File    : 抖音粉丝2020.3.27.py
import requests
from fontTools.ttLib import TTFont
from parsel import Selector

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
# 分析得到得字体文件
url = 'https://s3.pstatp.com/ies/resource/falcon/douyin_falcon/static/font/iconfont_9eb9a50.woff'

# 这些映射关系是再  当前文件夹下xml中找到得
real_2_map = {
    'x': '',
    'num_': '1', 'num_1': '0', 'num_2': '3', 'num_3': '2', 'num_4': '4', 'num_5': '5', 'num_6': '6', 'num_7': '9',
    'num_8': '7',
    'num_9': '8'
}

two_2_sixteenn = {
    "&#xe602": "num_",
    "&#xe603": "num_1",
    "&#xe604": "num_2",
    "&#xe605": "num_3",
    "&#xe606": "num_4",
    "&#xe607": "num_5",
    "&#xe608": "num_6",
    "&#xe609": "num_7",
    "&#xe60a": "num_8",
    "&#xe60b": "num_9",
    "&#xe60c": "num_4",
    "&#xe60d": "num_1",
    "&#xe60e": "num_",
    "&#xe60f": "num_5",
    "&#xe610": "num_3",
    "&#xe611": "num_2",
    "&#xe612": "num_6",
    "&#xe613": "num_8",
    "&#xe614": "num_9",
    "&#xe615": "num_7",
    "&#xe616": "num_1",
    "&#xe617": "num_3",
    "&#xe618": "num_",
    "&#xe619": "num_4",
    "&#xe61a": "num_2",
    "&#xe61b": "num_5",
    "&#xe61c": "num_8",
    "&#xe61d": "num_9",
    "&#xe61e": "num_7",
    "&#xe61f": "num_6",
}


# 拿到字体文件
def get_font(url):
    response_woff = requests.get(url)
    filename = url.split('/')[-1]
    with open(filename, "wb") as f:
        f.write(response_woff.content)
    return filename


def get_map_url(font_name):
    # 把字体文件读取为python能理解的对象
    base_font = TTFont(font_name)
    base_font.saveXML('font.xml')
    # 获取映射规则
    for key in two_2_sixteenn.keys():
        two_2_sixteenn[key] = real_2_map[two_2_sixteenn[key]]
    return two_2_sixteenn


# 格式化输出
def format_str(character):
    character = [x.replace(" ", '') for x in character]
    character = "".join(character)
    character = character.replace(";", '')
    return character


if __name__ == '__main__':
    font_name = get_font(url)
    two_2_sixteenn = get_map_url(font_name)
    # 得到请求页面
    response = requests.get(
        'https://v.douyin.com/77hwgS/',
        headers=headers)
    with open('替换之前的.html', mode='w', encoding='utf-8') as f:
        f.write(response.text)
    new_html = response.text
    # 替换html中得字体
    for key, value in two_2_sixteenn.items():
        new_html = new_html.replace(str(key).lower(), value)
    with open('替换之后的.html', mode='w', encoding='utf-8') as f:
        f.write(new_html)
    # 提取粉丝数量
    selector = Selector(new_html)
    fans_num = format_str(selector.xpath('//span[@class="follower block"]//span[@class="num"]//text()').getall())
    star_num = format_str(selector.xpath('//span[@class="focus block"]//span[@class="num"]//text()').getall())
    like_num = format_str(selector.xpath('//span[@class="liked-num block"]//span[@class="num"]//text()').getall()
    print('粉丝的数量:', fans_num)
    print('关注的数量:', star_num)
    print('赞的数量:', like_num)

效果:

在这里插入图片描述

github传送门:https://github.com/Key-lei/ZitiSpider/tree/master

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值