php读取b站数据需调用其官方api,通过curl或file_get_contents发起https请求,携带user-agent、referer及有效cookie(如sessdata、bili_jct),未登录仅能获取少量公开信息;写入操作(如发评论)还需csrf token(bili_jct)并严格设置origin与referer头,否则易触发风控或返回400/403错误。

PHP怎么读取B站云数据(实际是调用Bilibili API)
B站没有公开的“云数据”服务,所谓“B站云数据”通常指通过 Bilibili 官方 API(如用户信息、视频列表、弹幕、收藏夹等)获取的结构化数据。PHP 本身不能直接访问 B 站后端数据库,只能走 HTTP 接口。
- 必须使用
curl或file_get_contents(需开启allow_url_fopen)发起 HTTPS 请求 - 所有接口需带
Cookie或access_token,未登录状态只能查极少量公开数据(如视频基本信息) - 常见错误:
412 Precondition Failed表示缺少Referer或user-agent;403多因 Cookie 过期或风控拦截 - 示例(获取用户主页信息):
$url = 'https://api.bilibili.com/x/space/acc/info?mid=123456789'; $opts = [ 'http' => [ 'method' => 'GET', 'header' => "User-Agent: Mozilla/5.0\r\nReferer: https://www.php.cn/link/56cfe2907f1c9a45d94b996b8de5be47/\r\nCookie: SESSDATA=xxx;\r\n" ] ]; $content = file_get_contents($url, false, stream_context_create($opts)); $data = json_decode($content, true);
PHP怎么写入B站数据(如发评论、投币、收藏)
写操作必须登录态 + CSRF Token(bili_jct),且需 POST 请求,不能只靠 Cookie。
-
bili_jct从登录后的 Cookie 中提取,不是固定值,每次登录会变 - 所有 POST 接口必须在请求头中带上
Origin: @#@#@#@#@#@#@#@#@#@0和Referer,否则返回400或403 - 常见失败原因:CSRF token 错误、登录态过期、接口限频(如评论 30 秒内只能发 1 条)、账号被风控(返回
25004错误码) - 示例(发送评论):
$url = 'https://api.bilibili.com/x/v2/reply/add'; $data = http_build_query([ 'oid' => '123456789', 'type' => '1', 'message' => 'Hello from PHP', 'csrf' => 'abc123...' // 即 bili_jct ]); $opts = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n". "User-Agent: Mozilla/5.0\r\n". "Referer: https://www.php.cn/link/56cfe2907f1c9a45d94b996b8de5be47/video/BV1xx411c7mu\r\n". "Cookie: SESSDATA=xxx; bili_jct=abc123...;\r\n", 'content' => $data ] ]; $response = file_get_contents($url, false, stream_context_create($opts));
PHP处理B站API返回的JSON数据要注意什么
B站 API 返回体结构不统一,有些带 code 字段(0 表示成功),有些带 result,还有些直接平铺字段(如 /x/space/acc/info)。
提取B站(bilibili.com)视频的完整文字稿。当用户需要提取、获取、下载B站视频的文字稿、字幕、转录内容、语音转文字时使用此skill。支持从视频URL提取音频并使用Whisper进行中文语音识别,生成带时间戳的结构化文字稿。触发词包括"提取B站""B站文字稿""bilibili转录""视频转文字"等。
- 不要假设所有接口都用
$data['data']取业务数据,先看文档或打印原始响应 - 弹幕 XML 接口(
/x/v2/dm/web/seg.so)返回的是二进制 protobuf 数据,PHP 原生无法直接解析,需用第三方库(如google/protobuf)或转调 Node.js/Python 处理 - 部分字段含 HTML 实体(如
&),用htmlspecialchars_decode()解码后再显示 - 分页参数名不一致:有的用
pn(page number),有的用page,还有的用offset,得看具体接口文档
为什么你的PHP脚本突然被B站封禁或返回空数据
不是代码写错了,大概率是触发了 B 站的反爬机制。
- 单 IP 短时间高频请求(如每秒 >1 次)会被临时限制,返回空 JSON 或
503 - User-Agent 长期不变、无 Referer、无 Cookie 的请求容易被识别为爬虫
- 使用模拟登录(如填账号密码自动 POST)违反 B 站
robots.txt和用户协议,账号可能被冻结 - 更稳妥的做法:只在用户授权前提下,用 OAuth2 获取
access_token,走 Open Platform 接口(目前仅对认证开发者开放部分能力)
B站 API 的边界模糊、文档滞后、行为策略频繁调整——最麻烦的从来不是 PHP 怎么发请求,而是你怎么让请求看起来“像人”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










