先上成果:
网页版: imgbed.cn/douyin
小程序码:
我每天刷抖音几小时,平时看到喜欢的视频会下载到手机分享或者收藏。下载视频再分享微信,别人打开也方便。
但是有时会发现某些视频不让下载,以前通过抓包下载,最近抓包也抓不到。
前几天在掘金看到一篇分析抖音去水印原理的文章,试了一下,不仅能下载无水印,抖音默认无法下载的视频也可以通过这个方法下载。
大体原理是:
- 抖音 App 里获取分享的短链接
- 浏览器打开短链接会 302 跳转长链接,长链接参数含有视频 id
- 抖音网页会根据这个 id 通过 api 请求得到一个 json 串,视频文件的地址就在 json 里,但是这个播放依然是有水印的,需要把链接里的 playwm 改成 play,得到无水印的视频链接 url 。
通过上面 3 个步骤,就可以做出下载抖音无水印的小程序。
于是开干,敲代码。
第一步要从抖音分享的短连接获取 302 后的长链接,研究了一遍小程序的 api,没有任何一个 api 支持获取 302 跳转链接的功能,于是只好通过服务器端获取(大家如果知道小程序前端如何获取 302 链接请指点一下),用户在小程序输入短链接,前端把短连接给服务器,服务器走一遍上述 123 步骤,返回最终的无水印链接 url 给小程序前端。
这里第一个坑来了,调用小程序的 downloadFile 接口去下载视频文件,直接报错说后台没有配置安全域名无法下载,仔细研究了一下这个播放链接,它是抖音公司的一个二级域名,而且二级域名一直在变,或许有几百种变化,小程序后台不可能把所有子域名都添加进去,那只好下载文件的链接也从自己服务器中转了。
于是在我的香港服务器又做了个接口 /?url=视频链接 ,其实就是单个 php 文件,代码如下:
<?php
header('Content-Type: application/force-download;');
header("Content-Type: video/mp4");
header('Content-Disposition: attachment; filename="'.date('YmdHis').'.mp4"');
$url = urldecode($_GET['url']);
if ($url) {
header('Content-Length: ' . get_headers($url, true)['Content-Length']);
readfile($url);
}
?>
这个接口暂时只有 url 参数,没做加密,改天有空我得把加密补上,不然暴露出去变成公开的中转站了。。
至此,该采的坑都踩了,小程序调试功能完美。接下去是上线。提交前我一直担心这类功能审核不通过,但是良心的腾讯竟然让它上线了。。
同时我还做了个网页版,跟小程序的区别是,小程序直接下载视频到相册,网页版是给出无水印链接供用户自己下载。
这里要感谢华为云。。中转用到的香港服务器是之前参加华为云活动免费得到的。。8 核 16G,300M 带宽,8T 流量包。。很良心