TikTok API Python 教程:导出视频评论做情感分析(2026)
两个接口:先用 TikTok 视频搜索挑视频,再对每条视频逐页调 TikTok 视频评论。下面的示例一共 11 次调用,花费 $0.022;失败的调用不扣费。
更新于
要做的事:想知道 TikTok 上的人怎么看一个产品或话题,依据是大家写了什么,而不是播放量。这就需要从讨论最集中的那几条视频下面拿几百条真实评论,存成情感模型或大模型能直接读的文件。TikTok 自己的 Research API 里有评论,但只开放给经 TikTok 审核通过的研究者,企业怎么办见TikTok Research API 只给学术用,企业用什么。这里每次调用就是一个带 API key 的 HTTPS GET,不需要 TikTok 账号,也不用登录,依赖只有 requests。
最后得到 tiktok_comments.csv:每条评论一行,带所属视频、视频语言、评论内容、点赞、回复数和时间,已去重,空内容已剔除。
分步操作
先设好 key:export OKDATA_API_KEY=okd_...。每次返回都有 code(成功为 "ok");列表结果在 data.items,page 里带着下一页的 cursor。
第一步:找到讨论多的视频
TikTok 视频搜索有 query 和 sort 两个参数,sort 可选 relevance(默认)、most_liked 或 latest。TikTok 的搜索以相关性为主,latest 并不是严格按时间排,在意日期的话自己按 published_at 过滤。一次调用返回约 30 条视频,每次 $0.002,每条有 id、文案 text、lang、published_at、author.username,以及 metrics.views、metrics.likes、metrics.comments 和 metrics.shares。按 metrics.comments 挑视频:400 万播放、80 条评论的视频,对这件事没什么用。
curl -G "https://api.okdata.online/v1/tiktok/videos/search" -H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'query=air fryer' --data-urlencode 'sort=most_liked' \
--data-urlencode 'fields=id,text,lang,author.username,metrics.comments,published_at'
第二步:逐页拉评论
TikTok 视频评论的 id 填视频的数字 ID(比如 7429815063927400734)。一次调用返回约 50 条一级评论,每次 $0.002,每条有 id、text、likes、replies(回复数)、published_at、author.username,TikTok 显示了地区的话还有 ip_location。下一页就把 page.next_cursor 原样作为 cursor 传回去;page.has_more 为 false 时停下。
curl -G "https://api.okdata.online/v1/tiktok/videos/comments/list" -H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=7429815063927400734'
第三步:完整脚本
脚本搜索一次,留下评论最多的 VIDEOS 条视频,每条最多读 PAGES_PER_VIDEO 页,清洗文本后写进 CSV。每条视频读同样的页数,可以避免一条爆款把其他视频的声音盖过去。辅助函数遇到限流或上游繁忙就用同一个 Idempotency-Key 重试,重试不会重复扣费;搜索之后被删掉的视频直接跳过。
import csv
import os
import re
import time
import uuid
import requests
API = "https://api.okdata.online"
KEY = os.environ["OKDATA_API_KEY"]
QUERY = "air fryer"
VIDEOS = 5 # 读几条视频
PAGES_PER_VIDEO = 2 # 每条视频读几页评论;每页一次调用
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 comments(video_id, max_pages):
cursor = None
for _ in range(max_pages):
body = call("/v1/tiktok/videos/comments/list", id=video_id, **({"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"]
def clean(text):
return re.sub(r"\s+", " ", text or "").strip()
videos = call("/v1/tiktok/videos/search", query=QUERY, sort="most_liked")["data"]["items"]
videos = sorted(videos, key=lambda v: v["metrics"]["comments"] or 0, reverse=True)[:VIDEOS]
seen = set()
with open("tiktok_comments.csv", "w", newline="", encoding="utf-8-sig") as f:
out = csv.writer(f)
out.writerow(["video_id", "video_lang", "video_caption", "comment_id", "text", "likes", "replies", "published_at", "author"])
for v in videos:
for c in comments(v["id"], PAGES_PER_VIDEO):
text = clean(c["text"])
if not text or c["id"] in seen:
continue
seen.add(c["id"])
out.writerow([v["id"], v["lang"], clean(v["text"])[:120], c["id"], text,
c["likes"], c["replies"], c["published_at"], c["author"]["username"]])
print(f"{len(seen)} 条评论,来自 {len(videos)} 条视频")
跑一遍就是上面的示例:1 次搜索加 10 页评论,约 500 条。想要更大的样本,20 条视频各读 4 页是 80 次评论调用,搜索之外再花 $0.16。
第四步:打分
CSV 已经可以交给任何打分工具。下面三个习惯能让结果更可信:
- 按点赞加权。 一条有 900 个赞的抱怨,代表的人比一条零赞的多。分数旁边保留
likes,报告时同时给出“评论数占比”和“点赞数占比”。 - 处理语言。 评论本身没有语言字段。
video_lang可以作为整串评论的参考;多语言混杂的评论区,需要多语种模型或者先做语言检测。 - 人工抽查。 反讽和网络用语哪个模型都会看错。每个标签先读 30 条,再决定信不信这个比例。
用大模型的话,每批 50 到 100 条评论、把视频文案作为上下文,效果不错:让它给每条评论打标签,再总结出最常见的三个好评点和三个槽点。这一段流程见用 TikTok 评论做情感分析。
注意事项
- 只有一级评论。 每条评论带回复数,不带回复正文,所以导出的行数会比视频的
metrics.comments少,后者把回复也算进去了。 - 顺序。 评论按 TikTok 自己的顺序返回,没有排序参数。每条视频读两页,是 TikTok 排在前面的那部分,不是随机样本。
- 地区。
ip_location只在 TikTok 显示了地区时才有值,当作可选字段处理。 - 精简返回。
fields=id,text,likes,replies,published_at能让返回更短,适合直接交给模型读。价格不变。 - 不收钱的情况。 搜索之后被删掉的视频返回
not_found,不扣费,限流和其他错误也一样。24 小时内同样的请求配同样的Idempotency-Key,会拿回存下的结果,meta.replayed为true,不再扣费。
只导出一条视频的评论到 Excel 的话,把 TikTok 评论导出成 CSV更简单。
示例花费
搜一次 air fryer(空气炸锅),取评论最多的 5 条视频,各读 2 页评论(约 100 条)
| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| TikTok 视频搜索 | 1 | $0.002 | $0.002 |
| TikTok 视频评论 | 10 | $0.002 | $0.02 |
| 合计 | 11 | $0.022 |
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说在 TikTok 搜 air fryer,取评论最多的 5 条视频,每条拿 100 条左右评论,告诉我大家喜欢什么、抱怨什么,再给个大致的正负面比例。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "tiktok.videos.search",
"params": {
"query": "ai agents"
},
"idempotency_key": "<新的 UUID>"
}