【Rust 实战】抖音短视频解析工具

简介: 【Rust 实战】抖音短视频解析工具

0x00 开篇


一直都在写教程,今天咱们换换主题,一起来做一个小工具。咱们用 Rust 来写一个抖音短视频下载地址解析工具。本文用到异步、网络请求等相关知识。另外公众号官方社群(文末)也开放了,欢迎大家加入,一起畅谈 Rust 的未来。本篇文章的阅读时间大约 8 分钟。


0x01 视频解析原理


原理其实很简单,每个短视频对应一个 id,我们将 id 传给官方的 api 地址:https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={id} 以得到当前短视频一些信息,如:视频名称,封面图片,音频地址,视频地址等等。这其中的视频地址就是可以下载的地址了。

id = 7162104318923967752 为例,请求的信息如下:


0a2653c851af460fa595bd959398a8f1.png


最终 video/url_list 中的值就是我们想要的了。


0x02 代码实现


添加第三方 crate 依赖


本篇文章将使用下面的依赖:

  • 异步:tokio
  • 网络请求:reqwest
  • json 解析: serde
# 异步
tokio = { version = "1.21.2", features = ["full"] }
# 网络
reqwest = {version = "0.11.12", features = ["json"] }
# json
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }


获取短视频 id


首先,我们通过用户输入的地址,获取短视频 id。短视频的地址都是如 https://v.douyin.com/xxxxxxx这种形式。当我们在浏览器请求此链接时,将会重定向为一个新的地址,我们所需的 id 就在新的地址中。

请求接下来以 https://v.douyin.com/h1YcUow 为例

直接上代码了:

let mut input = String::new();
// 输入 https://v.douyin.com/h1YcUow
std::io::stdin().read_line(&mut input).expect("read line error!");
// 获取 response
let result = create_default_client().get(input.as_str()).send().await;
let result = result.unwrap();
dbg(&result);
// 获取重定向后的地址,并解析id
let path = result.url().path();
let id = path.replace("/video/", "");

用户先输入短视频分享的链接https://v.douyin.com/h1YcUow, 然后请求这个链接,通过返回结果 response 中的 path 获取 id。下面是 response 的结果。

&result = Response {
    url: Url {
        scheme: "https",
        cannot_be_a_base: false,
        username: "",
        password: None,
        host: Some(
            Domain(
                "www.douyin.com",
            ),
        ),
        port: None,
  // 7162104318923967752 就是我们所需的 id
        path: "/video/7162104318923967752",
        query: Some(
            "previous_page=web_code_link",
        ),
        fragment: None,
    },
.....
}


通过 id 拼接链接并请求


// 请求拼接请求地址
let url = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=";
let url = format!("{}{}", url, id);
// 请求该链接
let result = create_default_client().get(url.as_str()).send().await;
// 结果转化为结构体
let result = result.unwrap().json::<DouYinResult>().await;

id 与链接拼接并请求,将请求结果通过 serde 转为 Rust 相对应的结构体。(DouYinResult 请参见源码)。


解析结果


let dou_yin_items = result.item_list.unwrap();
let dou_yin_item = dou_yin_items.into_iter().nth(0).unwrap();
// 视频名称
let video_name = dou_yin_item.desc.unwrap_or_default();
// 视频地址
let dou_yin_video = dou_yin_item.video.unwrap();
// 获取 play_address
let play_address = dou_yin_video.play_addr.unwrap();
// 获取 play_list
let play_list = play_address.url_list.unwrap_or_default();
// video url
let video_url = play_list.into_iter().nth(0).unwrap_or_default();

由于篇幅有限,上面解析的代码使用了大量 unwrap(),详细代码请参阅源码,项目中不建议大量使用 unwrap()。我们最终拿到的地址如下:

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fg10000cdieeejc77ucgndnburg&ratio=720p&line=0

这个地址就可以下载了。但是有个缺点,这个地址有水印,如果想要去掉水印,我们把地址中的 playwm 替换为 play就可以了。

最终地址:

https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fg10000cdieeejc77ucgndnburg&ratio=720p&line=0

获取最终视频源地址

其实到上面一步已经可以正常下载了,如果我们将上面的地址再请一次,链接会重定向到最终的视频地址,代码详见源码:

https://v5-colda.douyinvod.com/e7c51c7e6ee10322808d96a89931383a/638b1b04/video/tos/cn/tos-cn-ve-15c001-alinc2/38ba1730579642d1a2a1c70822caa4e6/?a=1128&ch=0&cr=0&dr=0&cd=0%7C0%7C0%7C0&cv=1&br=1676&bt=1676&cs=0&ds=3&ft=BajzJVVywhiRF_80mo~MWwQlQmpF2O_CvrKzCHsUdo0gl-A&mime_type=video_mp4&qs=0&rc=MzwzOjM7aWg0ZGZlZWVpNUBpanhxcWY6ZmhoZzMzNGkzM0AzYWFiYTUzXzExNl9fLTYuYSNvX2FkcjRnYmZgLS1kLS9zcw%3D%3D&l=202212031645330102091481403F60B65C&btag=a8000

这个地址可以在任意浏览器或者下载工具中下载了。


0x03 小结


原理和代码都还算比较容易,用到的接口也是官方接口,失效的几率很低,大概率可以长期使用。通过测试我也发现并不是所有的视频都可以下载,极少数视频无法下载。大家如果感兴趣可以下载源码并完善。但是是不是如果有GUI界面就好了,文章还没有结束,接下来我将会结合 tauri 来完成一个跨平台的短视频解析工具。

相关文章
|
8月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
505 27
|
8月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
536 4
JSON数据解析实战:从嵌套结构到结构化表格
|
8月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
323 4
|
8月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
503 3
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
326 4
|
8月前
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
9月前
|
数据可视化 测试技术 API
GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析
本文深入解析了GraphQL开发工具Apipost在高效调试与文档生成方面的优势,对比同类工具Apifox,突出其可视化界面、实时调试及自动化文档生成等特性。Apipost通过智能代码补全、错误提示等功能简化复杂Query编写,支持一键生成标准化文档,显著提升开发效率和团队协作效果,尤其适合中大型团队应对复杂业务场景。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
823 29
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多
  • DNS
  • 下一篇
    oss云网关配置