之前写过一篇文章《抖音短视频无水印解析下载,换个角度让爬虫更简单》,文章中介绍了几种解析抖音无水印视频下载地址的方法,目的是通过这些方法记录反爬虫的基本分析思路。可万万没想到帮助了不少小伙子解决了工作中的一些问题,我听到也是非常开心的,哈哈哈😊
后来,我就在我的博客中做了一个短视频解析的功能(点击开始下载无水印的短视频),目前支持抖音、快手、微视、火山、西瓜视频、皮皮虾、知乎视频、微博、Bilibili的无水印解析。结果竟然有人留言说早就不满足抖音上的小姐姐了,想下载无水印tiktok视频,让我提供方法。刚开始乍一看的时候,发现tiktok并不像抖音那样和西瓜、头条等数据都是打通的,所以视频来源渠道多种多样,总有空子可以钻。不过好在找到了解决思路,在此记录一下,算是对分析反爬虫思路的一个案例补充,希望可以帮到有缘人。
特别说明,tiktok的无水印下载,虽然我做出来了,但是没有集成到博客的短视频解析功能中。原因是我买的服务器在国内,访问不了tiktok,这玩意又不挣钱,所以不想再去买国外服务器了。方法记录一下,交给有缘的、有情怀的小伙子去做吧,哈哈哈~
Fiddler + Android模拟器 + TikTok破解版抓包
其实标题就直接透露方案了,不过还是解释一下为什么是这个方案?第一,tiktok破解版解除了地域限制,国内就可以直接看视频了,省了爬墙的操作;第二,tiktok破解版本身就可以直接保存无水印的tiktok视频,所以分析起来更方便;第三,用Android模拟器是因为我太穷了,没有一台Android测试机(留下没钱的酸泪😭);
安装Fiddler、Android模拟器、TikTok破解版
Fiddler是免费的,直接去官网下载安装就可以了。Android模拟器种类就很多了,这里我使用的是逍遥模拟器,也是免费的,而且感觉性能不错,值得推荐。tiktok破解版,这个可能对于一些朋友来说不是特别好找,我这里直接提供一下吧(点击下载tiktok破解版)。
Fiddler + 逍遥Android模拟器抓包环境配置
首先对Fiddler进行设置,主要是“开启HTTPS”和“允许远程计算机连接”。而且通过这里我们可以知道Fiddler的端口号是8888。
查看电脑本机IP地址
这一步不要也行,因为发现逍遥模拟器好像是直接桥连的,所以如果不行的话就用本机IP,否则不用管。按一下Win+R,然后输入CMD打开命令行工具,输入ipconfig即可查看IP了。
逍遥Android模拟器证书安装
在逍遥Android模拟器的浏览器中访问http://127.0.0.1:8888/或者本机IP:8888/,进入Fiddler证书安装界面。点击安装证书即可开始下载证书,下载完成后在任务栏中点击安装即可。
![逍遥Android模拟器下载Fiddler的HTTPS证书](/static/img/default.jpg)
逍遥Android模拟器设置代理
打开逍遥Android模拟器的网络设置,然后长按进行网络设置修改。只需要勾选高级选项,然后输入本机IP或者127.0.01,以及端口号8888即可。
打开TikTok进行抓包
一切配置好之后就可以愉快的抓包了,还可以进行保存无水印视频抓包,如图~
TikTok无水印API接口
经过一顿抓包,很容易就能发现一个可以接口:https://api16xxxxxx.tiktokv.com/aweme/v1/play/?video_id=。但是涉及到tiktok核心接口,这里就不说的特别明白了,需要的去抓一下包就知道了哈~这个接口只有一个核心参数,那就是tiktok的video_id,然后访问这个接口可以得到302重定向地址,也就是相应头中的Location,这个就是视频的无水印地址了。
https://api16xxxxxx.tiktokv.com/aweme/v1/play/?video_id=
TikTok Video ID(vid) 获取方法
实际上拿到API之后不要太兴奋,原因是刚开始我没找到video_id的获取方法,还是太菜了😭。不过一向机智的我就去了GitHub搜关键词了😂,果然不出所料,不一会就找到了解决方案。原来tiktok的video_id就藏在tiktok有水印视频的文件头中(如下图)。
所以为了拿到video_id,得先请求有水印视频,然后从有水印视频的二进制数据中提取video_id,这里附一点代码吧,反正也是GitHub取的🤦
response = requests.get(video_url, headers=headers)
if(response.status_code != 200):
return {'code': -1, 'msg': 'Analysis failed', 'data': {}}
video_bytes = response.content
position = video_bytes.find('vid:'.encode())
if(position == -1):
return {'code': -1, 'msg': 'Analysis failed', 'data': {}}
video_id = video_bytes[position+4:position+36].decode('utf-8')
写代码实现
知道原理后,基本就是简单代码编写啦~大致过程就是:请求分享链接 → 得到有水印视频链接 → 请求有水印视频链接 → 得到视频的video_id → 使用video_id请求无水印API → 得到302跳转链接,即tiktok无水印视频链接~代码实现效果如下:
然后附上tiktok无水印小姐姐一个,哈哈哈~
最后,详细的代码就不贴了,有兴趣的话,按照上面的思路抓抓包,问题不大的。然后还是希望大家不要用于商业用途吧,仅供学习和个人使用。
相关资源推荐: