首页 > 编程语言 >【Python爬虫案例】抖音下载视频+X-Bogus参数JS逆向分析

【Python爬虫案例】抖音下载视频+X-Bogus参数JS逆向分析

时间:2023-12-09 17:33:36浏览次数:45  
标签:douyin Python 断点 js 抖音 video Bogus JS data

接口分析

获取接口地址

选择自己感兴趣的抖音博主,本次以“经典老歌【车载U盘】”为例

每次请求的页面会有很多接口,需要对接口进行筛选:
第一步筛选XHR筛选
第二步筛选URL中带有post

通过筛选play_add值找到视频的地址

分析请求头

通过对比两次请求发现只有X-Bogus数值会有变化,max_cursor是用翻页,后文再介绍。

JS逆向分析

找入口

先通过简单方式搜索关键字找:

在当前两个位置增加断点,发现并没有断到请求,说明没有走两个位置
通过开发者工具中中的启动器定位:

断第一个,发现这是个ajax请求,不止一个请求会走这里,通过XHR断点的方式指定访问路径

上图就是当前的访问URL。 在控制端输入this或者鼠标悬停方式发现已生成X-Bogus

分析前一步调用的js

这段代码是一个简单的循环语句。它根据 _0x2458f0['y'] 的值来执行不同的逻辑。
在每次循环中,它首先对 _0x2458f0['y'] 进行自增操作(++),然后使用逻辑运算符 ? : 进行条件判断:
如果条件为真,执行 _0xcc6308[++_0x2e1055] = _0x2458f0['apply'](_0xc26b5e, _0x1f1790);
如果条件为假,不执行任何操作。
这段代码的具体意义需要结合上下文来进行分析和理解,无法单独判断出它的功能和目的。

通过日志断点来分析当前_0x2458f0['apply'](_0xc26b5e, _0x1f1790)语句生成的结果。日志断点语句console.log(_0x2458f0['apply'](_0xc26b5e, _0x1f1790))。控制台只允许显示信息类数据,通过日志分析找到了X-Bogus参数:DFSzswVOljJANtOstup5PBt/pL3I

由于输出数据过多需要通过条件断点来继续追踪,因为每次生成的X-Bogus长度是固定28位,通过条件断点语句_0x2458f0['apply'](_0xc26b5e, _0x1f1790).length==28。
查看_0x2458f0调用的函数

定位到加密函数

验证当前加密函数
当前位置打上断点,在控制台输入返回的值生成了X-Bogus

JS实现生成X-Bogus值

新建JS文件,将webmssdk.es5.js中所有代码复制到js文件中,并直接执行,差什么补什么

以下是需要加入的代码

window = global
document = {}
document.addEventListener =function (){}

这时候就会发现不再报错了,那么就可以使用一个全局变量获取X-Bogus值了,找到之前加密的函数_0x5a8f25那里。

再补一次

navigator = {
    "userAgent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}

Python调用js

import execjs

with open("douyin.js") as f:
    js_data = f.read()

js_compile =execjs.compile(js_data)
xb_data =js_compile.call("window.xiaoc",)
print(xb_data)

Python获取视频URL

获取页面信息

import execjs,requests
headers = {
    # UA 要和JS代码里的UA保持一致
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
    "Referer": "https://www.douyin.com/user/MS4wLjABAAAAF0zlK2_5qCr5Lqy6zLNMH8W146aOetdfKSX95jYXwi8",
    "Cookie": "xxxxxx"
}

with open("douyin.js") as f:
    js_data = f.read()

js_compile =execjs.compile(js_data)
url = "https://www.douyin.com/aweme/v1/web/aweme/post/?"
params =f'device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=MS4wLjABAAAAF0zlK2_5qCr5Lqy6zLNMH8W146aOetdfKSX95jYXwi8&max_cursor=0&locate_query=false&show_live_replay_strategy=1&need_time_list=1&time_list_query=0&whale_cut_token=&cut_version=1&count=18&publish_video_strategy_type=2&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1707&screen_height=1067&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=119.0.0.0&browser_online=true&engine_name=Blink&engine_version=119.0.0.0&os_name=Windows&os_version=10&cpu_core_num=16&device_memory=8&platform=PC&downlink=7.9&effective_type=4g&round_trip_time=50&webid=7310230678028846631&msToken=XWdh8ZPfrgSs9QombFXY3DJxXhH3HTyjw7NtYb6tpW9wYpaZqIAuhcZmOtQBu-7qgnSFswVdEZ2cKWsg6A4_WkxwyxIH3CCuMoLOUh4H6iqGBk7-ba8jaBufrmt2jw=='
xb_data =js_compile.call("window.xiaoc",params)
urls = url +params + "&X-Bogus=" + xb_data
print(urls)
response = requests.get(url=urls,headers=headers)
print(response.json())
###数据清洗 获取视频URL ```python douyin_videos = response.json().get("aweme_list") for douyin_video in douyin_videos: print(douyin_video["video"]['play_addr']['url_list'][0]) ```

下载视频

os.makedirs(f"./DouYin/")
douyin_videos = response.json().get("aweme_list")
for douyin_video in douyin_videos:
    douyin_video_title =douyin_video['desc']
    douyin_video_url = douyin_video["video"]['play_addr']['url_list'][0]
    res = requests.get(douyin_video_url, headers=headers)

    try:
        with open(f"./DouYin/{douyin_video_title}.mp4", "wb") as f:
            f.write(res.content)
            print(f"视频{douyin_video_title}-----下载完成")
    except Exception as e:
        print(f"视频{douyin_video_title}+++++++++++++++=下载出错 {e}")

后续

  • 翻页爬取
  • 获取多用户视频
  • 批量下载(多线程)
  • 爬取评论

标签:douyin,Python,断点,js,抖音,video,Bogus,JS,data
From: https://www.cnblogs.com/fuchangjiang/p/17891223.html

相关文章

  • Python - 【装饰器】详解
    一.概念Python装饰器本质上是一个函数,用于修改其他函数的功能。装饰器可以在不改变函数代码的情况下添加新的功能,使代码更具可读性、可维护性和可重用性。使用装饰器可以把一个函数传递给另一个函数,使其具有新的行为,而无需修改函数本身的代码。二.基本语法@decorator_namedeff......
  • Python - 实现【单例模式】的四种方法
    方法一:使用模块实现单例模式在Python中,每个模块只会被导入一次,因此可以将需要实现单例模式的类定义在一个模块中,每次需要使用该类时,将该模块导入即可。#singleton.pyclassSingleton:passsingleton=Singleton()在其他模块中直接引用这个singleton对象即可。2.方法二:使......
  • [Python]运算符: / 和 % 和 //计算差异是什么?
    /和%和//(地板除)在Python中的作用是:用于对数据进行除法运算。python中与除法相关的三个运算符是//和/和%,下面逐一讲解。“/”,这是传统的除法,5/2=2.5“//”,在python中,这个叫“地板除”,3//2=1“%”,这个是取模操作,也就是区余数,8%2=0,7%2=1Python中分为3种除法:1、/,2、%,3......
  • 抖音同城外卖小程序开发全指南
    时下,抖音同城外卖小程序则成为了行业内的一匹黑马。为了满足用户对于更加便捷、个性化外卖服务的需求,开发抖音同城外卖小程序成为了不少企业的首要任务。在本文中,我们将为您提供一份全面的抖音同城外卖小程序开发指南,涵盖了技术要点、设计原则和用户体验等关键方面。第一步:市场调研......
  • Java开发者的Python快速进修指南:实战之跳表pro版本
    之前我们讲解了简易版的跳表,我希望你能亲自动手实现一个更完善的跳表,同时也可以尝试实现其他数据结构,例如动态数组或哈希表等。通过实践,我们能够发现自己在哪些方面还有所欠缺。这些方法只有在熟练掌握之后才会真正理解,就像我在编写代码的过程中,难免会忘记一些方法或如何声明属性等......
  • Python 潮流周刊第 30 期(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。周刊全文:https://pythoncat.top/posts/2023-12-09-weekly以下是本期摘要:......
  • 深入探究 Python 异步编程:利用 asyncio 和 aiohttp 构建高效并发应用
    在现代编程中,异步编程已成为处理高并发和IO密集型任务的重要方式。Python提供了强大的异步编程支持,包括asyncio库和aiohttp等框架。本文将深入探讨异步编程的概念,以及在Python中如何利用异步框架来实现高效的并发编程。1.异步编程概念异步编程允许程序在等待IO操作完成时......
  • python+sklearn 机器学习代码备忘
    importsklearnfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearnimportpreprocessingimportcsvimportnumpyas......
  • 动手实现基于 JSON 和 OData 两种数据模型的 Web 应用表格控件行项目的添加和删除
    文章标题描述的需求是笔者在工作和网络上经常收到的前端开发领域的咨询话题之一。Web应用的表格控件,在切换到编辑模式下之后,给用户提供了行项目的添加和删除功能。基于MVC和MVVM框架的前端控件,都离不开Model即数据模型层。笔者工作中使用最多的模型层实现技术,即JSON模型......
  • Python 变量类型
    变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值Python中的变量赋值不需要类型声明。每个变量在内存......