抖音短视频(douyin)去水印工具的实现代码


Posted in Javascript onMarch 30, 2021

现在视频号非常火热,之前在做抖音和快手的人就直接把之前的视频直接搬运过来了。但是从抖音app下载的视频都是带官方水印的?这个是怎么去掉的?哦,不对,他们应该都有保留原视频的吧。但是还有很多人是直接搬运别人的视频的,那他们是怎么去水印的呢?

其实早就有很多现成的工具,如小程序、去水印app都能直接去水印,甚至还有收费的。

赶紧研究研究,说不准咱也能搞一个比他们更好的工具出来。

一顿操作猛如虎,各种抓包看数据,结果简单的不得了,分分钟内就能给一坨视频去水印。

其实这些去水印的工具都太夸张(忽悠)了,完全不是真的去水印,小白都以为是对视频做了什么牛逼的后处理,把水印干掉了。

其实是直接下载的无水印的视频而已。因为你在抖音和快手等app上,看到的视频都是不带官方水印,所以这个无水印视频肯定是存在的。

下面就把本人破解的过程一一说下(以douyin为例)。

1.先拿到第一个链接

抖音短视频(douyin)去水印工具的实现代码

2.嗯,在浏览器打开这个链接

然后打开刚才复制过来的地址,https://v.douyin.com/e1MMESR/ 。

3. 打开地址发现有302跳转

抖音短视频(douyin)去水印工具的实现代码

4.然后播放左侧的视频,竟然变成了带水印的视频。

我们在app里播放的看不到水印的,但是在浏览器打开就是有水印的。

抖音短视频(douyin)去水印工具的实现代码

5.在控制台发现有ajax请求,返回了该视频的全部信息,当然也包括视频地址

抖音短视频(douyin)去水印工具的实现代码

6.找到视频播放地址video.play_addr.url_list[0]

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

上面这个地址和我们在控制台审查元素看到的video播放的是一个地址,但是都是带水印的地址。

抖音短视频(douyin)去水印工具的实现代码

起码是一个信息,先把这个地址记录下来。

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

7.另寻他路,从个人中心的视频列表入手

拿到个人的视频列表地址(进入个人中心点击分享,有复制链接)https://v.douyin.com/e1MCMaT/。

8.浏览器打开,从控制台分析接口数据

这个就是接口返回的视频列表数据,不过也就是前几条,暂时还没看怎么拿到全部。

抖音短视频(douyin)去水印工具的实现代码

9.列表数据分析,发现新大陆

上面接口返回了视频列表数据,这里每条数据的信息更丰富,而且发现了无水印地址。

每一个视频都有4个播放地址,估计是cdn,用来分流的,其实这就是无水印的播放地址。

抖音短视频(douyin)去水印工具的实现代码

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.下载就完了

直接打开播放,在播放的视频上右键保存,完事儿。

抖音短视频(douyin)去水印工具的实现代码

本人后面也做很多测试,以上路子ok。

12.快手的怎么搞?

快手的就更简单了,完全没有隐藏,直接浏览器打开就是无水印的视频。明显抖音多做了一些。

搞个下载工具?

现在我们两步就可以下载到无水印视频了,但都是手动下载。所以我们要做成工具,直接输入视频地址就可以一键下载。

如何实现?手动下载很容易,但如果搞成自动的,就没那么顺利,因为平台早就意识到这个问题,也是做了防御的了。

下面有两个方案,最终的目标都是拿到视频的播放地址,然后下载视频。

实现方案A

走平台的api接口,拿到播放地址。不过很可能会遇到坑,平台应该早就对这种操作有方案,会被拒。

方案B

这个应该更简单,更有效,使用无头浏览器来拿到视频的地址,接口请求省了。

部分代码

代码还么有写完整,只写了一个下视频和拿到api请求地址。

//下载视频
 
const path = require('path')
const fs = require('fs')
const request = require('request')
/**
 * 下载视频
 */
function downVideo(url) {
 var fileName = `${+new Date()}.mp4`
 var fullPath = path.resolve('./videos/' + fileName);
 console.log('开始下载视频:', fileName);
 request(encodeURI(url)).on('error', function (err) {
 console.log(error)
 }).pipe(fs.createWriteStream(fullPath)).on('finish', () => {
 console.log('视频下载成功');
 })
 
}
 
const url = 'http://v6-z.douyinvod.com/719423c89357069fffd503a6698436f9/60342b2c/video/tos/cn/tos-cn-ve-15/56505c3774bd46de98d6a49e2315e292/?a=1128&br=4996&bt=1249&cd=0%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地址
 
function getApiUrl(url){
 //前端传过来的地址 进行重定向拿到 item_ids 并且返回
 return new Promise(resolve => {
 request(url, (error, response) => {
  if (!error && response.statusCode == 200) {
  let href = response.request.href;
  let id = '';
  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
})

后面会把代码补全,写一个完整的"去水印"工具,挂到我自己的站上。

最后

整个过程没什么难度,不过挺好玩。而且发现了很多有意思的东西,就上面那个视频列表内的信息很多很多,还可以挖掘一下。

到此这篇关于市面上短视频(douyin)"去水印"的工具原来是这样实现的的文章就介绍到这了,更多相关短视频去水印工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ext combox 下拉框不出现自动提示,自动选中的解决方法
Feb 24 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
js Form.elements[i]的使用实例
Nov 13 Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
js实现鼠标拖曳效果
Dec 30 Javascript
详细谈谈JavaScript中循环之间的差异
Aug 23 Javascript
Nest.js参数校验和自定义返回数据格式详解
Mar 29 #Javascript
Angular CLI发布路径的配置项浅析
Mar 29 #Javascript
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
python关键字and和or用法实例
2015/05/28 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
Python os库常用操作代码汇总
2020/11/03 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
在校硕士自我鉴定
2014/01/23 职场文书
海飞丝广告词
2014/03/20 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
教师个人总结范文
2015/02/11 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
听课评课活动心得体会
2016/01/15 职场文书
JavaScript执行机制详细介绍
2021/12/06 Javascript