说说我为什么要做一个抖音视频水印工具,其实是因为我的沙雕女友。
一天晚上,她在抖音上看到了一段非常有教育意义的视频,如果一个男人爱他的儿媳,他应该承包所有的家务。然后它想下载这段视频,并与她的姐妹们分享她的经验。
然而,我们都知道抖音下载的视频有水印。作为一名严重的强迫症运动员,这是不允许的。如果没有办法,那就找到是否有水印工具要么收费,要么不能下载,主脸上的微笑也在逐渐消失。
我在旁边开玩笑说:没那么难。我为什么不给你做一个呢!你能吗?然后他不屑地看了看。
哦!我开玩笑说我做不到。我受不了。我得证明给你看!男人受不了。
让我们分析一下制作这种水印工具的想法。乍一看,很多人下意识地认为这是一种牛比算法。事实上,这是一种错觉~。
刨根问底
虽然我想争取语气,但当我第一次这样做的时候,我真的很困惑,因为我不知道从哪里开始,水印的原理是什么?我必须写一个算法吗?
找到一个tiktok视频共享链接析,不难发现这是一个处理过的短链接,然后这个短链接将重新定向真实的视频地址URL。
https:/v.douyin.com/JSkuhe4//
浏览器中的输入短链接得到了以下URL。根据我的经验,URL中的6820792802394262795很可能是视频中唯一的ID,而唯一的ID通常用作获取详情接口的参考。嘿~好像有点线索。
https:/www.iesdouyin.com/share/video/682079282802394262795
快速牺牲F12法打开控制台,在众多请求中发现这样一个接口,其实是上面唯一的ID。
https:/www.iesdouyin.com/web/api/v2/awem/iteminfo/item_ids=6820792802394262795。
更令人惊讶的是,接口返回的数据被称为详细信息、作者信息、音频地址、视频地址和平面图。但是没有无水印的视频URL。
只找到一个有水印的视频URL,有点失落。我又看了看这个地址,发现wm有点像我的项目名。这不是watermark水印的缩写吗?
https://aweme.snssdk.com/aweme/v1/playwm/video_id=v0200f03000bq54kg2saj3lso3oh20&ratio=720p&line=0。
似乎又看到了一丝希望,我迅速修改URL,在浏览器中再试一次,果然真的没有水印。
https://aweme.snssdk.com/aweme/v1/play/video_id=v0200f03000bq54kg2saj3lso3oh20&ratio=720p&line=0。
这时才发现抖音去水印简单感人,哈哈哈~。
身体力行
既然原理很清楚,剩下的就是一步一步实现功能。原理看起来很简单,但在实现过程中仍然会遇到一个小坑,浪费了很多时间。
实现过程只有三个简单的步骤:
1.从输入框中过滤取出视频短连接。
2.短连接传输到后端,分析无水印的视频URL。
3.将视频URL传输到前端预览.下载。
后端并不难,按照上述分析流程一步一步分析真实视频URL就可以了。
注:我们想要的地址URL是目前重定向后的URL。一些抖音链接不支持浏览器访问,因此需要手动修改USER-agent属性模拟移动终端访问。
/**
*@paramurl。
*@authorxiaofu。
*@description获取当前链接重定向后的url。
*@date2020/9/1512:43。
*/
publicsticstingelocation(stringurl){
try{
URLserverurl=newURL(URL);
Httpurlconectionn=(Httpurlconection)serverurl.openconection();
con.setrequestmethod(GET);
con.setinstancefollowredirects;
con.setrequestproperty(“user-agent”,“ua”);//模拟手机连接。
con.connect();
Stringlocation=con.getheaderfield(Location);
returnlocation;
}catch(Exceptione){
e.printstacktrace();
}
“return”;
}
下面是完整的后端实现,可以看到代码量很小。
/**
*@authorxiaofu-微信官方账号:程序员点东西。
*@description抖音无水印视频下载。
*@date2020/9/1518:44。
*/
@Slf4j。
@controller。
publiclasdontrole
publicstaticstringdou_yin_base_url=“https://www.iesdouyin.com/web/api/v2/aweminfo/itemuids=”;
/**
*@paramurl。
*@authorxiaofu。
*@description分析抖音无水印视频。
*@date2020/9/1512:43。
*/
@Requestmapping(“/parsevideourl”)
@ResponseBody。
publicstringparsevideourl(@requestbodystringurl)throwsexception
DyDtodyDto=newdyDto();
try{
url=urldecoder.decode(url).replace(“url=,“”);
/**
*1.重定向后的URL短连接。
*/
Stringredirecturl=commonutils.getlocation(url);
/**
*2.获取视频对应的Itemid。