马上注册,免费下载更多dz插件网资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
哈喽,大家好,我是小编鹏仔,最近嘛晚上抽空想着用uniapp开发一款“去水印小程序”,然后加上流量主,赚点零花钱娱乐,但是在开发中,我遇到了很多问题,所以记录分享一下。
首先呢,开发这款小程序我一直觉得解析是最难的一部分,就是传入作品的地址,然后提取作品的无水印视频链接,这个过程是 访问分享的地址,然后电脑打开F12,就能看到一些接口信息有返回无水印视频mp4、mp3背景音乐、封面地址等等,这个用代码实现抓取即可,刚开始我是想着自己去写解析接口,毕竟现在AI也发达也方便,配合AI去获取即可。但是后来还是放弃了,放弃的原因是因为解析时一些ip限制,再加上获取无水印视频链接的规则经常会有变动,还有短视频平台太多了,靠自己根本没法抽出太多时间去维护规则,所以就选择了第三方付费去水印接口,方便简单,我就自己用PHP写了一个方法来调用第三方接口,小程序我在调用我的php写的接口即可。
那么接口解析这部已经完成,结果又在小程序开发过程中,发现解析后返回的的视频链接都不一样,因为要下载,下载视频要去小程序后台添加“downloadFile合法域名”,那么要添加的合法域名太多了,小程序最多支持添加200个,所以,我就用PHP写了一个方法,将解析后的mp4视频地址通过PHP转成流进行下载,代码如下所示- <?php// 获取视频地址参数$videoUrl = isset($_GET['url']) ? urldecode($_GET['url']) : '';// 基础参数校验if (empty($videoUrl)) { http_response_code(400); exit('缺少必要参数');}// 初始化CURL$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $videoUrl);curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随重定向curl_setopt($ch, CURLOPT_HEADER, false); // 不输出头信息curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时时间// 透传必要头信息(如Content-Type)curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $headerLine) { if (preg_match('/^(Content-Type|Content-Length|Accept-Ranges)/i', $headerLine)) { header($headerLine); } return strlen($headerLine);});// 执行请求curl_exec($ch);// 错误处理if (curl_errno($ch)) { http_response_code(500); echo '下载失败:' . curl_error($ch);}curl_close($ch);?>
复制代码 服务器(宝塔面板)新建文件 down.php 写入上方代码, 请求时 域名+down.php?url=视频地址
小程序代码如下- const proxyUrl = `https://sharedbk.com/down.php?url=${encodeURIComponent(this.video)}`;wx.downloadFile({ url: proxyUrl, success(res) { if (res.statusCode === 200) { wx.saveVideoToPhotosAlbum({ filePath: res.tempFilePath, success(res) { wx.showToast({ title: '保存成功', icon: 'success', duration: 2000 }); }, fail(err) { console.log('下载失败'); } }); } }, fail: (err)=>{ console.log('下载失败'); }});
复制代码 经过我反复的实验,确实OK了,可以进行下载了,“downloadFile合法域名”只需要添加我的主域名"https://sharedbk.com"即可。不出意外的情况下意外还是来了,发现稍微大一点的mp4视频文件,就会特别慢,更大一点的则会失败,那么头疼的就来了,思来想去,最终又继续写新方案了。
新方案就是将mp4视频文件进行中转,也就是用户解析后,将视频文件存储到我自己的服务器(服务器宽带等配置一定得高,否则会很慢),在传给小程序进行下载,在一定时间后删除视频,那么也只需添加一个合法域名即可,说干就干。PHP代码如下- <?phpheader('Access-Control-Allow-Origin: *');header('Content-Type: application/json');set_time_limit(0);ini_set('memory_limit', '512M');$saveDir = __DIR__ . '/videos/';$maxSize = 500 * 1024 * 1024; // 大小限制// 统一错误响应函数function sendError($code, $message) { echo json_encode([ 'code' => $code, 'msg' => $message ]); exit;}// 成功响应函数function sendSuccess($data) { echo json_encode([ 'code' => 101, 'data' => $data ]); exit;}if (!isset($_GET['url']) || empty($_GET['url'])) { sendError(800, '缺少url参数');}$originalUrl = $_GET['url'];if (!filter_var($originalUrl, FILTER_VALIDATE_URL)) { sendError(800, 'URL格式不正确');}// 获取文件信息$ch = curl_init($originalUrl);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_NOBODY, 1);curl_exec($ch);$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);$contentLength = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);curl_close($ch);// 预检查文件大小if ($contentLength !== false && $contentLength > $maxSize) { sendError(800, '文件过大,请复制链接进行下载');}// 设置扩展名$extensionMap = [ 'video/mp4' => 'mp4', 'image/jpeg' => 'jpg', 'image/png' => 'png',];$extension = $extensionMap[$contentType] ?? 'mp4';// 生成文件名$randomStr = bin2hex(random_bytes(4));$fileName = time() . '_' . $randomStr . '.' . $extension;$savePath = $saveDir . $fileName;try { // 下载文件 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $originalUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); $fileContent = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 检查实际文件大小 if (strlen($fileContent) > $maxSize) { sendError(800, '文件过大,请复制链接进行下载'); } if ($httpCode != 200 || !$fileContent) { throw new Exception("下载失败,HTTP状态码:$httpCode"); } curl_close($ch); if (file_put_contents($savePath, $fileContent) === false) { throw new Exception('保存文件失败'); } sendSuccess([ 'original_url' => $originalUrl, 'new_url' => 'https://www.sharedbk.com/videos/' . $fileName ]);} catch (Exception $e) { sendError(800, $e->getMessage());}
复制代码
服务器(宝塔面板)新建文件 down.php 写入上方代码, 请求时 域名+down.php?url=视频地址,代码效验视频大小,因为小程序也有限制下载大小,然后将文件转存到 /video 目录中,返回新的视频链接 https://www.sharedbk.com/videos/aaa.mp4 然后在返回给小程序进行下载。注:文件一定要给 755 权限哦。
对于定时清除视频文件,我是在宝塔面板写了一个Shell脚本,一个定时任务,每隔多久执行一次(宝塔设置间隔时间),每次执行删除上传时间超过3分钟前的文件(意思很简单,就是每隔一分钟,去清除一次文件中3分钟前的文件)
- #!/bin/bash# 指定要清理的目录target_dir="/www/wwwroot/sharedbk/videos"# 删除超过3分钟的文件(按修改时间)find "$target_dir" -type f -mmin +3 -delete
复制代码
那么到这一步基本也完成了,可是其实仔细想想,如果所有视频都走中转服务器进行下载,后期使用小程序的人流量大了,是有点太消耗服务器了,虽然要添加的合法域名很多但是一般情况下也就几百个吧,于是我又突发奇想了一个办法,那就是在写一个存储接口,每次用户解析成功,获取到无水印视频MP4链接,就提取视频的网址存到我的服务器中,每次先过滤去重一下,那么我就会得到一个 downloadFile合法域名列表 ,将其中常出现的199条添加到小程序的“downloadFile合法域名”中,然后用户点击下载时,我先判断该文件链接地址是否存在合法域名列表中,如果存在,则直接调用小程序的下载功能,如果不存在,则执行上方逻辑,将文件先进行中转在进行下载。
好了,去水印小程序的大致流程就是这些了,鹏仔也只是略懂点PHP,部分PHP代码还是借助了AI实现,希望能够帮助到你。如果你需要鹏仔采集的几百个合法域名列表,可联系小编鹏仔获取,鹏仔微信 15129739599
下面,看看我的小程序吧!微信扫码,或者微信搜索“爱抖日记”
支持 快手 抖音 全民小视频 今日头条 好看视频 看点视频 全民K歌 酷狗音乐 酷我音乐 看看视频 梨视频 哔哩哔哩 网易云音乐 看点视频 看点快报 西瓜 微视 QQ看点 陌陌 唱吧 小咖秀 糖豆 配音秀 大众点评 虎牙视频 懂车帝 火山 皮皮虾 皮皮搞笑 最左 小影 趣头条 微博 迅雷 美图秀秀 秒拍 美拍 刷宝 得物 京东 淘宝 天猫 拼多多 微信公众号 火锅视频 轻视频 百度视频 uc浏览器 QQ浏览器 oppo浏览器 油果浏览器 新片场 万能钥匙WiFi 知乎 腾讯新闻 人民日报 开眼 剪影 微叭 微云 快看点 彩视 TikTok youtube twitter soul instagram VUE vigo ACfun yy now 等等
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站内容为站长个人技术研究记录或网络,不提供用户交互功能,所有内容版权归原作者所有。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。 您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。 如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!
|