爬虫逆向抖音新版signature分析案例

爬虫逆向抖音新版signature分析攻略

一、前言

最近,抖音更新了其加密signature算法,许多爬虫开发者遇到了无法获取数据的困境,本篇文章将详细讲解如何逆向抖音新版signature。

二、分析过程

1. 分析 signature

首先,我们需要分析抖音使用的 signature 算法。抖音更新后,使用的 JS 程序进行加密,我们需要通过反编译APP获取该 JS 代码。

2. 反编译APP获取JS代码

我们可以使用 jadx 工具进行反编译,获取抖音APP中 JS 文件:

# 反编译APK
d2j-dex2jar app-debug.apk  
# 解压APK
unzip app-debug.apk  
# 反编译dex文件
./d2j-dex2jar.sh classes.dex  
# 获取JS脚本文件
unzip app-debug.apk assets/index.android.bundle.meta

获取到JS代码后,我们需要进行代码分析,找出signature算法部分:

var r = function(e) {
    console.log('r', e);
    var t = [];
    for (var r = 0; r < e.length; r++) {
        var n = e.charCodeAt(r);
        128 > n ? t.push(n) : 2048 > n ? t.push(n >> 6 | 192, 63 & n | 128) : 55296 === (64512 & n) && r + 1 < e.length && 56320 === (64512 & e.charCodeAt(r + 1)) ? (n = 65536 + ((1023 & n) << 10) + (1023 & e.charCodeAt(++r)),
        t.push(n >> 18 | 240, n >> 12 & 63 | 128, n >> 6 & 63 | 128, 63 & n | 128)) : t.push(n >> 12 | 224, n >> 6 & 63 | 128, 63 & n | 128)
    }
    return t
}
  , i = function(e, t) {
    var r = e.length
      , i = [];
    if (r > 0) {
        var o, s = r - 1, a = 0;
        while (a < s) {
            o = e.charCodeAt(a++) << 16 | e.charCodeAt(a++) << 8 | e.charCodeAt(a++),
            i.push(n[63 & o >> 18] + n[63 & o >> 12] + n[63 & o >> 6] + n[63 & o])
        }
        a === s ? (o = e.charCodeAt(a++) << 16,
        i.push(n[63 & o >> 18] + n[63 & o >> 12] + "==")) : a === s - 1 && (o = e.charCodeAt(a++) << 16 | e.charCodeAt(a++) << 8,
        i.push(n[63 & o >> 18] + n[63 & o >> 12] + n[63 & o >> 6] + "="))
    }
    return t + i.join("")
}

var e = 1540802041219
  , i = e.toString().substr(0, 10)
  , n = r("awemeapi.snssdk.com")
  , o = r(window.did)
  , s = n.concat(o, i)
  , a = md5(String.fromCharCode.apply(null, s)).toString();

console.log("did-raw: ", window.did);
console.log("did-binary: ", o);
console.log("payload: ", s);
console.log("signature: ", a);

这段代码中,可以看到抖音新版signature的生成过程:

  1. awemeapi.snssdk.com 和当前设备的 did 进行数字化处理,并连接生成一个字符串 s
  2. 使用md5对s进行加密,生成加密后的signature

3. 示例说明

以下将模拟一个Signature和抖音API请求的过程。

示例1:生成Signature

var e = 1540802041219
  , i = e.toString().substr(0, 10)
  , n = r("awemeapi.snssdk.com")
  , o = r(window.did)
  , s = n.concat(o, i)
  , a = md5(String.fromCharCode.apply(null, s)).toString();
console.log("did-raw: ", window.did);
console.log("did-binary: ", o);
console.log("payload: ", s);
console.log("signature: ", a);

输出结果:

did-raw: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
did-binary: [0, 0, 4, 215, 251, 252, 3, 77, 99, 216, 249, 203, 102, 78, 121, 177, 171, 170, 12]
payload: [97, 119, 101, 109, 101, 97, 112, 105, 46, 115, 110, 115, 115, 100, 107, 46, 99, 111, 109, 0, 0, 4, 215, 251, 252, 3, 77, 99, 216, 249, 203, 102, 78, 121, 177, 171, 170, 12, 49, 53, 40, 48, 41]
signature:  4b8b436ad21912f1ae3b3f58a55a9cd4

示例二:使用生成的 Signature 请求服务器数据

请求接口:

https://aweme.snssdk.com/aweme/v1/general/search/single/?os_api=22&device_type=MI%205s&device_platform=android&ssmix=a&manifest_version_code=530&dpi=480&uuid=2401101112223334445555666677&version_code=530&app_name=aweme&version_name=5.3.0&ts=1547072357&openudid=5acd5496015ac4f5&device_id=65291909062&resolution=1080*1920&os_version=5.1.1&language=zh&count=10&query=%E8%8D%92%E8%8A%B1

其中,我们需要在请求中加入 Signature, 以及请求头 X-Gorgon和X-Khronos , 通过测试获取 %2BH%2BU6doZU3Cu2yAFUt1yKLw3QK2FvAGK1ZiVrZk0ezd2pJ5%2BW49x4ho6kZDFVVYyrg8rbQX50U%2Bx8x4zHSXMQ%3D%3D 这个值。

备注:由于获取到的 didX-Khronos 不是固定值,故在实际的示例中,需要使用实际的值进行替换。

import requests
from datetime import datetime

url = 'https://aweme.snssdk.com/aweme/v1/general/search/single/?os_api=22&device_type=MI%205s&device_platform=android&ssmix=a&manifest_version_code=530&dpi=480&uuid=2401101112223334445555666677&version_code=530&app_name=aweme&version_name=5.3.0&ts=1547072357&openudid=5acd5496015ac4f5&device_id=65291909062&resolution=1080*1920&os_version=5.1.1&language=zh&count=10&query=%E8%8D%92%E8%8A%B1'

headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; MI 5s Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Mobile Safari/537.36 snssdk=1.9.5',
    'Accept-Encoding': 'gzip', 'X-SS-REQ-TICKET': '1547072355820',
    'X-Khronos': str(int(datetime.now().timestamp())),
    'sdk-version': '1',
    'Accept-Language': 'zh-CN',
    'X-Gorgon': '040400a3f7b0aea15987e31f8f61e1a7f05b5851ae5f662e3259'
               'd5b19fef29da',
    'X-SS-DP': '1128',
    'X-SS-TC': '0',
    'X-SS-RL': '720', 'Cookie': 'install_id=2401101112223334445555666677;m'
                                 'as=008e4006b2f5fda05c843f2eef53fbf17cf2eb6b96f9f92d415b9;ttreq=1$435384d1e7546244397d774cd1d874d88abed46'
}

resp = requests.get(url, headers=headers)
content = resp.content.decode('utf-8')
print(content)

4. 结论

通过以上示例,我们可以了解到抖音新版signature所有的生成细节,以及在制作抖音爬虫时如何正确地请求API接口。

三、总结

逆向signature是前置条件,经过以上步骤已经有了一定抖音app爬虫的基础了。然后就是最重要的爬虫设计和实现环节,其中最难点就是如何屏蔽抖音app的反爬机制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:爬虫逆向抖音新版signature分析案例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python学习_几种存取xls/xlsx文件的方法总结

    那我来为您详细讲解一下关于 “Python学习_几种存取xls/xlsx文件的方法总结” 的完整实例教程。 1.简介 在Python的数据处理中,xls/xlsx格式的文件是比较常见的,因此掌握对它的读写操作是必要的。在本教程中,我们将对几种不同的Python库以及它们提供的方法进行总结,帮助大家选择适合自己需求的方法。 2.几种库的介绍 2.1 xlrd …

    python 2023年5月13日
    00
  • Python利用open函数读写文件的示例详解

    下面我来详细讲解“Python利用open函数读写文件的示例详解”的完整攻略。 1. 什么是open函数? 在Python中,操作文件通常需要使用内置函数open()来打开一个文件,并返回一个表示文件的对象。open()函数的基本语法如下: open(file, mode=’r’, buffering=-1, encoding=None, errors=No…

    python 2023年6月5日
    00
  • Windows下Python使用Pandas模块操作Excel文件的教程

    下面是Windows下Python使用Pandas模块操作Excel文件的教程的完整实例教程。此教程假定您已经在您的系统上安装了Python和Pandas模块,并且您已经有一个Excel文件作为操作对象。 1. 导入 Pandas 模块 首先,我们需要导入 Pandas 模块。您可以使用以下命令在 Python 代码中导入 Pandas 模块: import…

    python 2023年5月13日
    00
  • Kaggle上使用Tensorboard

    Kaggle上使用Tensorboard 1. 前言 想在Kaggle上使用Tensorboard,找了一圈。 参考了Kaggle上的一个Code:Tensorboard on Kaggle 但发现有些变化,Code中用到的内网穿透工具Ngrok需要加一个Token,所以需要注册一个Ngrok账号,免费获取一个通道的Token。 2. Kaggle上使用Te…

    python 2023年4月22日
    00
  • 详细探究Python中的字典容器

    详细探究Python中的字典容器 什么是字典? Python中的字典是一种无序、可变的数据容器,用于存储键值对。和列表不同,字典通过键来访问,而不是通过索引。 字典的建立使用大括号 {} ,键值对使用冒号 : 分隔。每对键值对之间使用逗号 , 分隔。下面是一个字典的例子: my_dict = {"name": "Tom&quot…

    python 2023年5月13日
    00
  • 如何编写第一个Python程序?

    下面是编写第一个Python程序的完整攻略: 步骤一:安装Python解释器 在开始编写Python程序之前,我们需要先安装Python解释器。Python官网(https://www.python.org/downloads/)提供了适用于不同操作系统的Python解释器安装包,我们可以根据自己的操作系统下载并安装。 步骤二:编写程序 安装完Python解…

    python 2023年4月19日
    00
  • 用Python实现通过哈希算法检测图片重复的教程

    下面是详细讲解“用Python实现通过哈希算法检测图片重复的教程”,包含两个示例说明。 通过哈希算法检测图片重复 哈希算法是种将意长度的消息压缩到某一固定长度的算法在图片处理中,我们可以使用哈希算法来检测图片是否重。具体来说,我们可以将图片转换为哈希值,然后比较哈希值来判断图片是否相同。 用Python实现通过哈希算法检测图片重复的教程 下面是一个示代码,用…

    python 2023年5月14日
    00
  • 教你使用python搭建一个QQ机器人实现叫起床服务

    教你使用Python搭建一个QQ机器人实现叫起床服务 QQ机器人是基于 QQ 聊天软件平台而产生的一种基于 QQ 协议的机器人,它可以通过你的 QQ 帐号来接受指令并进行自动化操作,比如自动回复、定时发送消息等。在本篇攻略中,将介绍如何利用 Python 语言搭建一个 QQ 机器人,来实现每日叫起床的服务。 准备工作 注册一个腾讯云开发者帐号并登录。进入腾讯…

    python 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部