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);
}
?>