嘘!市面上短视频(douyin)“去水印”的工具原来是这样实现的

2023-11-16

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

每一个视频都有4个播放地址,估计是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.下载就完了

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

本人后面也做很多测试,以上路子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
})

最后

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

❤️爱心三连击

1.看到这里了就点个在看支持下吧,你的「点赞,在看」是我创作的动力。

2.关注公众号趣谈前端,进程序员优质学习交流群, 字节, 阿里大佬和你一起学习成长!

感谢阅读,如果有用,能不能给加个鸡腿,点个在看。

点个『在看』支持下 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嘘!市面上短视频(douyin)“去水印”的工具原来是这样实现的 的相关文章

随机推荐

  • C++线程处理函数的返回值

    引言 关于线程处理函数 常见的可能是返回值为void类型 那线程处理函数是否能定义自己想要的返回值类型呢 这里请看下面的说明 C 线程返回值 应用环境 1 传统的方式获取线程返回值 2 使用C Promise和future方式 3 prom
  • 服务器怎么和网站接入,网站服务器的带宽怎么接入呢?

    zzzooo 当下许多企业为了将事务上云 开端租借效劳器建立网站 可是因为各个运营商机房种类都不相同 带宽线路也有区别 许多用户不清楚网站效劳器的带宽要怎样接入 今天小编就和我们聊一聊当下商场几种比较抢手的几种带宽接入方式 一 BGP多线带
  • 使用请求队列实验

    关于块设备架构就讲解这些 接下来我们使用开发板上的 RAM 模拟一段块设备 也就是ramdisk 然后编写块设备驱动 首先是传统的使用请求队列的时候 也就是针对机械硬盘的时候如何编写驱动 先分段分析一下驱动代码 1 重要的数据结构及宏定义
  • 简单好用的小控件------自定义checkbox

    1 首先在drawable文件夹中添加drawable文件checkbox style xml html view plain copy
  • Centos7关闭防火墙时遇到的错误Failed to start firewalld.service: Unit not found. Unit firewalld.service could no

    Centos7关闭防火墙 今天在centos上想要关闭防火墙 查了一些博客 执行命令 systemctl status firewalld service 时报错Unit firewalld service could not be fou
  • 常见缺少msvcp140.dll问题及解决方法,分享多种方法帮你解决

    在日常使用电脑的过程中 我们可能会遇到各种问题 比如电脑提示msvcp140 dll文件丢失 这个问题通常是由于某些程序或游戏需要这个dll文件来正常运行 但是由于某种原因 这个文件被误删或者损坏了 那么 如何解决这个问题呢 本文将为您提供
  • 队列算法的原理和实现,及其企业级应用

    目录 一 队列的原理 二 队列的算法实现 队列的算法实现1 使用数组 队列的算法实现2 使用链表 三 队列的企业级应用案例 一 线程池中的任务队列 二 循环队列 三 优先队列 四 动态顺序队列 五 高并发 WEB 服务器队列的应用 一 队列
  • 华为硬件工程师社招机考题库_华为硬件工程师笔试题

    有效地扩展放大器的通频带 改善放大器的线性和非线性失真 6 放大电路的频率补偿的目的是什么 有哪些方法 仕兰微电子 频率补偿目的就是减小时钟和相位差 使输入输出频率同步 很多放大电路里都会用到锁相环频率补偿电路 7 频率响应 如 怎么才算是
  • python中数据的初始化

    1 普通数据的初始化 在函数以外的地方初始化数据 若数据是不同名 但初始值一样 则可以这样写 a b c d 0 2 函数参数区域的数据初始化 可以在形参的范围内去初始化各个不同名字的参数 def f value 0 reverse Fal
  • 安防音视频(rtsp,onvif,gb28181)的HTML5(H5)解决方案(直播,回放,PTZ)

    背景 单位需要在基于H5的管理软件中接入安防音视频 直接在H5上实现不容易 只能选择第三方开发包 本文对klporxy使用做个简单记录 开发包的获取 开发包为共享软件 2路视频是免费的 需要的可以点击下载 或者邮件联系5614280 qq
  • Ubuntu 如何切换到root账户

    root账号问题ubuntu默认禁用了root账号 所以当年试图使用su root命令切换到root用户时 尽管你已经输入了正确的密码 终端依旧会提示你密码错误 你需要执行以下命令解除root账号的锁定1 打开终端 Dash搜索termin
  • 面对AI,要(能)当“杜兰特”吗?

    大家好 我是老三 先说一下这篇文章没什么干货 就是一篇随笔 今天闲来无事 在掘金上刷到一篇文章 GPT 4都来了 我们还需要刷算法题和背八股文吗 https juejin cn post 7211120847787098171 文章还行 但
  • 为什么技术开发者应该读一读《浪潮之巅》

    上周已经阅读完吴军老师的著作 浪潮之巅 第二版 迄今仍然激情澎湃 这本著作以平和直白的笔触介绍了硅谷IT企业们的发展史 看像微软 谷歌 苹果等优秀的IT企业们 从白手起家 到发展壮大成为今天的巨头 再看太阳微系统公司 雅虎公司从创造辉煌 到
  • 关于Eclipse如何改成中文的方法

    从官网下载的Eclipse是英文版的 对于我这种新手来说要上手比较困难 所以需要改成中文版的 咱们首先进入Eclipse语言包的网址 如下图所示进行操作 如图所示 找到对应的版本进入 找到标题为Language Chinese Simpli
  • 常用的正则表达式集锦

    常用的正则表达式集锦 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 4
  • 【FreeRTOS学习计划】 第九节 支持时间片

    FreeRTOS 与隔壁的 RT Thread 和 C OS 一样 都支持时间片的功能 所谓时间片就是同一个优先级下可以有多个任务 每个任务轮流地享有相同的 CPU 时间 享有 CPU 的时间我们叫时间片 在 RTOS 中 最小的时间单位为
  • 随笔:vscode-latex中文配置

    vscode用的久了 感觉确实比texstudio好用 question 1 vscode latex中文配置 vscode安装LaTeX Workshop Extension 默认latexmk就已经可以满足写英文paper的要求了 因为
  • 【STM32】基于STM32F407实现串口通信

    目录 一 通用同步异步收发器 USART 1 USART 简介 2 USART 功能说明 3 USART框图 二 基于HAL库实现串口通信 1 工程创建 2 HAL库UART函数库介绍 3 USART接收与发送 三 总结 四 参考 一 通用
  • vSphere 7.0+Replication 8.3安装配置

    esxi嵌套后建立的VM无法与其它未嵌套的VM通讯 需要更改物理ESXi的网络配置 接受混杂模式 接受mac变更等三个选项 更改kernel网络的配置 勾选vsphere replication 否则配置VM的复制策略时会报错 请验证源主机
  • 嘘!市面上短视频(douyin)“去水印”的工具原来是这样实现的

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