简介:一套可直接部署的短视频解析源码,面向需要批量获取视频链接、封面、标题、播放量及评论等数据的开发者、内容运营与数据分析人员。它通过调用短视频平台公开接口,简化数据采集流程,用户上传视频链接即可自动完成解析并输出关键信息,无需复杂配置,具备开箱即用的特点。压缩包内有14个文件,主要包含php后端处理逻辑、js前端交互脚本、css页面样式及HTML入口页面,并附htaccess与ini配置文件,整体仅203KB,轻量易部署,适合二次开发或直接挂载到服务器使用。该资源已测试可在3月10号正常运行,稳定性与可靠性有基本保障,目前已有199人学习下载。源码内含api.php等核心解析入口,以及基于layui、mui-player等库构建的操作界面,可处理请求、解析数据与错误反馈。对于研究平台内容趋势、搭建数据监控工具或学习接口调用逻辑的读者,这套代码提供了完整的参考实现;使用时需注意遵守相关法规与平台协议,避免违规抓取。
1. 短视频解析源码:上传即可用的 PHP 解析站点与部署链路
“短视频解析源码”不是黑匣子,拆开就是一套上传到 PHP 空间即可运行的站点程序。api.php 负责请求目标页面并提取播放地址,index.php 负责渲染输入界面,layui、jquery 承担交互,mui-player 和 APlayer 把解析结果渲染成可播放的视频。你贴入一个短视频链接,它会返回标题、封面、播放地址、播放量等结构化数据,没有数据库,上传即用。
它适合两类人:一类是做短视频内容分析、开发第三方小工具的开发者,可以省去自建抓取链路的时间;另一类是想把特定视频存档、不想装客户端的普通用户。下面按“结构 → 部署 → 避坑 → 进阶”展开,每一步都可直接照做。
2. 源码结构拆解:api.php 的请求、解析、返回链路
拿到压缩包后第一件事不是急着上传,而是先把文件铺开看一遍。这套源码的文件结构很典型:PHP 入口文件 + 前端静态资源 + 服务器配置文件,没有数据库文件,也没有 composer 依赖,属于“轻量级解析站点”这一类实现。
2.1 文件清单:每个文件在解析链路里的角色
| 文件 | 类型 | 职责 |
|---|---|---|
| index.php | PHP 入口 | 渲染前端页面,接收用户提交的视频链接 |
| api.php | PHP 接口 | 接收链接,请求目标平台,返回 JSON 数据 |
| .htaccess | Apache 配置 | 伪静态规则,隐藏真实路径,控制访问 |
| .user.ini | PHP 配置 | 设置禁用函数、内存上限、连接超时等 |
| js/layui.js | 前端库 | UI 框架,承载表单、弹窗、加载状态 |
| js/jquery.min.js | 前端库 | DOM 操作和 ajax 依赖 |
| js/main.js | 业务脚本 | 把表单的提交行为与 api.php 串起来 |
| js/mui-player.min.js | 播放器 | 渲染视频播放器,移动端适配较好 |
| css/APlayer.min.css | 播放器 | APlayer 配套样式,备用播放器方案 |
| css/layui.css 等 | 样式 | 页面整体布局和组件样式 |
从链路角度看,index.php 与 api.php 的协作方式是整套资源最核心的部分。前端通过 ajax 把链接 POST 给 api.php,api.php 返回 JSON,main.js 再根据返回结果决定是渲染播放器还是弹出错误信息。业务逻辑全部收敛在 api.php 里,这也是这一类源码的通用做法。
layui 选型在这里很合理。相比 Vue 和 React 那套需要构建步骤的体系,layui 直接引 js 和 css 就能跑,适合这种没有编译环境的 PHP 虚拟主机。mui-player 和 APlayer 同时出现也不是冗余,前者对移动端适配更稳,后者桌面端观感更好,解析源可以根据 video_type 字段决定用哪个渲染。
2.2 api.php 核心流程:请求、提取、拼接口、返回
短视频解析本质上就三步:请求目标页面、从 HTML 或接口返回里提取视频真实地址、把结果整理成固定结构返回。api.php 承担了全部后端流程,我拆过很多同类源码,骨架基本都是下面这个结构。
<?php // 伪代码:api.php 的整体骨架,完整逻辑以压缩包内版本为准 header('Content-Type: application/json; charset=utf-8'); // 接收参数,优先取 POST,兼容 GET 方便调试 $url = trim($_POST['url'] ?? $_GET['url'] ?? ''); if ('' === $url || !filter_var($url, FILTER_VALIDATE_URL)) { echo json_encode(['code' => 400, 'msg' => '链接不合法'], JSON_UNESCAPED_UNICODE); exit; } // 用 curl 请求目标页面,拿到 HTML 后再进一步处理 $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, // 短链跳转必须开 CURLOPT_TIMEOUT => 15, // 短视频接口响应通常 5 秒内 CURLOPT_HTTPHEADER => [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Referer: https://www.douyin.com/', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', ], ]); $html = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if (200 !== $httpCode) { echo json_encode(['code' => 502, 'msg' => '目标页面返回异常 HTTP ' . $httpCode]); exit; } // 从 URL 中提取视频 id,不同平台的正则不一样 if (!preg_match('/(?:video|note)\/(\d+)/i', $url, $m)) { echo json_encode(['code' => 400, 'msg' => '无法从链接中识别视频 ID']); exit; } $vid = $m[1]; // 这里省略按平台规则拼装 API 并二次请求的过程 // 常见做法是请求平台的公开播放接口,把 vid 换成播放地址 echo json_encode([ 'code' => 200, 'data' => [ 'title' => '示例标题', 'cover' => 'https://example.com/cover.jpeg', 'play_url' => 'https://example.com/play.mp4', ], ], JSON_UNESCAPED_UNICODE);这段伪代码里需要关注三个参数。第一个是CURLOPT_TIMEOUT设为 15 秒,接口响应通常在 1 到 5 秒内,超过 15 秒基本可判定网络或接口异常,没必要让用户一直转圈。第二个是请求头里的 User-Agent 和 Referer,两者必须配对,Referer 与目标域名不一致时请求很容易被 403 拦截。第三个是JSON_UNESCAPED_UNICODE,保证中文标题不会变成\uXXXX转义序列,前端拿到后能直接显示。
二次请求接口时,抖音、快手、B站各自有一套公开的播放接口路径,有的直接返回 mp4 直链,有的返回 m3u8 索引文件。我一般在这一步会把返回的 JSON 完整存下来,先看字段结构再写映射,而不是凭猜。压缩包里的原始版本大概率没有这么细的拆分,但改成这个结构并不难,3.3 节会给出一个具体的分发写法。
2.3 index.php 与 main.js:前端表单、播放器与 JSON 对接
index.php 承担的工作很轻,只负责输出页面结构,事件绑定全在 main.js 里。这种写法在轻量级工具站点里很常见:PHP 管数据,JavaScript 管交互。界面是一个 layui 表单,用户在输入框里贴链接,点“解析”按钮后 main.js 发起 ajax 请求 api.php。
// main.js 中的核心请求逻辑 $('#parseBtn').on('click', function () { const url = $('#videoUrl').val().trim(); if (!url) { layer.msg('请先粘贴视频链接'); return; } $.ajax({ url: 'api.php', type: 'POST', data: { url: url }, dataType: 'json', beforeSend: function () { layer.load(1); // 防重复点击 }, success: function (res) { layer.closeAll('loading'); if (res.code !== 200) { layer.msg(res.msg || '解析失败'); return; } const d = res.data; // APlayer 和 mui-player 都支持直接吃 mp4 直链 const ap = new APlayer({ element: document.getElementById('player'), video: { url: d.play_url, type: 'auto' }, autoplay: false }); $('#videoInfo').html( '<p>标题:' + d.title + '</p>' + '<p>播放量:' + (d.stats || '未知') + '</p>' ); }, error: function (xhr) { layer.closeAll('loading'); layer.msg('请求异常:' + xhr.status); } }); });这段代码里的 APlayer 实例化有两个细节。video.type设为'auto',它会根据 URL 后缀自动判断格式,遇到不带.mp4后缀的 CDN 直链也能播放;如果平台返回的是 m3u8,则建议换 mui-player 或额外引入 hls.js,因为 APlayer 原版对 HLS 支持需要插件。autoplay: false也有讲究,多数浏览器会拦截带声音的自动播放,设置成 false 反而能避免报错。
整个前端部分的核心是 ajax 请求与鉴权参数的传递。如果 api.php 需要鉴权参数(时间戳加签名),main.js 还得在请求前先取一次 token,再带着 token 请求解析接口。压缩包里的原始版本可能没有这层设计,但部署到公网后建议补上,避免任何人直接调用你的服务器资源。
3. 部署与二次开发:上传、配置、替换适配层
这一章解决动手时的三个问题:环境最低要求是什么,上传后要改哪些配置,以及如何在不重写整套代码的情况下适配新的平台。
3.1 环境要求与选型:为什么这套源码更适合 PHP + Apache
从压缩包里的.htaccess和.user.ini两个文件就能看出,这套源码设计上主要面向 PHP + Apache。.htaccess是 Apache 专属的目录级配置,用来实现伪静态、设置访问控制;Nginx 不读取.htaccess,如果你只有 Nginx 服务器,需要把规则手工转换到 server 块里。环境清单如下:
| 检查项 | 建议值 | 说明 |
|---|---|---|
| PHP 版本 | 5.6 以上,推荐 7.4 | 源码未使用强类型或 enum,老版本也能跑,但 7.x 性能更好 |
| Web 服务器 | Apache 2.4 | .htaccess 原生支持,伪静态零配置 |
| PHP 扩展 | curl、json、openssl | curl 请求外部接口,json 编解码,openssl 处理 HTTPS |
| 上传方式 | 直接 FTP / SSH 解压 | 不需要 composer install,没有第三方版本依赖 |
这里有个检查点:PHP 5.6 和 7.x 对JSON_UNESCAPED_UNICODE的解析行为完全一致,但对超大数字会自动转成 float 导致精度丢失。如果你在接口返回里看到播放量为1.23456789012e+19这种形式,就是这个问题,建议在 api.php 里把大数字字段先转成 string 再返回。
如果你的服务器是 Nginx,.htaccess里的规则需要转成如下形式:
# nginx server 块中对应 .htaccess 的核心规则 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?$1 last; } }这段配置的意思是把不存在的文件路径全部交给 index.php 处理。Nginx 里没有RewriteBase的概念,子目录部署时直接在 server_name 对应的 root 上配置即可,不要再嵌套一层 location。
3.2 部署步骤:解压、权限、扩展检查
将压缩包上传到服务器根目录后,依次执行以下命令。如果用的是宝塔面板,可以直接在文件管理里解压,但权限仍建议手动确认。
# 假设压缩包已经上传到 /var/www/html 下 cd /var/www/html # 解压。压缩包根目录如果是嵌套文件夹,需要先看结构 unzip -o 72479上传即可使用的短视频解析源码.zip # 权限:PHP 进程需要能读写站点目录 chown -R www-data:www-data /var/www/html chmod -R 755 /var/www/html # 确认 PHP 扩展是否齐全 php -m | grep -E 'curl|json|openssl'解压后一定要先确认文件是不是直接位于站点根目录。如果外层多包了一层同名文件夹,访问域名时就会去请求那个文件夹,伪静态规则整体失效,这也是新手最容易误判的一步,访问首页看到 404 时先查这个。
权限设置方面,目录给 755、文件给 644 是最稳的组合。chown www-data是让 PHP-FPM 进程有权限写缓存目录和日志文件。如果代码里有用到文件缓存,缓存目录需要单独给 775 或让进程组可写,否则运行时报“Permission denied”。
3.3 二次开发:按平台分发解析逻辑的写法
短视频解析的通用套路是:不同平台 URL 规则不同、接口不同、返回字段不同,但外层流程完全一样,都是请求页面 → 提取 ID → 拼接口 → 返回 JSON。所以我会在 api.php 里做平台分发:
<?php // 平台分发:根据 URL 中的域名决定走哪套解析逻辑 function resolve_platform($url) { $host = parse_url($url, PHP_URL_HOST); if (strpos($host, 'douyin.com') !== false) { return 'douyin'; } if (strpos($host, 'kuaishou.com') !== false) { return 'kuaishou'; } if (strpos($host, 'bilibili.com') !== false) { return 'bilibili'; } return 'unknown'; } function parse_by_platform($platform, $url) { switch ($platform) { case 'douyin': // 抖音类:识别 video/{id},调用播放接口取直链 return ['code' => 200, 'data' => douyin_parse($url)]; case 'kuaishou': // 快手类:短链先重定向,拿到真实 ID 再取直链 return ['code' => 200, 'data' => kuaishou_parse($url)]; case 'bilibili': // B站:解析 BV 号,调用 view 接口拿 play_url return ['code' => 200, 'data' => bilibili_parse($url)]; default: return ['code' => 400, 'msg' => '暂不支持的平台']; } }switch 分发的优势是隔离性。多个平台各自维护一套正则和接口拼装,互不干扰;某天平台 A 改版导致解析失效,你只需要修 A 的分支,不会影响 B 和 C。我一般还会给每个分支配一个独立函数,例如douyin_parse()、kuaishou_parse(),这样改一个平台逻辑时不会手滑改动另一个平台的代码。
字段映射是这部分的另一个重点。平台返回的 JSON 字段名可能与源码默认输出不一致,常见做法是在每个分支收尾处做一次字段标准化,统一成 title、cover、play_url、stats 四个键。好处是前端 main.js 完全不用改,换平台时只动 api.php 就行。
4. 避坑指南:短视频解析最常见的五个翻车点
解析类工具最大的特点就是脆弱:平台接口一变,这边就翻车,而且通常没有错误日志,只表现为空白页或一直 loading。下面五条都是这一类源码里排名靠前的高频问题,按“现象 → 原因 → 解决”记录。
4.1 昨天还能解析,今天全部超时
现象:同一个视频链接,前一天解析正常,今天 api.php 开始返回 502 或直接超时。
原因:短视频平台的接口地址或参数签名做了调整,也可能直接封禁了服务器 IP。这类变动没有公告,只有当你发起请求时才会发现。
解决:先抓一次实际请求的响应头,判断是 403 还是超时。如果是 403,说明请求头里的 UA、Referer、Cookie 需要更新;如果是超时,大概率是 IP 被限流,换一个出口 IP 再试。如果确认是接口地址变动,就去页面源码里重新找新的接口路径,这就是 3.3 节把平台逻辑单独拆开的真正原因。
4.2 上传后访问根目录 404 或 500
现象:把源码上传到服务器后,访问域名直接 404,或者 PHP 文件报 500 错误。
原因:404 大概率是伪静态规则没生效,Apache 的 rewrite 模块未开启,或.htaccess不在站点根目录;500 大概率是 PHP 版本过低、某个函数被禁用、或.user.ini里的配置与当前环境冲突。
解决:先直接访问/index.php,如果能打开,说明 PHP 运行正常,问题只出在伪静态;如果也打不开,看 PHP 错误日志。.user.ini中disable_functions不要包含curl_init、curl_exec、file_get_contents这些与网络请求相关的函数,否则 api.php 必挂。
4.3 解析成功但播放器不出画面
现象:api.php 返回了 200,前端也拿到了 play_url,但点击播放一片黑。
原因:最常见的是防盗链。视频 CDN 会根据 Referer 判断请求来源,直接从页面加载时,Referer 是播放器所在域名,而 CDN 只允许平台自身域名来源。
解决:可以给视频标签加referrerpolicy="no-referrer",让浏览器在请求视频时不发送 Referer 字段,部分 CDN 会放行;更稳的方式是后端代理,让 api.php 去请求视频流再转发给前端,缺点是消耗服务器带宽。先试前者,不行再上代理。
4.4 部署在子目录时页面样式全乱
现象:源码放在域名根目录一切正常,放到/tools/子目录后,js、css 全部加载失败,页面变成纯文字。
原因:页面里的静态资源路径使用了绝对路径/js/main.js或/css/layui.css,子目录部署时浏览器会去域名根请求,自然 404。
解决:把 index.php 里的静态资源路径改成相对路径,或者用 PHP 动态拼base_url。改完还要同步检查.htaccess里的 RewriteBase,子目录部署时如果写死了根目录路径也会 404。
4.5 解析出来的视频有水印或画质很低
现象:拿到的高清直链能播放,但播放的是平台的水印版或低清版。
原因:解析到的接口是预览接口或转码接口,不是原始上传文件。多数平台的原始文件在另一个 CDN 路径下,需要替换 URL 中的某些路径参数,或额外添加鉴权后缀。
解决:如果需求是内容分析,有水印不影响获取标题和播放量;如果一定要无水印版本,需要研究平台 CDN 的路径规律,这属于逆向工程。我的建议是把这类需求限制在个人学习范围内,不要用于二次分发。
5. 进阶技巧:把解析服务做得更稳的三件小事
如果前面几章解决的是“能用”,这一章解决的是“用得久”。
5.1 加一层文件缓存,减少重复外部请求
短视频解析和绝大多数 API 工具一样,最大的敌人是接口波动。我的做法是给解析结果加文件缓存:在 api.php 里以视频 ID 为 key,把结果存到 cache 目录,设 6 小时过期。同一视频在缓存有效期内直接返回,不发起外部请求。实际效果是平台的频率限制松很多,服务器出口 IP 被封的概率也大幅降低。缓存目录的写入权限要在部署时一并确认,否则每次解析都会报错。
5.2 把日志写全,平台接口变动时可定位到分钟级
原始版本没有日志文件,但这套源码上线后必须补。我会在 api.php 的每个分支出口追加一条 jsonl 记录,包含时间、IP、请求 URL、平台、HTTP 状态码、耗时。平台接口一旦变动,日志能快速告诉你“今天 9 点后抖音链接全部失败”,顺着时间点去查平台侧变更,比挨个试链接高效得多。日志文件注意按天切割,否则一个月下来就是几百兆。
5.3 频率控制与合规边界
最后也是最关键的事:控制解析频率。这套源码可以帮助你做内容分析和数据采样,但不要用它去批量采集大量用户内容用于公开传播。平台能容忍低频个人使用,却会对高频抓取做封禁,甚至上升到法律层面。我的习惯是:个人测试和收藏用,绝不二次分发解析到的内容;如果需要做数据集,只保留标题、封面、播放量等元数据,不保存视频文件。缓存加频率限制,既是技术手段也是合规手段。
这套上传即可使用的短视频解析源码,压缩包里已经包含了 index.php、api.php 和全部前端资源,拿下来直接按第 3 章的步骤部署就能跑。从那以后,我每次部署解析工具都会强制走一遍:先检查.user.ini的禁用函数,再把平台逻辑抽成独立函数,最后加缓存和日志。这三个动作帮我省掉了大量深夜被接口变动叫起来的工作量,希望你也从一开始就把这步做了。希望帮到你。
本文还有配套的精品资源,点击获取