直接把下面这一整份保存成你的 `2026.php` 就能用。这里已经改成“不跳转自己”,底部是介绍、服务引流、复制客服微信、回到顶部,不影响原来的下载功能。 记得改这一行: ```php $serviceWechat = '这里填写你的客服微信'; ``` 完整代码: ```php '创作', 'title' => '短视频爆款文案', 'desc' => '提供标题、口播脚本、带货文案、评论区互动、私域引流话术等内容支持。', ], [ 'tag' => '素材', 'title' => '视频素材整理', 'desc' => '适合剪辑号、矩阵号、带货号整理素材,提高内容制作效率。', ], [ 'tag' => '社群', 'title' => '工具更新通知', 'desc' => '后续视频下载、文案生成、素材整理等实用工具会持续更新。', ], ]; $qualityParams = [ 'original' => '', 'hd' => 'X-snsvideoflag=xV9', 'sd' => 'X-snsvideoflag=xV10', 'smooth' => 'X-snsvideoflag=xV4', ]; $qualityLabels = [ 'original' => '原画质', 'hd' => '高清', 'sd' => '标清', 'smooth' => '流畅', ]; function http_get(string $url, array $headers = [], int $timeout = 30): string { if (!function_exists('curl_init')) { throw new RuntimeException('服务器未启用CURL扩展'); } $ch = curl_init($url); if ($ch === false) { throw new RuntimeException('无法初始化CURL'); } $defaultHeaders = [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36', 'Referer: https://sp.fyzx.top/', 'Accept: */*', ]; curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => $timeout, CURLOPT_HTTPHEADER => array_merge($defaultHeaders, $headers), CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, ]); $body = curl_exec($ch); if ($body === false) { $error = curl_error($ch); curl_close($ch); throw new RuntimeException('CURL错误: ' . $error); } $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code < 200 || $code >= 300) { throw new RuntimeException('HTTP状态码异常:' . $code); } return $body; } function normalize_url(?string $url): string { if ($url === null || $url === '') { return ''; } $url = trim((string)$url); $url = trim($url, "'\""); $url = rtrim($url, "',;]}\""); return $url; } function is_http_url(string $url): bool { $parts = parse_url($url); if (!is_array($parts)) { return false; } $scheme = strtolower((string)($parts['scheme'] ?? '')); $host = (string)($parts['host'] ?? ''); return in_array($scheme, ['http', 'https'], true) && $host !== ''; } function clean_title_id(?string $title): string { $title = trim((string)$title); $title = trim($title, "'\""); $title = preg_replace('/^\s*\d{4,}[_\-\s]+/u', '', $title); $title = preg_replace('/[^\p{L}\p{N}\s\-_\.]/u', '', $title); $title = preg_replace('/\s+/u', ' ', $title); return trim((string)$title) !== '' ? trim((string)$title) : 'untitled'; } function safe_filename(?string $name, int $maxLen = 90): string { $name = clean_title_id($name); $name = preg_replace('/[\r\n\t]+/u', ' ', $name); $name = preg_replace('/[\\\\\/:*?"<>|\x00-\x1F]/u', '_', $name); $name = preg_replace('/\s+/u', ' ', $name); $name = trim((string)$name, " ."); if ($name === '') { $name = 'untitled'; } $reserved = [ 'CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9', ]; if (in_array(strtoupper($name), $reserved, true)) { $name = '_' . $name; } if (function_exists('mb_strlen') && function_exists('mb_substr')) { if (mb_strlen($name, 'UTF-8') > $maxLen) { $name = mb_substr($name, 0, $maxLen, 'UTF-8'); } } elseif (strlen($name) > $maxLen) { $name = substr($name, 0, $maxLen); } $name = trim($name, " ."); return $name !== '' ? $name : 'untitled'; } function guess_ext(string $url, string $default = '.mp4'): string { $path = strtolower((string)(parse_url($url, PHP_URL_PATH) ?? '')); foreach (['.mp4', '.mov', '.m4v', '.webm', '.mkv', '.flv'] as $ext) { if (str_ends_with($path, $ext)) { return $ext; } } return $default; } function should_add_quality_param(string $url): bool { $host = strtolower((string)(parse_url($url, PHP_URL_HOST) ?? '')); $allowedHosts = [ 'finder.video.qq.com', 'wxapp.tc.qq.com', '51.wxapp.tc.qq.com', 'findernd.video.qq.com', 'findera4.video.qq.com', ]; return in_array($host, $allowedHosts, true); } function add_quality(string $url, string $quality, array $qualityParams): string { if ($url === '') { return ''; } if (!should_add_quality_param($url)) { return $url; } $param = $qualityParams[$quality] ?? ''; if ($param === '') { return $url; } if (str_contains($url, 'X-snsvideoflag=')) { return $url; } $sep = str_contains($url, '?') ? '&' : '?'; return $url . $sep . $param; } function token_for_video(array $video): string { return hash( 'sha256', json_encode($video, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . microtime(true) . random_int(1000, 9999) ); } function fetch_videos(string $userid): array { $apiUrl = sprintf(API_TEMPLATE, rawurlencode($userid)); $body = http_get($apiUrl, [], 30); $json = json_decode($body, true); if (!is_array($json)) { throw new RuntimeException('接口返回不是有效JSON'); } if (($json['code'] ?? null) != 1) { throw new RuntimeException((string)($json['msg'] ?? '接口返回失败')); } $videos = []; $_SESSION['videos'] = []; foreach (($json['data'] ?? []) as $index => $item) { if (empty($item['url'])) { continue; } $url = normalize_url((string)$item['url']); if ($url === '' || !is_http_url($url)) { continue; } $title = clean_title_id((string)($item['title'] ?? ('video_' . ($index + 1)))); $cover = normalize_url((string)($item['cover'] ?? '')); if ($cover !== '' && !is_http_url($cover)) { $cover = ''; } $time = (string)($item['parseTime'] ?? $item['time'] ?? ''); $video = [ 'title' => $title, 'url' => $url, 'cover' => $cover, 'time' => $time, ]; $token = token_for_video($video); $_SESSION['videos'][$token] = $video; $videos[] = [ 'token' => $token, 'title' => $title, 'cover' => $cover, 'time' => $time, 'url' => $url, ]; } return $videos; } function stream_download(string $url, string $filename): void { while (ob_get_level() > 0) { ob_end_clean(); } @set_time_limit(0); ignore_user_abort(true); $url = normalize_url($url); if ($url === '' || !is_http_url($url)) { http_response_code(400); header('Content-Type: text/plain; charset=UTF-8'); echo '视频链接无效'; exit; } if (!function_exists('curl_init')) { http_response_code(500); header('Content-Type: text/plain; charset=UTF-8'); echo '服务器未启用CURL扩展'; exit; } $ch = curl_init($url); if ($ch === false) { http_response_code(500); header('Content-Type: text/plain; charset=UTF-8'); echo '无法初始化下载'; exit; } $host = strtolower((string)(parse_url($url, PHP_URL_HOST) ?? '')); $referer = str_contains($host, 'douyinvod.com') ? 'https://www.douyin.com/' : 'https://sp.fyzx.top/'; $requestHeaders = [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36', 'Referer: ' . $referer, 'Accept: video/mp4,video/*;q=0.9,*/*;q=0.8', 'Accept-Encoding: identity', 'Connection: keep-alive', ]; $clientRange = trim((string)($_SERVER['HTTP_RANGE'] ?? '')); if ($clientRange !== '' && preg_match('/^bytes=\d*-\d*$/i', $clientRange)) { $requestHeaders[] = 'Range: ' . $clientRange; } $statusCode = 0; $responseHeaders = []; $downloadHeadersSent = false; $sendDownloadHeaders = static function () use (&$downloadHeadersSent, &$statusCode, &$responseHeaders, $filename): void { if ($downloadHeadersSent || headers_sent()) { return; } $downloadHeadersSent = true; if ($statusCode === 206) { http_response_code(206); } elseif ($statusCode >= 200 && $statusCode < 300) { http_response_code(200); } else { http_response_code($statusCode >= 400 ? $statusCode : 502); } $contentType = str_replace(["\r", "\n"], '', (string)($responseHeaders['content-type'] ?? 'video/mp4')); header('Content-Type: ' . $contentType); header('Content-Disposition: attachment; filename="video.mp4"; filename*=UTF-8\'\'' . rawurlencode($filename)); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Pragma: no-cache'); header('X-Accel-Buffering: no'); header('Accept-Ranges: bytes'); if (!empty($responseHeaders['content-length']) && ctype_digit($responseHeaders['content-length'])) { header('Content-Length: ' . $responseHeaders['content-length']); } if (!empty($responseHeaders['content-range'])) { header('Content-Range: ' . str_replace(["\r", "\n"], '', $responseHeaders['content-range'])); } }; curl_setopt_array($ch, [ CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 15, CURLOPT_TIMEOUT => 0, CURLOPT_HTTPHEADER => $requestHeaders, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => false, CURLOPT_BUFFERSIZE => 64 * 1024, CURLOPT_HEADERFUNCTION => static function ($ch, string $headerLine) use (&$statusCode, &$responseHeaders): int { $lineLength = strlen($headerLine); $line = trim($headerLine); if ($line === '') { return $lineLength; } if (preg_match('#^HTTP/\S+\s+(\d{3})#i', $line, $match)) { $statusCode = (int)$match[1]; $responseHeaders = []; return $lineLength; } $position = strpos($line, ':'); if ($position === false) { return $lineLength; } $name = strtolower(trim(substr($line, 0, $position))); $value = trim(substr($line, $position + 1)); if (in_array($name, ['content-type', 'content-length', 'content-range'], true)) { $responseHeaders[$name] = $value; } return $lineLength; }, CURLOPT_WRITEFUNCTION => static function ($ch, string $chunk) use (&$sendDownloadHeaders, &$statusCode): int { if ($statusCode < 200 || $statusCode >= 300) { return strlen($chunk); } $sendDownloadHeaders(); echo $chunk; flush(); return strlen($chunk); }, ]); $ok = curl_exec($ch); $curlError = curl_error($ch); $curlCode = curl_errno($ch); $finalStatus = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($ok === false && !$downloadHeadersSent) { http_response_code(502); header('Content-Type: text/plain; charset=UTF-8'); echo $curlCode !== 0 ? '备用下载失败:' . $curlError : '备用下载失败'; exit; } if (!$downloadHeadersSent) { http_response_code($finalStatus >= 400 && $finalStatus <= 599 ? $finalStatus : 502); header('Content-Type: text/plain; charset=UTF-8'); if ($finalStatus === 403) { echo '视频链接已失效或被服务器拒绝,请返回页面重新获取列表'; } elseif ($finalStatus === 404) { echo '视频文件不存在,请返回页面重新获取列表'; } else { echo '备用下载失败,上游状态码:' . $finalStatus; } } exit; } function h(?string $value): string { return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function is_ios_device(): bool { $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; return (bool)( preg_match('/iPad|iPhone|iPod/i', $userAgent) && !preg_match('/Windows Phone/i', $userAgent) ); } function is_android_device(): bool { $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; return (bool)preg_match('/Android/i', $userAgent); } $error = ''; $videos = []; $userid = trim((string)($_POST['userid'] ?? $_GET['userid'] ?? '')); $quality = trim((string)($_POST['quality'] ?? $_GET['quality'] ?? 'hd')); $isIos = is_ios_device(); $isAndroid = is_android_device(); if (!array_key_exists($quality, $qualityLabels)) { $quality = 'hd'; } if (!isset($_SESSION['videos']) || !is_array($_SESSION['videos'])) { $_SESSION['videos'] = []; } if (isset($_GET['download_ios'])) { $token = (string)$_GET['download_ios']; if (!isset($_SESSION['videos'][$token])) { http_response_code(404); header('Content-Type: text/plain; charset=UTF-8'); echo '下载链接已过期,请返回页面重新获取列表'; exit; } $video = $_SESSION['videos'][$token]; $downloadUrl = add_quality((string)($video['url'] ?? ''), $quality, $qualityParams); $downloadUrl = normalize_url($downloadUrl); if ($downloadUrl === '' || !is_http_url($downloadUrl)) { http_response_code(404); header('Content-Type: text/plain; charset=UTF-8'); echo '视频链接无效'; exit; } $filename = safe_filename((string)($video['title'] ?? 'untitled'), 100) . '_' . substr(md5($downloadUrl), 0, 8) . guess_ext($downloadUrl, '.mp4'); session_write_close(); stream_download($downloadUrl, $filename); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { if ($userid === '') { throw new RuntimeException('请输入用户ID'); } $videos = fetch_videos($userid); if (empty($videos)) { $error = '没有找到视频,请检查用户ID是否正确'; } } catch (Throwable $e) { $error = $e->getMessage(); } } else { if (!empty($_SESSION['videos'])) { foreach ($_SESSION['videos'] as $token => $video) { if (empty($video['url'])) { continue; } $videos[] = [ 'token' => $token, 'title' => $video['title'] ?? 'untitled', 'cover' => $video['cover'] ?? '', 'time' => $video['time'] ?? '', 'url' => $video['url'], ]; } } } ?> 文案鹰视频提取器

视频提取器【视频下载工具】

输入你的专属ID获取已解析视频列表。如何查看自己的ID:给企业微信发送「我的id」这几个字,点击系统回复的小程序卡片进去即可看到ID;不懂的可以咨询客服微信。
⚠️

第一步:点击「下载视频」按钮,在弹出窗口中点击「下载」,视频即开始下载。

第二步:等待进度条走完,下载完成后,在 Safari 顶部地址栏右侧找到「⬇️ 下载图标」,点击查看已下载的视频。

提示:如果找不到下载图标,地址栏左侧有个「大小」字样按钮,它旁边通常就是下载图标。不同机型位置略有不同,认准⬇️图标即可。

第三步:在下载列表中找到刚下载的视频,点击打开,然后点击右下角「分享」图标,选择「存储视频」即可保存到相册。

备用方式:如果点击「下载视频」后没有反应或失败,直接点击下方的「备用下载」链接即可。

第一步:点击「下载视频」。

第二步:视频自动下载,完成后在相册或文件管理中查看。

封面
无封面
▶ 打开视频
等待下载
备用下载(直连失败时使用)
没有找到视频,请检查用户ID是否正确

关于

专注短视频创作效率工具,帮助用户更方便地获取视频、整理素材、生成文案和提升账号运营效率。 当前页面主要用于视频下载,不会影响你正常获取视频列表、打开视频和下载保存。

视频下载 支持查看已解析视频,复制地址、打开视频和下载保存。
文案创作 适合短视频标题、口播脚本、带货文案和私域引流话术。
素材整理 帮助创作者整理视频素材、爆款选题和内容灵感。
运营辅助 适合矩阵号、剪辑号、带货号和本地生活账号使用。

更多工具与服务

如果你经常需要下载视频、整理素材或制作短视频,可以继续关注。 后续会持续更新更多视频工具、文案工具和短视频运营方法。

需要更多帮助?

如果你不会查看自己的ID、下载失败、视频打不开,或者想获取更多文案和视频工具,可以联系客服。

客服微信:
添加时备注「视频下载」,方便快速处理。
```