数据源与查询
约 959 字大约 3 分钟
2026-03-19
Bilibili 数据源管理与用户查询 — 添加/移除直播间、评论和动态监听,查询用户信息和用户动态。
所有方法通过
self.api.bilibili访问,均为async。
数据源管理
Bilibili 适配器通过"数据源"概念管理监听目标。需要先添加数据源,才能接收对应的事件。
添加直播间监听
await self.api.bilibili.add_live_room(room_id=12345)| 参数 | 类型 | 说明 |
|---|---|---|
room_id | int | 直播间 ID |
添加后,Bot 将接收该直播间的弹幕、礼物、进场等事件。
移除直播间监听
await self.api.bilibili.remove_live_room(room_id=12345)添加评论监听
await self.api.bilibili.add_comment_watch(
resource_id="BV1xx411c7mD",
resource_type="video",
)| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
resource_id | str | — | 资源 ID(BV 号、动态 ID 等) |
resource_type | str | "video" | 资源类型 |
移除评论监听
await self.api.bilibili.remove_comment_watch(resource_id="BV1xx411c7mD")添加动态监听
await self.api.bilibili.add_dynamic_watch(uid=12345678)| 参数 | 类型 | 说明 |
|---|---|---|
uid | int | 用户 UID |
添加后,Bot 将定时轮询该用户动态,检测到新动态或加态被删除时推送事件。
移除动态监听
await self.api.bilibili.remove_dynamic_watch(uid=12345678)动态页监听(多 UP 主合并轮询)
add_dynamic_page_watch 通过 Bilibili 动态主页接口轮询,同时监听多个 UP 主的新动态,每次 API 调用即可检查所有订阅用户,比逐个 add_dynamic_watch 调用次数更少。
添加前会自动关注目标 UP 主(已关注 / 关注自己时跳过),确保动态主页包含该用户。检测到新动态时触发 on_dynamic_new 事件,不检测删除。
# 在 on_load 中批量添加
async def on_load(self):
for uid in (12345678, 87654321):
await self.api.bilibili.add_dynamic_page_watch(uid)
# 移除单个
await self.api.bilibili.remove_dynamic_page_watch(uid=12345678)| 参数 | 类型 | 说明 |
|---|---|---|
uid | int | 用户 UID |
动态页监听和
add_dynamic_watch推送的是同一种事件BiliDynamicEvent,可用相同的on_dynamic_newhandler 处理。
列出所有数据源
sources = await self.api.bilibili.list_sources()
for src in sources:
print(src)返回值:List[Dict[str, Any]] — 所有已注册的数据源列表
用户动态查询
获取用户动态列表
resp = await self.api.bilibili.get_user_dynamics(uid=12345678)
for item in resp.get("items", []):
modules = item.get("modules", {})
author = modules.get("module_author", {})
print(f"{author.get('name')} 发布了 {item.get('type')} 动态")| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
uid | int | — | B 站用户 ID |
offset | str | "" | 分页偏移(上次返回的 offset) |
返回值:dict — 新版动态接口原始数据,包含 items 列表
获取用户最新动态
latest = await self.api.bilibili.get_user_latest_dynamic(uid=12345678)
if latest:
modules = latest.get("modules", {})
author = modules.get("module_author", {})
print(f"最新动态: {latest.get('type')} by {author.get('name')}")| 参数 | 类型 | 说明 |
|---|---|---|
uid | int | B 站用户 ID |
返回值:Optional[dict] — 时间戳最新的一条动态;没有动态时返回 None
用户信息查询
获取用户信息
info = await self.api.bilibili.get_user_info(user_id=67890)| 参数 | 类型 | 说明 |
|---|---|---|
user_id | int | B 站用户 ID |
返回值:dict — 用户信息(昵称、头像、等级等)
视频查询
获取视频信息
info = await self.api.bilibili.get_video_info("BV1wa411Q7N6")
# 或使用 av 号
info = await self.api.bilibili.get_video_info("av258296202")| 参数 | 类型 | 说明 |
|---|---|---|
video_id | str | BV 号或 av 号 |
返回值:VideoInfo — 视频完整信息(标题、UP 主、播放量等),解析失败时返回 None。
if info:
print(f"标题: {info.title}")
print(f"UP主: {info.owner.name}")
print(f"播放量: {info.stat.view}")
print(f"时长: {info.duration_text}")
print(f"链接: {info.url}")解析 B 站视频 ID
parsed = await self.api.bilibili.parse_bili_id("https://b23.tv/abcdef")从任意文本中提取 B 站视频 ID,支持:
- b23.tv 短链(自动重定向解析)
- 完整 URL(
https://www.bilibili.com/video/BVxxx) - 纯 BV 号 / av 号
| 参数 | 类型 | 说明 |
|---|---|---|
text | str | 包含 B 站链接的文本 |
返回值:ParsedBiliId(解析成功)或 None(无匹配)
if parsed:
info = await self.api.bilibili.get_video_info(parsed.video_id)实战示例
class BiliMonitor(NcatBotPlugin):
name = "bili_monitor"
version = "1.0.0"
async def on_enable(self):
# 启动时添加监听
await self.api.bilibili.add_live_room(12345)
await self.api.bilibili.add_comment_watch("BV1xx411c7mD")
await self.api.bilibili.add_dynamic_watch(uid=12345678)
# 查看当前数据源
sources = await self.api.bilibili.list_sources()
print(f"已监听 {len(sources)} 个数据源")
async def on_disable(self):
# 停用时清理
await self.api.bilibili.remove_live_room(12345)
await self.api.bilibili.remove_comment_watch("BV1xx411c7mD")
await self.api.bilibili.remove_dynamic_watch(uid=12345678)返回:Bilibili API 指南 · 上一篇:评论操作
版权所有
版权归属:MI
