在数字化内容生态中,B站作为国内领先的视频平台,其海量视频数据具有极高的应用价值。无论是构建视频数据分析工具、开发第三方应用,还是实现视频内容聚合,都离不开对视频列表及详情数据的高效获取。本文将系统梳理B站相关API的调用流程,涵盖官方开放平台接口与Web端实用接口,结合认证机制、参数说明、实战示例与避坑指南,帮助开发者快速掌握数据获取能力。
一、前置准备:开发者认证与环境配置
在调用B站API前,需完成基础准备工作,核心包括开发者身份认证、权限申请及环境搭建,不同接口类型的准备要求略有差异。
1.1 开放平台开发者认证(官方接口必备)
B站开放平台(https://member.bilibili.com/open)是官方API的唯一合法获取渠道,适用于需要稳定、合规数据服务的场景。具体步骤如下:
注册与认证:访问开放平台,完成账号注册后,进入"开发者中心"提交企业或个人开发者认证材料,审核通过后获得开发者资质。
创建应用:在开发者中心创建应用,填写应用名称、用途、场景等信息,获取核心凭证——
AccessKeyId和AccessKeySecret(后续签名认证需用到)。
1.2 环境与工具准备
推荐使用以下工具与环境提升开发效率:
开发语言:Python(推荐,拥有丰富的HTTP请求库如requests)、Java、JavaScript等均可。
调试工具:Apifox、Postman(快速验证接口参数与响应)、浏览器开发者工具(分析Web端接口交互)。
依赖库:Python环境需安装requests库(
pip install requests),用于发送HTTP请求;若需处理JSON数据,可使用内置json库。
二、核心API详解:视频列表与详情获取
B站提供两类获取视频数据的API:一是开放平台官方接口(稳定、合规,需授权),二是Web端非官方接口(无需平台审核,适用于轻量需求,需注意稳定性)。以下分别详解两类接口的调用规范。
2.1 开放平台官方接口
官方接口主要用于获取授权用户的视频数据(如自身账号或第三方授权账号的稿件),需严格遵循签名认证机制,核心包括视频列表查询与单一视频详情查询两个接口。
2.1.1 视频列表查询接口
该接口用于查询授权用户的稿件列表,支持按页码、每页数量、稿件状态筛选。
接口地址:
https://member.bilibili.com/arcopen/fn/archive/viewlist请求方式:GET
认证方式:签名版本2.0(需添加公共请求头)+ Access-Token
请求参数(URL参数):
参数名 | 必传 | 类型 | 说明 | 备注 |
|---|---|---|---|---|
pn | 是 | int | 页码 | 最小为1 |
ps | 是 | int | 每页数量 | 最小1,最大50 |
status | 否 | string | 稿件状态 | 可选值:all(全部)、is_pubing(发布中)、pubed(已发布)、not_pubed(未发布),默认查询全部 |
请求头(核心公共请求头):
请求头字段 | 说明 |
|---|---|
X-Bili-Accesskeyid | 开放平台获取的AccessKeyId |
X-Bili-Signature-Version | 签名版本,固定为2.0 |
X-Bili-Signature-Method | 签名算法,固定为HMAC-SHA256 |
X-Bili-Timestamp | 当前时间戳(秒级) |
X-Bili-Signature-Nonce | 随机字符串(需保证唯一性) |
X-Bili-Content-Md5 | 请求体MD5值(GET请求无请求体时为d41d8cd98f00b204e9800998ecf8427e) |
Authorization | 签名结果(计算方式见2.3节) |
Access-Token | 用户授权凭证 |
响应参数(核心字段):
参数名 | 类型 | 说明 |
|---|---|---|
resource_id | string | 稿件ID(可用于查询视频详情) |
title | string | 视频标题 |
cover | string | 封面图片URL |
video_info.duration | int | 视频时长(秒) |
video_info.share_url | string | 视频播放页链接 |
ctime/ptime | int | 创建时间/发布时间(UTC时间戳) |
2.1.2 视频详情查询接口
该接口用于查询授权用户的单一稿件详情,需传入稿件唯一ID(resource_id)。
接口地址:
https://member.bilibili.com/arcopen/fn/archive/view请求方式:GET
认证方式:与视频列表接口一致(签名2.0+Access-Token)
请求参数(URL参数):
参数名 | 必传 | 类型 | 说明 |
|---|---|---|---|
resource_id | 是 | string | 稿件唯一ID(从视频列表接口获取) |
响应参数与视频列表接口的单条稿件信息一致,额外包含审核状态(addit_info.state)、审核打回理由(addit_info.reject_reason)等详情字段。
2.2 Web端实用接口(非官方)
此类接口无需开放平台审核,可直接调用,适用于获取公开视频数据(如任意UP主的公开视频列表、公开视频详情),但需注意:接口可能随时调整,稳定性不如官方接口,且需遵守B站用户协议,避免高频调用。
2.2.1 公开视频详情接口
通过视频BV号或AV号获取公开视频的详细信息(播放量、弹幕数、UP主信息等)。
接口地址:
https://api.bilibili.com/x/web-interface/wbi/view请求方式:GET
认证方式:Cookie认证(需携带sessdata,用于访问需登录可见的视频)
请求参数(URL参数):
参数名 | 必传 | 类型 | 说明 |
|---|---|---|---|
bvid | 可选(二选一) | string | 视频BV号(如BV1MW421X7gM) |
aid | 可选(二选一) | num | 视频AV号(如123456) |
响应参数丰富,核心字段包括:
基础信息:bvid/aid(视频编号)、title(标题)、pic(封面URL)、duration(总时长);
UP主信息:owner(包含mid、name等);
数据统计:stat(包含play播放量、comment评论数、like点赞数等);
其他信息:desc(视频简介)、pubdate(发布时间戳)、pages(分P列表)。
2.2.2 UP主公开视频列表接口
通过UP主mid(用户ID)获取其公开视频列表。
接口地址:
http://space.bilibili.com/ajax/member/getSubmitVideos请求方式:GET
认证方式:可选Cookie认证(获取需登录可见的视频)
请求参数(URL参数):
参数名 | 必传 | 类型 | 说明 |
|---|---|---|---|
mid | 是 | num | UP主用户ID(从用户主页URL获取) |
pn | 否 | int | 页码,默认1 |
ps | 否 | int | 每页数量,默认10 |
三、关键技术:签名认证实现(官方接口必备)
B站开放平台官方接口采用2.0版本签名机制,核心目的是防止请求参数被篡改,保障接口调用安全。签名计算步骤如下(以Python为例):
3.1 签名计算规则
收集所有请求参数(包括URL参数和公共参数),不包含请求头中的字段;
将参数按Key的ASCII码升序排序;
将排序后的参数拼接为"key1=value1&key2=value2"的字符串;
将拼接后的字符串与AccessKeySecret(开放平台获取)拼接,使用HMAC-SHA256算法计算哈希值,得到签名结果(小写);
将签名结果放入请求头的Authorization字段。
3.2 Python签名实现代码
import hmac import hashlib import time import uuid def calculate_signature(params, access_key_secret): # 1. 按Key升序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 2. 拼接参数字符串 param_str = "&".join([f"{k}={v}" for k, v in sorted_params]) # 3. HMAC-SHA256计算签名 hmac_obj = hmac.new(access_key_secret.encode("utf-8"), param_str.encode("utf-8"), hashlib.sha256) signature = hmac_obj.hexdigest() return signature # 示例:构造请求参数与请求头 access_key_id = "你的AccessKeyId" access_key_secret = "你的AccessKeySecret" params = { "pn": 1, "ps": 10, "status": "all" } # 生成必要的公共参数 timestamp = str(int(time.time())) nonce = str(uuid.uuid4().int) # 随机字符串 content_md5 = "d41d8cd98f00b204e9800998ecf8427e" # GET请求无请求体时固定此值 # 计算签名 signature = calculate_signature(params, access_key_secret) # 构造请求头 headers = { "X-Bili-Accesskeyid": access_key_id, "X-Bili-Signature-Version": "2.0", "X-Bili-Signature-Method": "HMAC-SHA256", "X-Bili-Timestamp": timestamp, "X-Bili-Signature-Nonce": nonce, "X-Bili-Content-Md5": content_md5, "Authorization": signature, "Access-Token": "你的用户授权Token", "Content-Type": "application/json" }
四、实战示例:完整API调用流程
以下提供两类接口的完整Python调用示例,涵盖参数构造、请求发送、响应解析全流程。
4.1 官方接口示例:查询授权用户视频列表
import requests from typing import Dict, Any # 复用3.2节的签名计算函数 def calculate_signature(params, access_key_secret): sorted_params = sorted(params.items(), key=lambda x: x[0]) param_str = "&".join([f"{k}={v}" for k, v in sorted_params]) hmac_obj = hmac.new(access_key_secret.encode("utf-8"), param_str.encode("utf-8"), hashlib.sha256) return hmac_obj.hexdigest() def get_authorized_video_list(access_key_id: str, access_key_secret: str, access_token: str, pn: int = 1, ps: int = 10) -> Dict[str, Any]: url = "https://member.bilibili.com/arcopen/fn/archive/viewlist" # 构造请求参数 params = { "pn": pn, "ps": ps, "status": "all" } # 生成公共参数与签名 timestamp = str(int(time.time())) nonce = str(uuid.uuid4().int) content_md5 = "d41d8cd98f00b204e9800998ecf8427e" signature = calculate_signature(params, access_key_secret) # 构造请求头 headers = { "X-Bili-Accesskeyid": access_key_id, "X-Bili-Signature-Version": "2.0", "X-Bili-Signature-Method": "HMAC-SHA256", "X-Bili-Timestamp": timestamp, "X-Bili-Signature-Nonce": nonce, "X-Bili-Content-Md5": content_md5, "Authorization": signature, "Access-Token": access_token, "Content-Type": "application/json" } # 发送请求 response = requests.get(url, params=params, headers=headers) # 解析响应 if response.status_code == 200: result = response.json() if result.get("code") == 0: return result.get("data", {}) else: print(f"接口调用失败:{result.get('message')}") else: print(f"HTTP请求失败:状态码{response.status_code}") return {} # 调用示例 if __name__ == "__main__": ACCESS_KEY_ID = "你的AccessKeyId" ACCESS_KEY_SECRET = "你的AccessKeySecret" ACCESS_TOKEN = "你的Access-Token" video_list = get_authorized_video_list(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ACCESS_TOKEN, pn=1, ps=10) print("授权用户视频列表:", video_list)
4.2 Web端接口示例:查询公开视频详情
import requests def get_public_video_detail(bvid: str) -> Dict[str, Any]: url = "https://api.bilibili.com/x/web-interface/wbi/view" params = { "bvid": bvid } # 构造请求头(添加Cookie以访问需登录可见的视频) headers = { "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", "Cookie": "SESSDATA=你的SESSDATA值; bili_jct=你的bili_jct值" # 从浏览器开发者工具获取 } response = requests.get(url, params=params, headers=headers) if response.status_code == 200: result = response.json() if result.get("code") == 0: return result.get("data", {}) else: print(f"接口调用失败:{result.get('message')}") else: print(f"HTTP请求失败:状态码{response.status_code}") return {} # 调用示例(查询BV1MW421X7gM的视频详情) if __name__ == "__main__": video_detail = get_public_video_detail("BV1MW421X7gM") print("视频标题:", video_detail.get("title")) print("播放量:", video_detail.get("stat", {}).get("play")) print("UP主:", video_detail.get("owner", {}).get("name"))
五、常见问题与避坑指南
5.1 认证相关错误
错误码401/签名验证失败:检查AccessKeyId、AccessKeySecret是否正确;确认签名计算时参数排序、拼接格式正确;检查timestamp与当前时间是否一致(误差不超过5分钟)。
错误码403/权限不足:确认已申请
ARC_BASE权限;检查Access-Token是否有效(用户授权过期需重新获取)。
5.2 接口调用限制
官方接口:存在QPS限制(具体以开放平台文档为准),高频调用需做好限流处理,避免账号被封禁。
Web端接口:无明确QPS限制,但建议添加请求间隔(如time.sleep(1)),避免触发B站反爬机制;Cookie中的SESSDATA过期后需重新获取。
5.3 数据解析问题
时间戳转换:响应中的ctime、ptime为UTC时间戳,需转换为本地时间(Python可使用datetime模块:
datetime.fromtimestamp(时间戳))。分P视频信息:Web端接口的pages字段包含分P列表,需遍历获取各分P的cid、时长等信息。
5.4 合规性提醒
1. 调用官方接口需严格遵守《哔哩哔哩开放平台开发者服务协议》,不得用于非法用途;
2. Web端非官方接口仅用于个人学习研究,商业用途需通过开放平台申请官方权限;
3. 不得爬取B站非公开数据,不得侵犯用户隐私与知识产权。
六、总结与扩展
本文详细讲解了B站视频列表与详情数据的两类获取方式:官方开放平台接口(稳定合规,适用于商业开发)与Web端非官方接口(轻量便捷,适用于个人学习),涵盖前置准备、接口详情、签名实现、实战示例与避坑指南。开发者可根据自身需求选择合适的接口方案,同时需注重接口调用的合规性与稳定性。
扩展方向:
批量数据获取:结合分页参数实现多页视频列表抓取,添加异常重试机制提升稳定性;
数据可视化:将获取的播放量、点赞数等数据通过Matplotlib、ECharts生成图表;
其他接口探索:B站开放平台还提供视频发布、评论管理等接口,可进一步扩展功能。