短视频去水印小程序源码部署:PHP后端+微信小程序完整教程

发布时间:2026/9/14 7:17:04
短视频去水印小程序源码部署:PHP后端+微信小程序完整教程 简介这是一份面向小程序开发者和短视频运营者的去水印工具源码包整合了微信小程序前端与后端管理后台可在自有服务器上一键部署实现主流短视频平台的视频去水印解析。包内共两千八百五十个文件包含九百余个PHP后端接口、五百余个HTML管理页面、二百多个JavaScript逻辑脚本以及小程序前端所需的WXSS与WXML样式结构文件还有图标、字体、SQL数据库文件等辅助资源压缩包整体约三十一点六三MB目录分类清晰。目前已有两千八百二十人学习下载适合具备PHP与小程序基础、希望快速上线私有去水印服务的人群。源码自带公益解析接口并附后台配置、数据库修改、域名绑定及小程序前端编译指引同时保留了管理后台的完整功能可直接创建小程序并填写自身配置。整体从部署到运行路径清晰能省去从零开发的成本。1. 短视频去水印小程序的核心不是去水印而是拿原始地址去水印工具真正难的不是“去水印”而是拿到无水印的原始视频地址。短视频平台播放时显示的画面和水印是一体的但分享接口后面藏着一条不带水印的原始地址解析代码要做的就是帮用户把这条原始地址换出来。这套2020增强版短视频去水印源码把这件事拆成了两个部分微信小程序做用户入口PHP接口做解析中台。前端粘贴分享链接后端自动解析并返回无水印视频地址支持全网主流短视频平台源码自带公益解析接口搭建好就能用。但这套源码的部署比一般PHP项目多几个坎备案域名、宝塔环境、sg11解密插件、小程序合法域名配置任何一个环节漏掉页面能打开但功能就是不通。对熟悉微信小程序开发的人来说这是一套能直接改来用的基础工程对刚接触的人按下面的部署顺序一步步来也能搭起来。下面按后端、小程序端、解析接口排错的顺序拆解最后给它加上缓存和限流让公益接口在小流量下也能稳定跑。2. 后端部署宝塔、Nginx/Apache、PHP5.6 与 sg11 插件配置这套源码的部署顺序很死板先装环境再传代码最后改配置。项目本身是一套PHP后端加两个前端入口一个是后台管理一个是小程序。后端根目录下是PHP源码小程序前端是另一个子目录两者通过域名关联。安装材料里明确写了需要备案域名、服务器安装宝塔、安装Nginx或者Apache、php5.6以上、安装sg11插件这些条件少一个页面就会直接报错。我用的是宝塔面板Nginx 1.20PHP 7.2。为什么不是PHP最新版因为sg11插件对PHP版本敏感宝塔在安装扩展时会自动匹配当前PHP版本的sg11文件用PHP5.6或7.2最稳PHP8的兼容性未知没必要冒险。Apache也能跑但Nginx的伪静态更好配下面以Nginx为例。2.1 材料准备与目录结构需要准备的材料不多但每一样都有明确作用缺一个会在特定环节卡住。材料用途备案域名小程序 request 合法域名和后端API共用云服务器部署PHP环境2核2G以上够用宝塔面板可视化创建站点、安装sg11扩展微信小程序AppID开发者工具导入、真机调试和发布必备微信开发者工具导入小程序前端目录并上传先说域名的问题。小程序后台配置 request 合法域名时要求域名完成ICP备案并且是HTTPS。很多人搭这类项目卡在真机请求失败不是代码问题而是域名没备案或没上传HTTPS证书。本机调试时可以勾选“不校验合法域名”但真机完全不生效。压缩包解压后的目录结构大致如下以实际压缩包为准文件/目录作用data/config.php数据库连接、站点域名、API地址配置admin/后台管理页面登录路径是 /admin小程序前端目录微信开发者工具导入的项目源码5C9493E66D08C8FF3AF2FBE1160510A7.js小程序端全局域名配置入口2.2 修改 data/config.php 的数据库连接后端上传到站点根目录后第一步是改 data/config.php 里的数据库连接。这个版本的配置项大致是这种结构?php // data/config.php 数据库连接与站点配置 return [ db_host localhost, // 数据库地址一般不用改 db_user video_db_user, // 数据库用户名 db_pass your_password, // 数据库密码 db_name video_db, // 数据库名 site_url https://your-domain.com, // 站点域名 api_url https://your-domain.com/api, // 解析接口前缀 ];db_ 开头的四项对应宝塔里新建的数据库账号密码。site_url 和 api_url 要改成你自己的域名注意结尾不要带斜杠否则后续拼路径时会多出一个/。如果解压出来的文件不是 return 数组而是 define 常量字段名可能不同但找和数据库、域名有关的配置改掉就行。这一步有两个常见坑。一是 sg11 加密过的文件不要用文本编辑器去格式化或改编码改完很容易报文件损坏。二是数据库密码里有#、这类特殊字符时在 PHP 单引号字符串里通常没影响但有些辅助配置文件会要求转义创建数据库时建议直接避开这些字符。2.3 宝塔建站与伪静态处理建站步骤比较固定按顺序操作就不会漏在宝塔里创建站点PHP版本选7.2或5.6并确认sg11扩展已安装。将后端源码上传到站点根目录文件权限设为755属主调整为www。在“网站设置—伪静态”里添加规则然后访问域名看是否出现安装页或后台登录页。Nginx伪静态配置如下location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; } }这段配置把所有不存在的文件路径转发到 index.php再交给PHP路由处理。源码的后台和API都依赖这种伪静态否则访问 /admin 或 /api/xxx 会直接404。Apache 对应写法是 .htaccess宝塔里选择Apache时系统会自动生成基础规则不够再补。配完后浏览器输入域名看到安装页或后台登录页就说明PHP环境正常。默认后台账号密码是 admin/admin第一次登录建议立刻改掉尤其是域名对外可访问时。后台里可以创建小程序应用填微信小程序的AppID和AppSecret这些值在小程序后台的“开发管理—开发设置”里获取。2.4 sg11 扩展的作用与常见报错sg11 指的是 SourceGuardian一种PHP源码加密扩展。这类商业源码为防止破解把核心业务逻辑加密成字节码PHP 加载时必须用 sg11 解密才能运行。宝塔安装很简单“软件商店—PHP7.2设置—安装扩展—sg11”装完重启 PHP-FPM在 phpinfo 里能看到 SourceGuardian 相关信息就说明生效了。常见报错有两个。第一个是Site error: the source file ... is corrupted多数是 FTP 上传时用了文本模式把二进制文件改坏了用二进制模式重新上传即可。第二个是loader must be installed说明 sg11 没装上或者 PHP 版本不匹配检查扩展目录里有没有对应 PHP 版本的 sg11 文件。到这里后端基本能起来了接下来要处理小程序前端。注意后台创建小程序后前端所有请求都会指向这个域名的 API 接口所以前后端对接的前提是后端已经能正常访问。3. 微信小程序端域名替换、请求封装与加载页改造这部分是搭建时最摸不着头脑的地方。后端目录是一堆PHP文件位置对得上就能跑小程序前端是一个完整项目里面有一个文件名很长的js文件叫 5C9493E66D08C8FF3AF2FBE1160510A7.js这是小程序的主包文件。不要被这个名字吓到它只是构建工具对文件名做了哈希处理。我第一次导入微信开发者工具时直接把整个压缩包拖进去了结果一堆PHP文件被当成乱码还提示缺少 project.config.json。正确做法是先在后端源码里找到小程序前端目录单独导入。如果你习惯用 HBuilderX 开发微信小程序也可以把这个目录当作原生工程来理解但没必要重新编译一遍直接改原生包更快。3.1 使用微信开发者工具导入前端项目打开微信开发者工具选择“导入项目”目录指向小程序前端目录。AppID 填自己的不要用测试号。原因很简单request 合法域名这类配置在测试号里没有入口真机调试时会一直报url not in domain list。用测试号开发到最后还是要换回正式AppID再配置域名等于返工一遍。导入后先别急着改代码在开发者工具里确认编译能通过。如果报找不到文件检查目录选择是否正确。这个前端是原生小程序语法不是 uniapp 微信小程序工程不需要 npm install也不需要 HBuilderX 重新打包改动成本很低。3.2 替换 5C9493E66D08C8FF3AF2FBE1160510A7.js 里的域名在编辑器里打开 5C9493E66D08C8FF3AF2FBE1160510A7.js搜索原来的域名通常是压缩包里预置的某个域名全部替换成你自己的// 搜索并替换源码里预置的旧域名 var BASE_URL https://old-domain.com; // 这是源码里预置的域名 // 改成 var BASE_URL https://your-domain.com; // 改成你自己的接口域名这个文件是压缩过的代码全部挤在一行不要手动回车美化也不要在中间插空行容易破坏页面加载。用编辑器的“全部替换”功能替换完成后搜索旧域名确认一个不剩。源码里如果同时存在 http 和 https 两种写法统一换成 https否则小程序端会因混合内容被拦截。想修改刚进入的加载页面可以在首页的入口文件里找到 onLoad 或 onShow把默认展示的引导弹窗、公告逻辑去掉。加载页一般是在 pages/index 的 onLoad 阶段去请求解析配置把域名替换干净后加载页才会正常拉取后端数据。3.3 请求封装与超时、文件保存小程序端的请求通常集中在一个工具文件里把超时时间拉长是通用做法function request(path, data) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, // BASE_URL 来自全局配置 data: data, // 例如 { url: shareUrl, platform: dy } timeout: 15000, // 公益解析接口响应慢15秒比较稳 header: { content-type: application/json }, success: (res) { if (res.data.code 200) { resolve(res.data); // 按解析成功的结构返回 } else { reject(res.data.msg); // 失败时 msg 通常是接口的错误提示 } }, fail: (err) reject(err) // 网络层面失败域名或证书问题居多 }); }); }timeout 设为 15000 毫秒是因为公益接口在高峰期经常要等好几秒如果保留默认的 10 秒用户会频繁看到解析失败。res.data.code 的判断要和后端返回一致有的源码用 status有的用 code以实际返回为准。解析成功后要下载视频推荐用 wx.downloadFile 加上 wx.env.user_data_path 保存附件wx.downloadFile({ url: videoUrl, success(res) { const fs wx.getFileSystemManager(); fs.saveFile({ tempFilePath: res.tempFilePath, filePath: wx.env.user_data_path /videos/ Date.now() .mp4 }); } });这里的关键是 filePath 不要写死成固定名字连续保存两个视频会互相覆盖。用时间戳拼文件名最稳妥下载完成后也能从保存目录里读取视频分享给微信好友。3.4 小程序后台配置合法域名前端改完域名最后一步在小程序后台配置。登录微信公众平台进入“开发管理—开发设置—服务器域名”把下面几类全部指向你的域名类型必须配置request合法域名https://your-domain.comdownloadFile合法域名https://your-domain.comuploadFile合法域名如果前端有上传头像功能再配配置要求是域名使用 HTTPS、证书有效、域名已完成备案。开发者工具里勾选“不校验合法域名”只对本机调试有效真机不会生效不要依赖这个选项。到这里小程序端加载、请求、存储的链路就通了接下来看解析接口怎么验证和排错。4. 解析接口的调用机制与失败定位从抓包到换接口后端能访问、小程序能发起请求只是第一步真正决定去水印能不能成功的是解析接口。接口是公益的那么多人用解析慢是肯定的这类接口背后是开发者维护的解析服务每天处理大量请求响应速度一直在波动。理解它的调用流程才知道失败时该查哪里。4.1 解析流程与关键参数一次完整解析过程是这样的用户从抖音、快手等App复制分享链接粘贴到小程序输入框小程序把链接和平台标识一起提交给后端后端把分享链接编码后拼到解析接口地址上公益接口去请求对应平台的分享页解析出原始视频地址最后把无水印地址返回给小程序播放和下载。参数含义url用户输入的分享链接需要先 urlencode 编码platform平台标识例如 dy 代表抖音、ks 代表快手appid后台创建的小程序应用标识timestamp请求时间戳用于防止重复请求返回结构大同小异核心字段一般是 title、cover、video_url、code。code 为 200 表示成功video_url 就是无水印视频地址code 非 200 时msg 会带失败原因比如视频不存在、平台改版等。4.2 用 curl 验证接口是否可用小程序端报错时先在服务器上用 curl 直接打接口能快速分清是前端问题还是接口问题curl -m 20 -s https://your-domain.com/api/jiexi?urlhttps%3A%2F%2Fv.douyin.com%2Fxxxxx%2Fplatformdy | head -c 500-m 20限制请求最多20秒避免接口无响应时命令一直挂起-s是静默模式不打印进度条head -c 500只截取返回的前500字节防止超长JSON刷屏。正常返回里能看到 code 和 video_url 字段。如果 curl 卡住无输出多半是后端请求公益接口时超时去看 Nginx 日志和 PHP-FPM 日志定位是在哪个环节断的。小程序端的问题用抓包看最清楚。电脑端微信小程序用 Charles 抓包是常用做法在开发者工具里配置代理将 HTTP/HTTPS 流量指向 Charles启动小程序后就能看到每次 wx.request 是否真正发出、域名是否替换干净、服务器返回了什么。Charles 的 Filter 输入域名可以快速筛出小程序访问的后端请求。4.3 接口替换从公益接口到自建解析嫌公益接口慢的话常见做法是在后端加接口路由配置把不同平台指向不同解析服务// config/jiexi.php return [ dy https://api-a.example.com/jx, // 抖音走A接口 ks https://api-b.example.com/jx, // 快手走B接口 default https://api-c.example.com/jx, // 兜底 ]; // 调用时按平台取地址 $api $config[$platform] ?? $config[default]; $parseUrl $api . ?url . urlencode($shareUrl);这里的 urlencode 很重要分享链接里自带问号和参数不编码会导致解析接口只收到前半段永远解析失败。按平台分流的好处是某个接口挂了只影响对应平台其他平台还能用。default 兜底保证新平台接入时不会直接报错。如果后端接的是带签名鉴权的接口appkey 和 secret 要放在服务端不要放到小程序前端。小程序端是明文代码任何写在里面的密钥都能被扒走别人拿你的密钥去刷接口最后被封的是你的域名。4.4 失败率高的原因与应对拆这类项目时遇到最多的问题排序大致是域名没替换干净、HTTPS证书过期、公益接口排队超时、短视频平台改了签名算法。前两个是小程序端配置问题后两个是接口侧问题。公益接口解析慢是常态因为所有人都共用它。个人使用的话在前端把超时设长一点并在失败后提供一个“再试一次”按钮避免用户反复点击造成额外拥堵。短视频平台会定期更新分享页结构接口里写死的解析逻辑如果没跟上就会出现某段时间全网解析失败这种情况只能等接口维护方更新或者换一个解析服务。注意去水印类项目本质是借助平台分享页获取原始地址平台方不一定欢迎这种做法。个人做学习工具没问题不要拿去做规模化分发或商业服务接口被限制是早晚的事。5. 给去水印解析加一层缓存和限流公益接口也能撑住公益解析接口慢很大程度是因为高频重复请求太多。同一个视频被十个人解析接口就要处理十次其中九次是浪费。在 PHP 后端加一层文件缓存能直接减少接口请求压力也让小程序端响应变快。5.1 文件缓存同一个视频只解析一次$cacheKey md5($url . $platform); $cacheFile /tmp/jx_ . $cacheKey . .json; if (file_exists($cacheFile) (time() - filemtime($cacheFile)) 3600) { echo file_get_contents($cacheFile); // 命中缓存直接返回 exit; } // 发起请求到解析接口取得 $apiResponse $apiResponse file_get_contents($parseUrl); file_put_contents($cacheFile, $apiResponse); // 写入文件缓存 echo $apiResponse;key 由 url 和 platform 拼接后 md5同一个视频不管谁来解析都落在同一个文件上。缓存时间设为 3600 秒也就是一小时。短视频平台的无水印地址通常会带签名签名有效期一般几十分钟到几小时缓存太久会导致地址过期用户看着在播放点下载时失败。5.2 简单限流避免单个IP打爆公益接口session_start(); $key jx_limit_ . $_SERVER[REMOTE_ADDR]; if (!isset($_SESSION[$key])) { $_SESSION[$key] [time time(), count 0]; } if (time() - $_SESSION[$key][time] 60) { $_SESSION[$key] [time time(), count 0]; } $_SESSION[$key][count]; if ($_SESSION[$key][count] 20) { exit(请求过于频繁请稍后再试); }这段写在解析接口入口处限制每个IP每分钟最多请求20次。个人站一般够用公益接口排队严重时可以再降到10。session 方案虽然在无状态API里显得业余但部署最轻不用 Redis也不会多出一层依赖。要更正规就换成 Redis INCR原理一样。验证方式很简单用 curl 循环请求同一接口20次第21次会看到“请求过于频繁”。再把缓存时间临时改成10秒测同一个 url 请求两次第二次响应时间会明显缩短说明文件缓存命中。跑通这两点个人场景下去水印服务的体验基本能到及格线。本文还有配套的精品资源点击获取