现在视频号很火,当时做抖音和快手的人直接把之前的视频直接上传了。但是从抖音app下载的视频都是有官方水印的?这是如何删除的?哦,不,他们应该都保留原始视频。但是还是有很多人直接转发别人的视频,那么如何去水印呢?其实很早就有很多现成的工具,比如小程序、去水印APP,可以直接去水印,甚至还有收费的。赶紧学习吧,说不定我们能做出比他们更好的工具。操作猛如虎,各种抓包看数据。结果极其简单,几分钟就可以给一堆视频加水印。其实这些去水印的工具都太夸张了(愚蠢),根本不是真正的去水印。小白认为视频做了一些很棒的后期处理,去除了水印。实际上,它只是一个没有水印的下载视频。因为大家在抖音、快手等APP上看到的视频都没有官方水印,所以这个无水印视频肯定是存在的。我一一说说破解的过程(以抖音为例)。1.首先获取第一个链接2.好了,在浏览器中打开这个链接,打开刚才复制的地址,https://v.douyin.com/e1MMESR/。3.打开地址发现有302跳转4.然后播放左边的视频,变成了带水印的视频。我们在app里播放是看不到水印的,但是在浏览器里打开是有水印的。5.在控制台发现一个ajax请求,返回了视频的所有信息,当然也包括视频地址。6.找到视频播放地址video.play_addr.url_list[0]https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f760000c0fq7t5t1gvidv0rdtag&ratio=720p&line=0上面的地址和我们视频的地址一样在consolereview元素中看到,不过都是带水印的地址。至少是一条信息,先记录下这个地址。https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f760000c0fq7t5t1gvidv0rdtag&ratio=720p&line=07。换个方法,从个人中心的视频列表入手获取个人视频列表地址(进入个人中心点击分享,有复制链接)https://v.douyin.com/e1MCMaT/。8.打开浏览器,从控制台分析接口数据。这是接口返回的视频列表数据,不过只是前几项。我还没有看到如何获得所有这些。9、列表数据分析,发现纽大陆上述接口返回了视频列表数据,其中每条数据的信息都比较丰富,没有找到水印地址。每个视频有4个播放URL,这可能是用于流媒体的CDN。其实这是无水印的播放网址。10.停止搜索,已到达终点。上述地址的内容似乎大相径庭。依次打开后发现前两个直接播放,后两个有302跳转播放。再看第三个地址,好像有点眼熟//第三个地址https://aweme.snssdk.com/aweme/v1/play/?video_id=v0300f760000c0fq7t5t1gvidv0rdtag&line=0&ratio=720p&media_type=4&vr_type=0&improve_bitrate=0&is_play_url=1&source=PackSourceEnum_DOUYIN_REFLOW//https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f760000c0fq7t5t1gvidv0rdtag&ratio=720p&line=0上面保存的明显是同一个地址,几乎一模一样,只是参数不同而已。参数可以忽略,根据/playwm/和/play/的地址不同,不同的是wm。至此,我们就大功告成了,去掉wm的就是无水印的播放地址。wm是什么?是水印的英文缩写watermark。11、下载完成后,直接打开播放,在播放的视频上右击保存,就大功告成了。后来我也做了很多测试,上面的方法是可以的。12.快手呢?快手就更简单了,完全没有隐藏,无水印的视频直接在浏览器打开即可。显然抖音做得更多。有下载工具吗?现在我们可以分两步下载无水印视频,但是都是手动下载的。所以我们需要做一个工具,直接输入视频地址就可以一键下载。如何实现?手动下载还好,如果是自动下载,就没那么顺利了,因为平台早就意识到这个问题,也做好了防御。下面有两个选项,最终目的是获取视频的播放地址,然后下载视频。实施方案A使用平台API接口获取播放地址。但是,很可能会有陷阱。这种操作平台应该早有预案,会被否决。解决方案B应该更简单、更有效。使用无头浏览器获取视频的地址。部分代码code没有写完整,随便写个视频,获取api请求地址。//下载视频constpath=require('path')constfs=require('fs')constrequest=require('request')/***下载视频*/functiondownVideo(url){varfileName=`${+newDate()}.mp4`varfullPath=path.resolve('./videos/'+fileName);console.log('开始下载视频:',fileName);request(encodeURI(url)).on('error',function(err){console.log(error)}).pipe(fs.createWriteStream(fullPath)).on('finish',()=>{控制台.log('视频下载成功');})}consturl='http://v6-z.douyinvod.com/719423c89357069fffd503a6698436f9/60342b2c/video/tos/cn/tos-cn-ve-15/56505c3774bd46de98d6a49e23/64e29?a=4c=490&dbr=1129%7C0%7C0&ch=0&cr=0&cs=0&cv=1&dr=0&ds=3&er=&l=2021022300074001020410813542130635&lr=&mime_type=video_mp4&pl=0&qs=0&rc=and1eWxqd3d0MzMzOWkzM0ApZTw2NWhoZGRpNzs7ZTc4OWcpaGRqbGRoaGRmXmEtYXMuMjRjYC0tNC0wc3MzLjY1XzMxNjE2Ly4xMDFhOmNwb2wrbStqdDo%3D&vl=&vr='downVideo(url)//获取api地址函数getApiUrl(url){//重定向前端传过来的地址获取item_ids并返回returnnewPromise(resolve=>{request(url,(error,response)=>{if(!error&&response.statusCode==200){lethref=response.request.href;letid='';id=href.match(/video\/(\S*)\/\?region/)[1];resolve(`https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=${id}`);}else{resolve(false)}})});}getApiUrl('xxx').then(api=>{//xxx})稍后我会把代码补全,写一个完整的“去水印”工具,挂在自己的网站上。最后,整个过程并不难,反而很好玩。而且我发现了很多有趣的事情。上面的视频列表信息量很大,可以自己挖掘一下。市面上有很多支持列表批量读取的去水印工具。具体怎么做到现在还没有研究,知道的朋友可以留言。不要以为这件事在程序员看来很简单,其实不知道的人更多,你懂的。接下来我要搬视频了!!!立即获取更多原创文章,请关注公众号《前端技术江湖》
