从零搭一个抖音竞品监控和社媒监听 Agent(2026):一把 API 密钥
用一把 API 密钥搭抖音竞品监控和社媒监听:盯账号、看热搜榜、搜关键词,再交给模型写简报。公开只读。

抖音开放平台那个申请页,做不了竞品监控。对方不会给你的应用授权。旁边通常是一套现成的飞书告警,或者另一把只出数据、不带模型服务的 MCP 密钥。SandBase 上已有两篇相邻教程,都不是这个双环。
这里的抖音竞品监控 Agent,是同一把 SANDBASE_API_KEY 上的两个环。环 A 盯点名账号。环 B 读热搜榜,再用关键词搜视频,让模型分出品牌。只做公开只读。结构化 JSON、爬虫、官方 OAuth 怎么选,先看 给 AI Agent 选社交数据接口。选完再搭。
先说结论
- 账号用每日快照。热搜和关键词用少量轮询。两个环可以一起跑。两个环都按 15 分钟打,共享的免费额度午饭前就会见底。
- 2026-11-08,抖音数据接口 hub 页眉是 319 of 319。最小集合是主页、第一页作品、热搜榜、关键词搜视频。批量播放统计是另一档价格。
- 编码工具里走 Skill 或 MCP。REST 是
POST /v1/api/<vendor>/<path>,业务数据在outputs[0].data。七月那篇竞品监控是账号环的长代码,这里不再贴一遍。- 这不是抖音官方合作,不能发帖、发私信,也读不到账号主人的后台。你不想自己管轮询时,推送产品或飞书 SaaS 仍然更合适。
SandBase 抖音数据接口页:319 个公开主页、作品、热搜与搜索相关端点。
你在搭的是两个环
环 A 问这些账号从昨天到现在发了什么。环 B 问品牌或品类有没有出现在你没盯着的地方。两边都是只读。输出是 Markdown 简报、webhook,或两样都要。
| 环 A,竞品账号 | 环 B,社媒监听 | |
|---|---|---|
| 问题 | 这些账号变了什么 | 品牌或品类露出来没有 |
| 你要留着的输入 | 一组 sec_user_id | 品牌词、品类词,外加热搜榜 |
| 和免费额度合得来的节奏 | 每天一次 | 一天几次,而不是每 15 分钟 |
| 数据接口 | 主页,再加作品第一页。新视频才考虑播放统计 | 热搜榜,再加关键词搜视频 |
| 模型服务 | 把快照 diff 收成日报 | 把品牌、品类、忽略分开,再决定要不要告警 |
名单本身就是产品时,只跑 A。还没有账号 id、只关心话题时,只跑 B。早报既要「他们发了」也要「榜在动」时,两个一起跑。热搜榜上没有你的词,不代表账号拉取失败。
环 A:竞品账号监控
把每个竞品收成 sec_user_id。拉主页,再拉作品第一页,和昨天的快照做 diff。只对新增视频 id 考虑播放统计,然后把差额交给模型。
带快照的 cron 在 搭建抖音竞品监控 Agent。那是账号环的深代码,这篇不重贴。编码 Agent 里,这两次调用就是 discover、inspect、再小跑一次。安装在 Skill / MCP 指南。
douyin/app-v3/user-post-videos:POST、sec_user_id、单价 $0.001,符合条件的每日前 100 次调用免费(按组织共享)。
环 B:品牌词和热搜监听
douyin/app-v3/hot-search-list 传 {} 就是主榜。可选的 board_type、board_sub_type 换其他榜,参考页要求 board_type 按字符串传。品牌词和品类词走 douyin/search/video-search-v2。先用关键词自己滤,再让模型标品牌、品类或忽略。前两档才告警。
douyin/app-v3/hot-search-list:空 body 默认主热搜榜,单价 $0.001,同样有每日免费额度说明。
douyin/app-v3/brand-hot-search-list 不是这次搜索。2026-11-08 它不需要入参,描述的是品牌热搜分类。分类 id 怎么传给详情,先打开详情页。这篇没有调用详情。
这也不是 微博 + 抖音社媒监听 的抖音一半。那篇配的是微博热搜和 douyin/billboard/hot-account-list,一份创作者名单。热搜榜是话题名单。要正在涨的人,去看榜单教程。要词,用这个环。
douyin/search/general-search-v2 是混合卡片。当天参考页把视频和图文都放在 business_data[],0.01 美元,并写了免费额度。不带版本号的 douyin/search/general-search 返回 HTTP 404。用带版本的 id。
前提和边界
REST 用 SandBase 的 API 密钥。编码 Agent 走 Skill 时,是浏览器登录,密钥不要贴进对话。这一行不是终端命令:
set up https://www.sandbase.ai/SKILL.md2026-11-08 的 SKILL.md 写着:检索目录、看 schema 和价格不扣余额,只有 run 才扣,而且不要默认每个接口都在每日免费额度里。客户端安装留在 Skill 指南。在 AI 工具里使用 是同一个入口。
当天 定价页:符合条件的数据接口,每个组织每天共享 100 次,00:00 UTC 重置。搜目录、读 schema 和价格是 0 美元。失败的模型调用或数据调用不收费。Build 按次付费,没有订阅。代码沙箱当时免费,可能有公平使用上限,改价会事先说。模型服务不占这 100 次。Start 是 0 美元加起步额度,这篇不编这笔额度是多少。首页 是同一个余额。SandBase 不拥有抖音。
| 这个 Agent | 抖音开放平台 | |
|---|---|---|
| 能读谁 | 公开主页、公开作品、公开榜 | 给你的应用授过权的账号 |
| 凭证 | 一把 API 密钥,或 Skill 的浏览器登录 | 审核过的应用,再加上用户 token |
| 动作 | 没有 | 看应用拿到的权限,包括发帖和消息 |
| 什么时候用 | 竞品公开监控、话题监听 | 你自己的账号,或登录了你应用的用户 |
不要为了这个双环,重画社交数据指南里 JSON、爬虫、OAuth 那张表。Hub 上的 Cookie、游客会话、注册设备,以及「打开 App 去发私信」,都不是默认监控路径。
把竞品收成 id
主页 URL 里常常已经有 id。复制以 MS4wLjABAAAA 开头的路径段。不要把昵称、数字 uid 或视频 id 塞进 douyin/app-v3/user-profile。当天的 FAQ 写明,这些是不同的入参。
只有名字时,用 douyin/search/user-search-v2。可选 keyword 和 cursor(第一页 0),0.001 美元,页面上有免费额度那句话。字段表把 data.user_list[].user_id 描述成以 MS4w 开头的长字符串。同一个 nick_name 可以对应很多账号,对上昵称再留 user_id。data.has_more 为真时,用返回的 data.cursor 翻页。这是参考页的规则,这篇没有重跑搜索。更长的说明在 抖音用户搜索。douyin/creator/user-search 返回的是数字风格 user_id 和 short_id,不是 MS4w 字符串,替不了 v2。
douyin/web/sec-user-id 必填 url,0.001 美元,有免费额度那句话。公开样例传的是视频 URL,返回把这条 URL 原样吐了回来。备注写的是:要 sec_user_id 就传主页。douyin/web/all-sec-user-id 批量处理主页(必填 body 数组,同样的价格和额度句)。douyin/web/encrypt-uid-to-sec-user-id 把参考页称为 short_id 的 uid 转过去。路径里看得见的那段优先。短链或路径里没有 id 时,再花一次解析。
在 SandBase 上跑最小双环
目录页展示的是 GET 列表。真正调用走 Model API:
POST https://api.sandbase.ai/v1/api/<vendor>/<path>
请求体只放这个接口自己的参数。完成态的业务数据在 outputs[0].data。status 不是 completed,或者这个字段缺失,这一轮就失败。run id 不是数据。下面的辅助函数是文档里的信封。这篇没有执行它。写作环境里没有 API 密钥,也没有去要。
import os
import requests
def call_api(model: str, params: dict) -> dict:
response = requests.post(
f"https://api.sandbase.ai/v1/api/{model}",
headers={
"Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}",
"Content-Type": "application/json",
},
json=params,
timeout=90,
)
response.raise_for_status()
body = response.json()
outputs = body.get("outputs") or []
if body.get("status") != "completed" or not outputs or outputs[0].get("data") is None:
raise RuntimeError(
f"SandBase call did not complete: {body.get('status')} {body.get('error')}"
)
return outputs[0]["data"]路径 1:Skill 或 MCP
把 Skill 那一行贴进 Claude Code、Cursor 或 Codex,完成浏览器登录,新开一轮会话,等工具加载。然后要一个有边界的周期,而不是一份 200 行的 Agent:
Discover a Douyin user profile tool and a Douyin hot search tool.
Inspect each one and read the price and whether it shares the daily free data allowance.
Do not run anything until I confirm.
Then run one profile for this sec_user_id and one hot-search list with an empty body.
Summarize what changed. Do not invent fields that were not in the output.sandbase_discover 和 sandbase_inspect 不扣费。sandbase_run 才扣。这篇点过名的接口,跑之前也要 inspect 一次。参考页和后来的 inspect 可能不一致。客户端 id、connect、原始 MCP 地址,都在 Skill 指南里。这篇不重复。
路径 2:REST
下面这些 id 在 2026-11-08 是通的。价格是当天参考页 Facts 里的标价。放量之前再打开一次页面。
| 环 | 接口 | 和参考页一致的请求体 | 标价 | 该页有没有免费额度那句话 |
|---|---|---|---|---|
| A | douyin/app-v3/user-profile | 必填 sec_user_id | 0.001 美元 | 有,每个组织每个 UTC 日共享 100 次 |
| A | douyin/app-v3/user-post-videos | 必填 sec_user_id。可选 count(不要超过 20)、max_cursor(第一页 0)、sort_type(0 最新,1 最热) | 0.001 美元 | 有 |
| A,可选 | douyin/app-v3/multi-video-statistics | 必填 aweme_ids,逗号分隔,不超过 50 个 | 0.025 美元 | 没有。FAQ 写的是从余额扣 |
| B | douyin/app-v3/hot-search-list | 主榜传 {}。可选 board_type、board_sub_type | 0.001 美元 | 有 |
| B | douyin/search/video-search-v2 | keyword,cursor(第一页 0)。其他筛选可选 | 0.01 美元 | 有 |
| 解析 id | douyin/search/user-search-v2 | keyword,cursor | 0.001 美元 | 有 |
目录地图在 SandBase 上的抖音公开数据。单个创作者的视频字段在 抖音创作者视频研究。正在涨的账号在 抖音榜单监控。
下面这一轮这篇没有执行。count: 5 是作品参考页的教学示例,不是上限。把 data 原样存下,id 的 diff 自己写。七月那篇已有 2026-10-01 跑通的快照布局。
# 这篇没有执行。对着真实名单跑之前,先 inspect 价格和 free_quota。
profile = call_api("douyin/app-v3/user-profile", {"sec_user_id": sec_user_id})
posts = call_api(
"douyin/app-v3/user-post-videos",
{"sec_user_id": sec_user_id, "max_cursor": 0, "count": 5, "sort_type": 0},
)
hot = call_api("douyin/app-v3/hot-search-list", {})
videos = call_api("douyin/search/video-search-v2", {"keyword": keyword, "cursor": 0})新增 id 才传给 multi-video-statistics,拼成一个逗号分隔的字符串,而且你得接受 0.025 美元、参考页没有免费额度那句话。七月那篇见过作品列表播放数为 0、统计接口补上播放数,那是 2026-10-01 的一个窗口。你对比过两份返回之前,缺失的计数是未知,不是 0。
模型用同一把密钥,基址 https://api.sandbase.ai/v1,模型要先 inspect。它应引用返回里的 id,差额为空就写「无变化」。写得很顺、但没有 id,这一轮算失败。
路径 3:代码沙箱,或你已经在用的时钟
要去重或在对话外追加 JSONL 时,同一把密钥可以开代码沙箱。定价页 写着当时免费。沙箱页 是每次运行一个兼容 E2B 的工作区。SDK 怎么接,在 一把 Key 的技术栈 和 E2B 替代。沙箱不代替抖音调用。
定价 FAQ 说 Agent 建好后可以测试、发布成 API,或设定时。这次打开的 Agents 页 是托管会话,不是这篇点过的 cron 表单。你自己用过那个定时之前,时钟仍按七月那篇:cron 或 GitHub Actions。托管会话和 OpenAI 沙箱的比较在 OpenAI Agents API 兼容路径。
费用怎么估
这是用公开额度做的算术,不是这篇跑出来的账单。100 次免费由组织里所有符合条件的数据接口共享,不是给抖音单独留的。
八个账号每天一次,主页加一页作品,是 16 次。参考页仍在额度里的话,就是 100 次里的 16 次。新增 id 打一包统计,从第一次起 0.025 美元,因为那页没写额度。六次热搜加八次关键词搜索,再占 14 次。额度用完后,每次关键词按标价 0.01 美元,是主页的十倍。这一组大约 30 或 31 次,前提是组织里别的任务很安静。
微博加抖音那篇按 15 分钟轮询,并且写明了。同样节奏打在抖音热搜上,光榜就是 96 次。这是选择,不是共享 100 次上的好默认。关键词也按这个钟打,会先吃掉额度,之后每次 0.01 美元。
模型简报另算,每个周期一次短补全,价格在模型卡上。这篇不报每日 token 美元数。失败不收费。再查 free_quota 的 inspect 仍是 0 美元。
星图和其它 kol-* 路由,这次没有重新核价。七月笔记里「有的不在免费额度里」只是线索,不是现在的报价。加上去之前先 inspect。
SandBase、成品监控,和抖音 MCP
同一份早报,卖的形状不一样。
| 环归谁 | 模型和数据是不是一把密钥 | 你买到的是什么 | |
|---|---|---|---|
| SandBase | 归你。diff、分类和时钟都自己写 | 是。数据、简报、可选的代码沙箱共用一个余额 | 目录加一把密钥。抖音 hub 就是那一层 |
| MediaClaw 抖音监控 | 不归你。你设规则 | 不是这个产品 | 2026-11-08 该页写着:跟踪竞品发布和互动变化,再把 AI 摘要推到 Lark |
| DataXAPI 竞品监控 | 一半。页面写明「什么是新的」仍要你自己算 | 他们的余额,不是 SandBase 的 | 覆盖 17 个平台的 Skill。示例是 2 次调用,最多 0.0040 美元,一个账号一次。失败不收费 |
| TikHub MCP | Agent 仍要你写 | 他们的密钥 | 页面写 990+ 工具、16 个平台。抖音 API 是抖音这一面,包括榜单和星图 |
| Qovia 抖音 MCP | Agent 仍要你写 | 他们的密钥 | 14 个在线端点,含搜索和热搜榜,给 Claude Code、Cursor、VS Code。新账号 50 次试用 |
| Wellbyte | 你订阅变更 | 他们的密钥,页面也提供 MCP | 实时推送到 Kafka、Webhook 或 S3,按成功投递计费。当天首页数字是 38 个平台、895 个端点,抖音 212 |
边界
公开数据,尽力而为。参考页保证的是信封。某一次返回里没有的字段是未知。热搜参考页提醒,有的榜条热度是 0,而且没有名次。没核对过的 0,不要拿去告警。
第一次没有快照,每条视频都像新的。先写下快照,第二次再发简报。成功调用再打一遍要再付费。守各平台条款。不要存 Cookie,也不要把登录设备当成监控器。319 of 319 是 2026-11-08 的页眉,以后会变。
常见问题
怎么搭一个抖音竞品监控 Agent?
用公开只读的抖音数据,加一把厂商密钥。OAuth 打不开一个不会授权你的竞品。解析 sec_user_id,拉主页,拉作品第一页,和昨天 diff,需要时再给新视频打播放统计。在 SandBase 上,这把密钥也是模型服务的密钥。discover 和 inspect 免费。完整 cron 在七月教程,安装在 Skill 指南。2026-11-08,主页和作品是 0.001 美元并写了免费额度。douyin/app-v3/multi-video-statistics 是 0.025 美元,没有那句话。
怎么加上抖音社媒监听,而不只是盯账号?
再加一个不看名单的环。douyin/app-v3/hot-search-list 传 {},品牌词和品类词走 douyin/search/video-search-v2。先过滤,再分类。微博加抖音那篇的抖音源是热账号榜,不是这个话题榜。当天热搜 0.001 美元、视频搜索 0.01 美元,两页都写了免费额度。仍是尽力而为的公开数据,不是官方合作。
什么时候用 SandBase,什么时候用 MediaClaw、TikHub、Qovia 或官方接口?
环留在自己仓库、模型共用一把密钥、而且接受轮询,用 SandBase。要 Lark 摘要,用 MediaClaw。要 DataXAPI 拉账号、差额自己算,用他们的 Skill。仓库已经统一在 TikHub 或 Qovia,就继续。推送比闹钟合适,用 Wellbyte。要发帖、发消息,或读账号主人授权的数据,用抖音开放平台。
接下来
打开 抖音 hub,inspect 一个接口。额度仍符合预期时,再跑一条主页或一次空 body 的热搜。接入方式见 社交数据接口指南,长代码见 七月竞品监控,跨平台见 微博和抖音 Agent,目录见 抖音 hub 文章,安装见 Skill 指南,同一把密钥和代码沙箱见 一把 Key 的技术栈。