给 AI

操作指南

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>"
}

配置 MCP 服务 →

接上一次,以后直接问 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