短视频(douyin)去水印工具的实现代码
作者:zz_jesse 发布时间:2024-04-29 13:40:15
现在视频号非常火热,之前在做抖音和快手的人就直接把之前的视频直接搬运过来了。但是从抖音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
})
后面会把代码补全,写一个完整的"去水印"工具,挂到我自己的站上。
最后
整个过程没什么难度,不过挺好玩。而且发现了很多有意思的东西,就上面那个视频列表内的信息很多很多,还可以挖掘一下。
来源:https://blog.csdn.net/zz_jesse/article/details/114051972


猜你喜欢
- 1.画最简单的直线图代码如下:import numpy as np import matplotlib.pyplot as plt x=[0
- 协程协程(co-routine,又称微线程)是一种多方协同的工作方式。当前执行者在某个时刻主动让出(yield)控制流,并记住自身当前的状态
- 1. 错误描述之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图:看着红线确实有点
- 前言今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。例如单个接
- 今天我遇到一个问题,MySQL企业版备份引起I/O子系统负载过大,应用响应缓慢,导致系统不可用。所以我想限制mysqlbackup的进程,使
- Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会带来很多的便利,多看看很有好
- 当然可以,我们使用强大的fso对象来获取文件夹的大小请敲入如下代码即可:<%Set MyFileSize =&nb
- 安装依赖1)下载安装opencv-2.4.9,并将cv2.pyd拷贝到python安装目录的site-package下2)pip insta
- 1. 什么是数据不平衡所谓的数据不平衡(imbalanced data)是指数据集中各个类别的数量分布不均衡;不平衡数据在现实任务中十分的常
- 前面我们已经构造了一种图形可视化的模板了,下面我们直接使用这个模板进行增添和修改,进一步的改善图形的外观。import matplotlib
- mysql更改数据文件的存放路径感觉直接把/etc/my.cnf中的datadir改一下重启一下服务就行,但是从网上搜了n多资料,大部分都是
- 前言:对于遍历大数组而言, for 循环能比 for range 循环更高效与稳定,这一点在数组元素为结构体类型更加明显。我们知道,Go 的
- 一、如果models.py文件为时:timestamp = models.DateTimeField('保存日期')会提示:
- 为什么会有多个分支一般项目在开发阶段,都会创建多个分支,用于不同开发阶段的版本发布如:master、dev等,之所以会有这种多分支情况,就是
- 当使用PHP在MySQL中编写查询时,它的适用性将基于MySQL本身进行检查。所以使用MySQL提供的默认日期和时间格式,即'YYY
- 数据的变化反应到视图前面我们了解到数据劫持之后,我们可以在数据发生修改之后做任何我们想要做的事情,操作视图当然也是OK的命令式操作视图目标:
- python 连接数据库操作, 方法如下:在本机的mysql 数据库中有一个名为yao的库,其中有一个名为user的表,表中的内容如图下面,
- 环境搭建1.安装uwsgi、nginx和djangoapt install nginxpip install uwsgipip instal
- 这篇文章主要介绍了python常用排序算法的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 单分支结构:if 语句Python 中 if 语句的语法格式如下:if <条件>: