从需求到代码:用B站用户动态API打造个人数据看板

📅 2026/7/25 14:09:16
从需求到代码:用B站用户动态API打造个人数据看板
适用场景在日常开发中经常需要将外部平台的用户动态集成到自己的应用或看板中。例如个人数据面板实时展示关注的 B 站 UP 主最新投稿无需反复打开 App。自动化内容监控当目标用户发布新动态视频/图文时自动推送通知到团队协作工具如钉钉、飞书。数据分析统计某 UP 主一段时间内的动态类型分布、互动数据点赞/评论/转发变化趋势。B 站官方并未直接提供稳定的用户动态公开接口但通过一些第三方封装 API如本文所用的bili-dynamic可以快速、规范地获取所需数据降低自研爬虫的维护维护复杂度。接口能力边界在接入前需要明确该 API 的能力范围请求方式GET请求地址https://v1.apizero.cn/api/bili-dynamic必填参数uidB 站用户 UID纯数字字符串返回格式JSON 数组外层包裹状态码QPS 限制5 次/秒超出将返回频率错误鉴权方式请求头携带X-API-Key密钥需提前获取注意该接口仅返回指定用户的最新动态列表并非全量历史数据。动态数量受接口侧策略限制示例中count字段为 5实际生产中应以文档为准。参数与鉴权参数说明参数名类型必填说明示例值uidstring是B 站用户 UID纯数字不含字母或符号208259鉴权方式目前该 API 要求所有请求在 HTTP 头部添加X-API-Key字段值为调用方拥有的 API Key。示例X-API-Key: your-api-key-here若缺少或 Key 无效服务端将返回4xx状态码。获取 API Key 的方式通常为平台准备后生成具体参考文档页。实战接入curl 请求示例最直接的验证方式是使用curl通过命令行快速查看返回数据。# 请将 $YOUR_API_KEY 替换为真实 Key$UID 替换为目标用户 UID export YOUR_API_KEYyour-api-key export UID208259 curl -sS -X GET \ -H X-API-Key: $YOUR_API_KEY \ https://v1.apizero.cn/api/bili-dynamic?uid$UID | jq .若本地没有jq也可直接去掉| jq .查看原始 JSON。成功时响应以数组形式包裹例如[ { content_type: application/json, description: 成功, example: { code: 0, data: { count: 5, list: [ ... ], uid: 208259 }, msg: 成功 }, status: 200 } ]注意实际返回是一个数组第一个元素为结果对象包含status、description、example字段example内才是业务数据。这与常规单层 JSON 稍有不同后续解析代码需要留意。代码接入Python 实现为了集成到后端服务这里使用 Python 的requests库编写一个简单的客户端。确保已安装requestspip install requests。import requests import json class BiliDynamicAPI: def __init__(self, api_key: str): self.api_key api_key self.base_url https://v1.apizero.cn/api/bili-dynamic self.headers {X-API-Key: api_key} def get_user_dynamics(self, uid: str) - dict: 获取指定 B 站用户的最新动态列表 :param uid: B 站用户 UID纯数字字符串 :return: 解析后的 data 字典如果失败返回 None params {uid: uid} try: resp requests.get(self.base_url, headersself.headers, paramsparams, timeout10) resp.raise_for_status() # 检查 HTTP 状态码 # 解析返回的数组 resp_data resp.json() if not isinstance(resp_data, list) or len(resp_data) 0: print(响应格式异常预期为数组) return None first_item resp_data[0] # first_item 包含 content_type, description, example, status if first_item.get(status) ! 200: print(f接口错误: {first_item.get(description)}) return None example first_item.get(example, {}) if example.get(code) ! 0: print(f业务错误: code{example.get(code)}, msg{example.get(msg)}) return None return example.get(data) except requests.exceptions.RequestException as e: print(f请求异常: {e}) return None except (json.JSONDecodeError, KeyError) as e: print(f解析异常: {e}) return None # 使用示例 if __name__ __main__: API_KEY your-api-key # 替换为真实 Key UID 208259 client BiliDynamicAPI(API_KEY) data client.get_user_dynamics(UID) if data: print(f用户 UID: {data[uid]}, 动态数量: {data[count]}) for item in data[list]: print(f - 动态ID: {item[dynamic_id]}, 类型: {item[type]}, 点赞: {item[stats][likes]})此代码包含了请求校验、解包外层数组、业务码判断等完整逻辑可作为项目模板直接复用。返回值解读成功情况下example对象中的data包含以下字段字段类型说明uidstring请求时的 B 站 UIDcountint返回的动态数量listarray动态对象数组动态对象字段详解每个动态对象list中的元素结构{ dynamic_id: 8xxx, stats: { comments: 100, forwards: 50, likes: 1000 }, text: ..., type: DYNAMIC_TYPE_AV }dynamic_id: 字符串动态唯一标识可用于后续增量更新或去重。type: 动态类型枚举常见值及含义DYNAMIC_TYPE_AV投稿视频DYNAMIC_TYPE_DRAW图文动态DYNAMIC_TYPE_WORD纯文本动态DYNAMIC_TYPE_FORWARD转发含转发文本与原动态text: 动态正文可能为空如纯图片动态。注意内容可能包含表情符号或 HTML 标签需按需清洗。stats: 互动统计对象包含likes点赞数、comments评论数、forwards转发数。注意text字段在部分动态如转发中可能只显示转发语而非完整内容原始动态的内容可能需要进一步通过其它接口获取以文档为准。常见错误与处理HTTP 层面错误HTTP 状态码常见原因处理建议401API Key 无效或缺失检查 Key 是否正确是否已过期403频率超限或 IP 被限制降低请求频率检查 QPS 是否超标404请求路径错误确认 URL 是否正确5xx服务端临时故障等待后重试建议指数退避业务层面错误code ≠ 0code: 非 0 时表示业务处理失败。例如传入非纯数字 UID 可能返回code: -1msg: uid 参数不合法。处理建议: 解析msg字段记录日志并返回用户友好提示。不可直接透传原始错误给终端用户。其他注意点UID 格式必须是纯数字字符串不含空格或字母。从 B 站个人主页 URL 中提取如space.bilibili.com/208259。空结果如果目标用户未发布任何动态count可能为 0list为空数组属于正常情况。数据一致性由于接口是实时拉取可能与官方页面存在短暂延迟分钟级。工程化注意事项1. 限流与并发控制QPS 上限为 5若需要同时监控多个 UID须做请求排队。可以使用 Python 的time.sleep(0.2)间隔 200 毫秒或使用throttle装饰器。2. 缓存策略动态数据更新频繁但每次请求量小建议设置内存缓存如cachetoolsTTL 设为 3060 秒避免重复请求同一 UID。3. 增量更新每次拉取后记录最大或最新的dynamic_id下次请求时可通过比对文本或自行维护时间戳来识别新动态。注意当前接口不支持分页或指定起始时间因此增量只能依赖本地记录对比。4. 异常容错网络抖动、接口临时不可用时应设计重试机制最多 3 次间隔 1 秒并记录失败日志便于排查。5. 数据存储如果需要长期分析将每次拉取的动态数据写入数据库如 SQLite/PostgreSQL保留dynamic_id作为唯一键避免重复插入。参考文档文档页: https://apizero.cn/aidocs/bili-dynamic原始文档: https://apizero.cn/aidocs/bili-dynamic/raw.md