问答

知道 BV 号,怎么拿到播放、投币和弹幕数?

简短回答

用 B站视频详情接口,传 BV 号(或视频链接),加上 view=full。一次调用返回播放、点赞、评论、分享、收藏,ext 里还有投币、弹幕数、aid、cid、时长和分区,每次 $0.002。200 个 BV 号一共 $0.40。

投放结案报告发过来,里面是 200 个 BV 号和对应的播放量。验收之前,你想自己核一遍真实数据,顺便看看投币。在 B 站,投币比点赞更能说明观众是真喜欢。每个 BV 号调一次接口,这些数就全有了。

用哪个接口

B站视频详情传 id(BV 号,比如 BV1xx411c7mD)或者 url(完整的 bilibili.com/video/... 链接),二选一。加上 view=full 后,各项数据在这些字段里:

想要的数 字段
播放 metrics.views
点赞 metrics.likes
投币 ext.coins
收藏 metrics.favorites
分享 metrics.shares
评论 metrics.comments
弹幕数 ext.danmaku
aid(以前的 AV 号) ext.aid
cid(第一个分 P 的) ext.cid
时长(秒) ext.duration_s
分区 ext.section

标题、简介、封面、发布时间、UP 主昵称和 mid 也会一起返回。

费用

规模 调用次数 费用
一个视频 1 $0.002
一份 200 个视频的结案报告 200 $0.40
1,000 个视频 1,000 $2.00

视频已删除或设为私密时返回 not_found,这种调用不收费。

批量查询脚本

把 BV 号一行一个放进 bvids.txt:

import csv, os, requests

URL = "https://api.okdata.online/v1/bilibili/videos/get"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

bvids = [line.strip() for line in open("bvids.txt") if line.strip()]
with open("stats.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["bvid", "播放", "点赞", "投币", "收藏", "弹幕", "抓取时间"])
    for bv in bvids:
        body = requests.get(URL, headers=H, params={"id": bv, "view": "full"}, timeout=60).json()
        if body["code"] != "ok":
            w.writerow([bv, body["code"]])
            continue
        v = body["data"]["item"]
        w.writerow([bv, v["metrics"]["views"], v["metrics"]["likes"], v["ext"]["coins"],
                    v["metrics"]["favorites"], v["ext"]["danmaku"], body["meta"]["fetched_at"]])

几点提醒

  • 拿到的是抓取那一刻的快照。把 meta.fetched_at 一起存下来,热门视频一天之内播放翻倍很常见。
  • 多 P 视频共用一个 BV 号,数据是整个视频的合计,ext.cid 是第一个分 P 的。
  • 完播率、流量来源、观众年龄这些只有 UP 主自己能看,任何公开接口都拿不到。
  • 如果你只是想把 BV 号换成 AV 号,用不着调接口。BV 与 AV 的互转算法是公开的,bilibili-API-collect 里有说明,本地几行代码就能算,不花钱。

别的办法

只有五个视频的话,打开页面抄一下就行。如果是你自己投的单,让 UP 主导出创作中心的数据,比任何公开数据都全。愿意自己维护代码的话,开源库 bilibili-api 也能免费读到这些公开数据。想把一次性的核查变成持续跟踪,可以看竞品监测方案。

更新于