给 AI

操作指南

B站 API Python 教程:搜索、视频数据、评论和热门榜(2026)

四个接口:B站视频搜索、按 BV 号取视频详情、视频评论和热门榜,每个都是带 API key 的普通 GET 请求,不用 wbi 签名,也不用 buvid3 Cookie。下面的示例一共 7 次调用,花费 $0.014;失败的调用不扣费。

更新于

用 Python 拿 B站数据,大多数代码是直接调 B站网页自己的接口,能用,直到某天不能用。搜索要 wbi 签名,还要新鲜的 buvid3 Cookie,密钥会轮换,跑了几周的脚本某天开始只返回 -412。这类代码大多参考的两个社区项目,bilibili-API-collect 文档和 bilibili-api 这个 Python 库,在 GitHub 上都已经归档、不再维护,下一次接口变动不会再有人从那边修。如果你已经撞上 -412,可以先看B站搜索接口一直返回 -412 怎么办。

这篇用 API key 做同样几件事:搜视频、按 BV 号读一条视频的数据、翻评论、读热门榜。每次调用就是一个 HTTPS GET,没有签名代码、Cookie 或登录态要维护,依赖只有 requests。最后得到一个视频数据 CSV 和一个评论 CSV。

分步操作

先设好 key:export OKDATA_API_KEY=okd_...。每次返回都有 code(成功为 "ok");列表结果在 data.items,翻页信息在 page;单个对象在 data.item。

先说 ID:B站每条视频都有 BV 号,就是链接里 BV1 开头那段,比如 https://www.bilibili.com/video/BV1Gc411K7wD。下面四个接口用的 id 都是它。老的数字 AV 号还在,返回在 ext.aid 里。各项数据分别在哪个字段,见按 BV 号查播放、投币和弹幕数。

第一步:搜视频

B站视频搜索有 query 和 sort 两个参数,sort 可选 relevance(默认,综合)、latest(最新)或 most_viewed(最多播放)。一次调用返回约 20 条视频,每次 $0.002。每条有 id(BV 号)、title、简介 text、published_at、author 下的 UP 主昵称和数字 ID(mid)、hashtags 里的标签,以及 metrics.views、metrics.likes、metrics.comments 和 metrics.favorites。加上 view=full 还有 ext.danmaku、ext.duration 和 ext.section。

curl -G "https://api.okdata.online/v1/bilibili/videos/search" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'query=相机推荐' --data-urlencode 'sort=most_viewed' --data-urlencode 'view=full'

第二步:读一条视频的完整数据

B站视频详情的 id 填 BV 号,或者用 url 传完整链接,每次 $0.002。详情补上了搜索里没有的东西:metrics.shares,以及 view=full 时的 ext.coins、ext.danmaku、ext.aid、ext.cid、ext.duration_s 和 ext.section。投币值得单独一列:观众得花币才能投,比点赞更能说明大家对这条视频的认可。

curl -G "https://api.okdata.online/v1/bilibili/videos/get" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=BV1Gc411K7wD' --data-urlencode 'view=full'

第三步:翻评论

B站视频评论的 id 填 BV 号,sort 可选 hot(默认,最热)或 latest(最新)。每页约 20 条,每次 $0.002,每条有 text、author.name、author.id(评论者的 mid)、likes、replies、published_at 和 ip_location(IP 属地,已去掉前缀)。下一页就把 page.next_cursor 作为 cursor 传回去。

curl -G "https://api.okdata.online/v1/bilibili/videos/comments/list" -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'id=BV1Gc411K7wD' --data-urlencode 'sort=hot'

第四步:读热门榜

B站热门榜没有参数,返回当前的综合热门,每次约 50 行,每次 $0.002。每行有 rank、name(视频标题)、heat(播放量)和 url(视频链接,末尾就是 BV 号)。想看更多屏,热门榜也可以用 cursor 翻页。

curl -G "https://api.okdata.online/v1/bilibili/trends/list" -H "Authorization: Bearer $OKDATA_API_KEY"

第五步:完整脚本

辅助函数检查 body["code"],跳过已删除的视频,遇到限流或上游繁忙就用同一个 Idempotency-Key 重试,重试不会重复扣费。翻页用一个带页数上限的生成器。

import csv
import os
import time
import uuid

import requests

API = "https://api.okdata.online"
KEY = os.environ["OKDATA_API_KEY"]
QUERY = "相机推荐"
TOP_VIDEOS = 2      # 查几条视频详情
COMMENT_PAGES = 3   # 第一条视频读几页评论;每页一次调用


def call(path, **params):
    headers = {"Authorization": f"Bearer {KEY}", "Idempotency-Key": str(uuid.uuid4())}
    for attempt in range(4):
        body = requests.get(API + path, headers=headers, params=params, timeout=60).json()
        if body["code"] == "ok":
            return body
        if body["code"] == "not_found":
            return None  # 已删除或不公开:不扣费
        if body.get("retry") in ("yes", "same_key"):
            time.sleep(body.get("retry_after_seconds") or 2 ** attempt)
            continue
        raise RuntimeError(f"{body['code']}: {body['message']} (request {body['request_id']})")
    raise RuntimeError(f"{path}: 重试 4 次仍然失败")


def paged(path, max_pages, **params):
    cursor = None
    for _ in range(max_pages):
        body = call(path, **params, **({"cursor": cursor} if cursor else {}))
        if body is None:
            return
        yield from body["data"]["items"]
        if not body["page"]["has_more"]:
            return
        cursor = body["page"]["next_cursor"]


board = call("/v1/bilibili/trends/list")["data"]["items"]
for row in board[:5]:
    print(row["rank"], row["heat"], row["name"], row["url"])

hits = call("/v1/bilibili/videos/search", query=QUERY, sort="most_viewed")["data"]["items"]
videos = []
for hit in hits[:TOP_VIDEOS]:
    body = call("/v1/bilibili/videos/get", id=hit["id"], view="full")
    if body:
        videos.append(body["data"]["item"])

with open("bilibili_videos.csv", "w", newline="", encoding="utf-8-sig") as f:
    out = csv.writer(f)
    out.writerow(["bvid", "title", "uploader", "views", "likes", "coins", "favorites", "shares", "danmaku", "published_at"])
    for v in videos:
        m, ext = v["metrics"], v["ext"]
        out.writerow([v["id"], v["title"], v["author"]["name"], m["views"], m["likes"], ext.get("coins"),
                      m["favorites"], m["shares"], ext.get("danmaku"), v["published_at"]])

if videos:
    first = videos[0]["id"]
    with open("bilibili_comments.csv", "w", newline="", encoding="utf-8-sig") as f:
        out = csv.writer(f)
        out.writerow(["bvid", "comment_id", "text", "user", "likes", "replies", "ip_location", "published_at"])
        for c in paged("/v1/bilibili/videos/comments/list", COMMENT_PAGES, id=first, sort="hot"):
            out.writerow([first, c["id"], c["text"], c["author"]["name"], c["likes"], c["replies"], c["ip_location"], c["published_at"]])

跑一遍就是上面的示例,7 次调用。如果要长期跟踪,花费主要在详情调用上:每天早上刷新 500 个 BV 号、连续一个月,是 15,000 次调用,$30.00。

注意事项

  • 搜索深度。 B站自己的搜索翻到一定页数就不再给结果,这个接口也一样。话题比较宽的话,拆成几个更具体的关键词分别搜。
  • null 字段。 搜索结果没有分享数(搜索里 metrics.shares 是 null,详情里有)。作品里 UP 主的粉丝数是 null,目录里目前也还没有 B站账号接口。每个 null 字段都在 meta.unavailable 里注明。
  • 评论和回复。 能拿到每条评论的回复数,拿不到回复正文。弹幕内容也拿不到,只有弹幕数。
  • 多 P 视频。 所有分 P 共用一个 BV 号,数据是整条视频的,ext.cid 是第一 P 的。
  • 数据是快照。 数字是调用那一刻读到的,跟踪增长时把 meta.fetched_at 一起存下来。
  • 不收钱的情况。 已删除的视频返回 not_found,和限流等其他错误一样不扣费。

不写代码只想看榜,打开 B站热门榜工具就行。要跨平台研究一个话题,可以看内容调研,里面讲了搜索、详情和评论怎么配合。

示例花费

按播放量搜一次“相机推荐”,取前 2 条视频的完整数据,读第一条下 3 页热门评论,再读一次热门榜

接口调用次数单价小计
B站视频搜索1$0.002$0.002
B站视频详情2$0.002$0.004
B站视频评论3$0.002$0.006
B站热搜榜1$0.002$0.002
合计7$0.014

按本页生成时的价格计算。失败的调用不扣费。

在你的 AI 里用(MCP)

先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。

可以这样说在 B站按播放量搜“相机推荐”,给我前 2 条视频的播放、点赞、投币、收藏、分享和弹幕数,再看第一条下面的热门评论。顺便看看现在热门榜上有什么。

智能体第一次调用 call 工具时发送的内容
{
  "endpoint": "bilibili.videos.search",
  "params": {
    "query": "Claude Code 教程"
  },
  "idempotency_key": "<新的 UUID>"
}

配置 MCP 服务 →

资料来源

  1. bilibili-API-collect 仓库(GitHub,已归档)github.com · 读取于
  2. bilibili-api Python 库仓库(GitHub,已归档)github.com · 读取于

接上一次,以后直接问 AI。

新 key 自带 $0.10 试用额度。贴一句话,就能接进你的智能体。

免费开始
一句话接进你的 AI

把这句话发给你的智能体

读一下 https://okdata.online/zh/agents.md,帮我把 okdata 配好;我的 key 在环境变量 OKDATA_API_KEY 里。

Claude Code、Cursor、Codex 等能打开网址的智能体,读完会自己配好。

MCP 地址https://api.okdata.online/mcp