MENU

bilibili视频解析 API 实现方法

April 28, 2025 • Read: 100 • Code

API仅供学习交流使用,禁止用于商业用途、违法用途等,否则后果自负!


PHP版:(画质有点问题自己修复,Cookie改成自己的)

<?php
// 开启错误报告
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 获取用户传入的 B 站视频链接
$videoUrl = $_GET['url'] ?? '';

// 解析视频链接,获取视频的 BV 号
preg_match('/(BV[a-zA-Z0-9]+)/', $videoUrl, $matches);
if (empty($matches)) {
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 400,
        'message' => '未找到有效的 BV 号',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    exit;
}
$bvid = $matches[1];

// 构建获取视频信息的 API URL
$apiUrl = "https://api.bilibili.com/x/web-interface/view?bvid={$bvid}";

// 记录日志函数
function logMessage($message) {
    $logFile = 'bilibili_api.log';
    $logMessage = date('Y-m-d H:i:s') . " - " . $message . PHP_EOL;
    file_put_contents($logFile, $logMessage, FILE_APPEND);
}

// 使用 cURL 发送请求并设置头信息
$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer: https://www.bilibili.com/'
    ]
]);
$response = curl_exec($ch);
if ($response === false) {
    logMessage("获取视频信息 API 请求失败: " . curl_error($ch));
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 500,
        'message' => '获取视频信息 API 请求失败',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    curl_close($ch);
    exit;
}
curl_close($ch);

// 解析 JSON 响应
$responseData = json_decode($response, true);

if ($responseData['code'] === 0) {
    $videoInfo = $responseData['data'];
    $title = $videoInfo['title'];
    $author = $videoInfo['owner']['name'];
    $cover = $videoInfo['pic'];
    $cid = $videoInfo['cid'];

    // 构建获取视频播放地址的 API URL
    $playUrlApi = "https://api.bilibili.com/x/player/playurl?bvid={$bvid}&cid={$cid}&fnval=16&platform=html5&qn=80";

    // 在这里加入你的 Cookie
    $cookie = "";

    // 控制请求间隔,避免触发限制
    usleep(500000); // 暂停 0.5 秒

    $ch = curl_init($playUrlApi);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Referer: https://www.bilibili.com/',
            "Cookie: $cookie",
            'Accept: */*',
            'Accept-Language: zh-CN,zh;q=0.9',
            'Connection: keep-alive',
            'TE: Trailers'
        ]
    ]);
    $playUrlResponse = curl_exec($ch);
    if ($playUrlResponse === false) {
        logMessage("获取视频播放地址 API 请求失败: " . curl_error($ch));
        header('Content-Type: application/json');
        echo json_encode([
            'code' => 500,
            'message' => '获取视频播放地址 API 请求失败',
            'tips' => '美言AI'
        ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
        curl_close($ch);
        exit;
    }
    curl_close($ch);

    $playUrlData = json_decode($playUrlResponse, true);
    $playUrl = '';
    if ($playUrlData['code'] === 0) {
        // 优先检查dash格式(支持1080p+高清)
        if (!empty($playUrlData['data']['dash']['video'])) {
            // 按码率降序排序获取最高清版本
            usort($playUrlData['data']['dash']['video'], function($a, $b) {
                return $b['bandwidth'] - $a['bandwidth'];
            });
            
            // 获取第一个(最高清)视频流
            $videoStream = $playUrlData['data']['dash']['video'][0];
            $baseVideoUrl = $videoStream['baseUrl'];
            
            // 获取对应的音频流
            $audioStream = $playUrlData['data']['dash']['audio'][0] ?? null;
            $baseAudioUrl = $audioStream['baseUrl'] ?? '';

            // 合并视频和音频地址
            $playUrl = $baseVideoUrl;
            if (!empty($baseAudioUrl)) {
                $playUrl .= '|' . $baseAudioUrl;
            }

            // 修正参数:使用html5平台参数,去除不必要的mid参数
            $playUrl = preg_replace('/mid=\d+/', 'mid=0', $playUrl);
            $playUrl = str_replace('platform=pc', 'platform=html5', $playUrl);
        } 
        // 回退到durl方案(如果dash不可用)
        elseif (!empty($playUrlData['data']['durl'][0]['url'])) {
            $durl = $playUrlData['data']['durl'][0]['url'];
            $playUrl = str_replace(
                ['platform=pc', 'mid='.urlencode($videoInfo['owner']['mid'])],
                ['platform=html5', 'mid=0'],
                $durl
            );
        }
    } else {
        logMessage("获取视频播放地址失败,错误信息: " . json_encode($playUrlData));
    }

    // 返回解析结果
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 200,
        'title' => $title,
        'author' => $author,
        'cover' => $cover,
        'play_url' => $playUrl,
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} else {
    logMessage("未找到视频信息,错误信息: " . json_encode($responseData));
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 404,
        'message' => '未找到视频信息',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
?>

高画质版:(但是视频加载0秒未修复)

<?php
// 开启错误报告
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 获取用户传入的 B 站视频链接
$videoUrl = $_GET['url'] ?? '';

// 解析视频链接,获取视频的 BV 号
preg_match('/(BV[a-zA-Z0-9]+)/', $videoUrl, $matches);
if (empty($matches)) {
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 400,
        'message' => '未找到有效的 BV 号',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    exit;
}
$bvid = $matches[1];

// 构建获取视频信息的 API URL
$apiUrl = "https://api.bilibili.com/x/web-interface/view?bvid={$bvid}";

// 记录日志函数
function logMessage($message) {
    $logFile = 'bilibili_api.log';
    $logMessage = date('Y-m-d H:i:s') . " - " . $message . PHP_EOL;
    file_put_contents($logFile, $logMessage, FILE_APPEND);
}

// 使用 cURL 发送请求并设置头信息
$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer: https://www.bilibili.com/'
    ]
]);
$response = curl_exec($ch);
if ($response === false) {
    logMessage("获取视频信息 API 请求失败: " . curl_error($ch));
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 500,
        'message' => '获取视频信息 API 请求失败',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
    curl_close($ch);
    exit;
}
curl_close($ch);

// 解析 JSON 响应
$responseData = json_decode($response, true);

if ($responseData['code'] === 0) {
    $videoInfo = $responseData['data'];
    $title = $videoInfo['title'];
    $author = $videoInfo['owner']['name'];
    $cover = $videoInfo['pic'];
    $cid = $videoInfo['cid'];

    // 构建获取视频播放地址的 API URL,使用fnval=1
    $playUrlApi = "https://api.bilibili.com/x/player/playurl?bvid={$bvid}&cid={$cid}&fnval=1";

    // 在这里加入你的 Cookie,需要替换为有效的 Cookie
    $cookie = "";

    // 控制请求间隔,避免触发限制
    usleep(500000); // 暂停 0.5 秒

    $ch = curl_init($playUrlApi);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Referer: https://www.bilibili.com/',
            "Cookie: $cookie",
            'Accept: */*',
            'Accept-Language: zh-CN,zh;q=0.9',
            'Connection: keep-alive',
            'TE: Trailers'
        ]
    ]);
    $playUrlResponse = curl_exec($ch);
    if ($playUrlResponse === false) {
        logMessage("获取视频播放地址 API 请求失败: " . curl_error($ch));
        header('Content-Type: application/json');
        echo json_encode([
            'code' => 500,
            'message' => '获取视频播放地址 API 请求失败',
            'tips' => '美言AI'
        ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
        curl_close($ch);
        exit;
    }
    curl_close($ch);

    $playUrlData = json_decode($playUrlResponse, true);
    $playUrl = '';
    if ($playUrlData['code'] === 0) {
        // 优先检查durl,若不存在则检查dash
        if (!empty($playUrlData['data']['durl'][0]['url'])) {
            $playUrl = $playUrlData['data']['durl'][0]['url'];
            // 添加必要的请求头
            $headers = [
                'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
                'Referer: https://www.bilibili.com/',
                "Cookie: $cookie",
                'Accept: */*',
                'Accept-Language: zh-CN,zh;q=0.9',
                'Connection: keep-alive',
                'TE: Trailers'
            ];
            $context = stream_context_create([
                'http' => [
                    'method' => 'HEAD',
                    'header' => implode("\r\n", $headers)
                ]
            ]);
            $headers = @get_headers($playUrl, 1, $context);
            if ($headers && isset($headers['Content-Type']) && strpos($headers['Content-Type'], 'video')!== false) {
                // 确保是视频类型
            } else {
                $playUrl = '';
            }
        } elseif (!empty($playUrlData['data']['dash']['video'][0]['baseUrl'])) {
            $playUrl = $playUrlData['data']['dash']['video'][0]['baseUrl'];
            // 添加必要的请求头
            $headers = [
                'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
                'Referer: https://www.bilibili.com/',
                "Cookie: $cookie",
                'Accept: */*',
                'Accept-Language: zh-CN,zh;q=0.9',
                'Connection: keep-alive',
                'TE: Trailers'
            ];
            $context = stream_context_create([
                'http' => [
                    'method' => 'HEAD',
                    'header' => implode("\r\n", $headers)
                ]
            ]);
            $headers = @get_headers($playUrl, 1, $context);
            if ($headers && isset($headers['Content-Type']) && strpos($headers['Content-Type'], 'video')!== false) {
                // 确保是视频类型
            } else {
                $playUrl = '';
            }
        }
    } else {
        logMessage("获取视频播放地址失败,错误信息: " . json_encode($playUrlData));
    }

    // 返回解析结果
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 200,
        'title' => $title,
        'author' => $author,
        'cover' => $cover,
        'play_url' => $playUrl,
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} else {
    logMessage("未找到视频信息,错误信息: " . json_encode($responseData));
    header('Content-Type: application/json');
    echo json_encode([
        'code' => 404,
        'message' => '未找到视频信息',
        'tips' => '美言AI'
    ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
?>    


Archives QR Code Tip
QR Code for this page
Tipping QR Code