问答
B站有新视频提到我们产品时,怎么及时知道?
简短回答
每隔一两个小时用 B站视频搜索按 sort=latest 搜一次,记下已经见过的 BV 号,只把新出现的推给自己。每次检查是一次调用,$0.002,覆盖最新的约 20 个视频。一个关键词每两小时查一次,一个月 $0.72。
你们做笔记软件,一位中腰部 UP 主刚发了测评,说同步功能有问题。你希望当天下午就知道,趁评论区风向还没定,官方回复一句可能就把口碑扳回来。做法很简单:一个小任务每两小时按最新排序搜一次产品名,有新视频就通知你。
思路
B站视频搜索加上 sort=latest,返回匹配关键词的最新视频,每页约 20 个。本地存一份见过的 BV 号,每次跑的时候,不在名单里的就是新视频,推到群里或邮箱,然后加进名单。第一页全是新的,就再翻一页;有见过的就停。
提醒一来,用 B站视频评论看看观众在说什么,每页 $0.002。
一个月花多少
| 配置 | 每月调用 | 费用 |
|---|---|---|
| 1 个关键词,每 2 小时一次 | 360 | $0.72 |
| 3 个关键词,每小时一次 | 2,160 | $4.32 |
| 3 个关键词每小时一次,再看 30 个新视频的第一页评论 | 2,160 + 30 | {{cost:bilibili.videos.search2160+bilibili.videos.comments.list30}} |
监控脚本
import json, os, pathlib, requests
URL = "https://api.okdata.online/v1/bilibili/videos/search"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
KEYWORDS = ["你的产品名", "产品名 测评"]
SEEN = pathlib.Path("seen.json")
seen = set(json.loads(SEEN.read_text())) if SEEN.exists() else set()
new = []
for kw in KEYWORDS:
cursor = None
for _ in range(3): # 每个关键词每次最多翻 3 页
params = {"query": kw, "sort": "latest", **({"cursor": cursor} if cursor else {})}
body = requests.get(URL, headers=H, params=params, timeout=60).json()
if body["code"] != "ok":
print(kw, body["code"])
break
fresh = [v for v in body["data"]["items"] if v["id"] not in seen]
new += fresh
seen.update(v["id"] for v in fresh)
if len(fresh) < len(body["data"]["items"]) or not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
for v in new:
print(f"{v['author']['name']}:{v['title']}(播放 {v['metrics']['views']}){v['url']}")
SEEN.write_text(json.dumps(sorted(seen)))
把 print 换成飞书机器人或企业微信的 webhook 就能推到群里。第一次运行时所有结果都算新的,建议先不发提醒跑一遍,把 seen.json 填满。
要注意的地方
- 新视频进 B 站搜索有延迟,所以提醒会比上传晚几分钟到几小时,做不到秒级。
- 搜索匹配的是标题、标签和简介。UP 主只在视频里口播了你的名字,搜不到。
- 产品名太短或太常见,噪音会很多。加一个限定词,或者推送前先过滤一遍标题。
- 只能搜到公开视频。
别的办法
只盯一个关键词的话,在 B 站存一个按最新排序的搜索,每天早上点开看看,完全免费。开源的 RSSHub 有 B 站搜索的路由,自己部署后接进任何 RSS 阅读器也行。想把 B 站、微博、抖音上的提及放在一处看,参考口碑监测方案。
更新于