爬虫逆向抖音新版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日

相关文章

  • 如何在 Redis 中设置和使用过期时间?

    如何在 Redis 中设置和使用过期时间? 在 Redis 中,可以使用过期时间来控制键的生命周期。当键的过期时间到期时,Redis 会自动删除该键。在本文中,我们将介绍如何在 Redis设置和使用过期时间的完整使用攻略,包括设置过期时间、获取过期时间、删除过期键等操作。 步骤1:连接 Redis 数据库 在 Python 中,我们可以使用 Redis-py…

    python 2023年5月12日
    00
  • Python判断两个文件是否相同与两个文本进行相同项筛选的方法

    Python可以通过比较文件的md5值或者sha1值来判断两个文件是否相同。如果两个文件的md5或sha1值一样,那么这两个文件内容就相同,反之则不同。在Python中可以使用hashlib库来计算文件的md5和sha1值。下面是判断两个文件是否相同的示例代码: import hashlib def get_file_md5(file_path): ”’计…

    python 2023年6月3日
    00
  • Python 数据类型中的字符串和数字

    Python 数据类型中的字符串和数字 在Python中,字符串和数字是两种非常常见的数据类型。学习掌握这两种数据类型,对于Python编程入门非常重要。接下来,我们将详细讲解Python数据类型中的字符串和数字。 字符串 字符串是一种表示文本数据的数据类型,可以使用单引号或双引号表示,例如: str1 = ‘Hello, world!’ str2 = &q…

    python 2023年5月14日
    00
  • Python 使用Opencv实现目标检测与识别的示例代码

    下面就为大家详细讲解 Python 使用 Opencv 实现目标检测与识别的示例代码的完整攻略。 一、前置知识 在学习本篇攻略之前,你需要掌握以下知识: Python 语法基础 图像处理基础 Opencv 库的基本使用 二、环境准备 在使用 Python 实现目标检测与识别之前,我们需要先安装以下环境: Python 3.x Opencv-python Nu…

    python 2023年5月18日
    00
  • Python中的支持向量机SVM的使用(附实例代码)

    Python中的支持向量机SVM的使用(附实例代码) 支持向量机(Support Vector Machine,SVM)是一种非常常见的分类算法,在解决复杂问题时有着很好的性能。 安装必要的库 要使用SVM,需要安装一些库。这里推荐使用以下库: NumPy:用于支持向量机的数学运算和操作 Pandas:用于数据读取和处理 Scikit-learn:包含SVM…

    python 2023年5月23日
    00
  • python random从集合中随机选择元素的方法

    要从一个Python集合中随机选择元素,你可以使用random模块的choice()函数。random.choice()函数需要一个集合对象作为参数,并从该集合随机选择一个元素。 以下是使用Python random模块的choice()函数从集合中随机选择元素的步骤: 步骤1:导入random模块 在使用random模块之前,需要导入该模块。你可以使用以下…

    python 2023年5月13日
    00
  • 远程linux xshell下输出中文乱码解决方法

    解决远程 Linux Xshell 下输出中文乱码需要以下几个步骤: 配置远程终端的 locale 在远程终端上输入以下命令: $ locale 如果你没有设置过 locale 或者 locale 不完整(缺少 zh_CN.UTF-8 等中文相关项),需要手动设置 locale。下面以 Ubuntu 系统为例,安装 zh_CN.UTF-8 locale: $…

    python 2023年5月20日
    00
  • 详解用Python把PDF转为Word方法总结

    详解用Python把PDF转为Word方法总结 在这篇文章中,我们将详细讲解如何使用Python将PDF文件转换成Word文档。具体过程如下: 步骤一:安装必要的库 首先,我们需要安装一些必要的库来支持我们的Python程序执行: pip install PyPDF2 pip install python-docx 步骤二:将PDF文档转换为文本 在将PDF…

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