返回教程列表
教程2026年10月11日5 分钟阅读

巨量星图 API 教程:达人搜索、受众画像与传播表现

通过 Just One API 按内容关键词搜索巨量星图达人,获取基础资料、受众画像和传播指标。包含星图 ID 关联、统计口径记录与 JSON 导出的 Python 示例。

用内容关键词找到待评估的达人

准备抖音达人合作时,可以先根据内容主题搜索,再结合受众与传播表现判断是否值得进一步沟通。Just One API 的巨量星图接口支持把这几个查询步骤接起来,保存成可复核的达人资料。

本教程用“露营”作为内容关键词,最多读取两页达人搜索结果,为三位达人获取基础资料、受众画像和传播指标。目标是建立一份投放前的分析样本,便于比较候选达人。

注册并在文档中测试

注册 Just One API 后获取 API Token,通过巨量星图达人搜索文档免费测试。一个 Token 可用于多个平台 API,后续按调用量付费;权限和免费测试次数以账户显示为准。

本教程使用四个 GET 接口。先检查响应体业务 code=0;如果返回对象还包含 base_resp,也要检查其中的 status_code。外层请求成功不代表嵌套的平台结果一定成功。

第一步:搜索达人并取出星图 ID

搜索接口路径如下:

text
/api/douyin-xingtu/gw/api/gsearch/search_for_author_square/v1

本例使用 keyword=露营、searchType=CONTENT、sort=FANS 和 page=1。按昵称寻找已知达人时,可改用 searchType=NICKNAME。

当前公开样例的列表位于 data.authors,其中 star_id 用作后续请求的 oAuthorId。它属于星图达人的标识体系,不要直接拿普通抖音接口的 UID 或 secUid 替代。已有星图达人 ID 时,可以跳过搜索。

下一页递增 page,并查看 data.pagination.has_more。示例还会对 ID 去重,遇到空页、没有新增 ID 或达到两页上限就停止。pagination.total_count 是当前搜索返回的结果数量信息,不是完整的抖音创作者总量。

第二步:获取基础资料和受众画像

把选中的星图 ID 传给达人资料 V1,参数名为 oAuthorId。本例明确指定 platform=SHORT_VIDEO,当前公开样例中可查看 id、nick_name、follower 和 sec_uid 等字段。

随后调用受众画像 V1,继续传入相同的 oAuthorId 和 platform,并指定 linkType=CONNECTED。该接口还提供 AWARE、INTERESTED、LIKE 和 FOLLOW 等筛选值。

不同 linkType 对应的受众范围不同。本文返回的 CONNECTED 画像不应统一标注为“粉丝画像”。当前样例的画像在 data.distributions 中,各分组附带说明和分布列表;last_update_time 提供更新时点信息。保存这些说明,能避免只剩数值后忘记其含义。

第三步:用一致口径读取传播指标

传播指标 V1接受独立的统计参数。为便于比较,本例给每位达人传入相同参数:

  • platform=SHORT_VIDEO:短视频。
  • range=DAY_30:最近 30 天,也可按文档选择 DAY_90。
  • type=PERSONAL_VIDEO:个人视频;查询星图视频时,文档中的枚举拼写为 XINTU_VIDEO。
  • onlyAssign=false:不限定为仅已分配的视频。
  • flowType=EXCLUDE:保留本例选定的过滤值,并把它记入分析条件。

DAY_30 是本次传播指标请求的条件,并不意味着前一步受众画像也是同样的 30 天窗口。画像要单独查看它返回的更新时点。flowType 的具体过滤含义应结合当前文档和业务确认,避免自行改写成未经验证的指标定义。

当前公开样例包含 expect_cpe、expect_cpm、interact_rate、play_over_rate、play_stability 等对象。有些值以带单位、百分号或比较描述的文本返回。脚本保留整个对象,不把展示文本直接转成浮点数,也不据此推算真实投放 ROI。

Python 示例:保存达人资料和分析条件

先安装依赖并设置 Token,命令适用于 macOS 或 Linux。将占位符替换成自己的 Token。

bash
python3 -m pip install requests
export JUSTONEAPI_TOKEN='your_token'

保存为 xingtu_sample.py,运行 python3 xingtu_sample.py。最多两次搜索,再为三位达人各查询资料、画像和传播指标,总计不超过 11 次 API 请求。每次调用失败会停止,已经保存的文件不会被删除。

python
import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

BASE_URL = "https://api.justoneapi.com"
TOKEN = os.environ.get("JUSTONEAPI_TOKEN", "")


def call_api(path, **params):
    try:
        response = requests.get(
            BASE_URL + path,
            params={"token": TOKEN, **params},
            timeout=120, allow_redirects=False,
        )
    except requests.RequestException:
        raise RuntimeError("API network error or timeout") from None
    if response.status_code != 200:
        raise RuntimeError(f"API HTTP {response.status_code}")
    try:
        result = response.json()
    except ValueError:
        raise RuntimeError("API response is not JSON") from None
    if not isinstance(result, dict) or result.get("code") != 0:
        code = result.get("code") if isinstance(result, dict) else None
        raise RuntimeError(f"API failed: code={code}; check the docs")
    data = result.get("data")
    if not isinstance(data, dict):
        raise RuntimeError("Unexpected data shape; inspect the docs")
    inner = data.get("base_resp")
    if isinstance(inner, dict) and inner.get("status_code") not in (0, "0"):
        raise RuntimeError("Platform response was unsuccessful")
    return result


def save_json(folder, name, value):
    (folder / name).write_text(
        json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8"
    )


def require_list(data, key):
    value = data.get(key)
    if not isinstance(value, list):
        raise RuntimeError(f"Expected a list at {key}; inspect saved JSON")
    return value


def output_folder(topic):
    if not TOKEN or TOKEN == "your_token":
        raise RuntimeError("Set JUSTONEAPI_TOKEN before running")
    run_id = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
    folder = Path(topic + "-output") / run_id
    folder.mkdir(parents=True, exist_ok=False)
    return folder


MAX_PAGES = 2
MAX_CREATORS = 3
PREFIX = "/api/douyin-xingtu/gw/api"
PLATFORM = "SHORT_VIDEO"


def main():
    folder = output_folder("xingtu")
    ids, seen = [], set()
    for page in range(1, MAX_PAGES + 1):
        result = call_api(
            PREFIX + "/gsearch/search_for_author_square/v1",
            keyword="露营", searchType="CONTENT", page=page, sort="FANS",
        )
        save_json(folder, f"search-{page}.json", result)
        data = result["data"]
        rows = require_list(data, "authors")
        if not rows:
            break
        previous_count = len(ids)
        for row in rows:
            uid = row.get("star_id") if isinstance(row, dict) else None
            if uid and str(uid) not in seen:
                seen.add(str(uid))
                ids.append(str(uid))
        if len(ids) == previous_count:
            break
        pagination = data.get("pagination")
        if not isinstance(pagination, dict):
            raise RuntimeError("Missing pagination; inspect saved JSON")
        if pagination.get("has_more") not in (True, 1, "1"):
            break

    selected = ids[:MAX_CREATORS]
    save_json(folder, "selected-creators.json", selected)
    scope = {
        "platform": PLATFORM, "range": "DAY_30",
        "type": "PERSONAL_VIDEO", "onlyAssign": "false",
        "flowType": "EXCLUDE",
    }
    save_json(folder, "analysis-scope.json", {**scope, "linkType": "CONNECTED"})
    for index, uid in enumerate(selected, start=1):
        profile = call_api(
            PREFIX + "/author/get_author_base_info/v1",
            oAuthorId=uid, platform=PLATFORM,
        )
        save_json(folder, f"creator-{index}-profile.json", profile)
        audience = call_api(
            PREFIX + "/data_sp/author_audience_distribution/v1",
            oAuthorId=uid, platform=PLATFORM, linkType="CONNECTED",
        )
        save_json(folder, f"creator-{index}-audience.json", audience)
        spread = call_api(
            PREFIX + "/data_sp/get_author_spread_info/v1",
            oAuthorId=uid, **scope,
        )
        save_json(folder, f"creator-{index}-spread.json", spread)
    print(f"Saved {len(selected)} creator samples to {folder}")


if __name__ == "__main__":
    try:
        main()
    except RuntimeError as error:
        raise SystemExit(str(error)) from None

如何比较这些结果

输出位于 xingtu-output 的独立时间目录。selected-creators.json 保存候选 ID;analysis-scope.json 保存使用的筛选值;每位达人的资料、画像和传播指标分文件保存,便于独立更新和复核。

比较达人时,先确认平台、视频类型、传播指标时间范围及其他过滤值一致,再查看内容匹配度和受众分布。若要提取一个数值列,需要先识别展示文本的单位和缺失标记,并保留原字段。没有返回指标的达人应标记为数据不足,不能默认指标为零。

常见问题

普通抖音视频接口能代替星图接口吗?

普通抖音接口适合视频内容、详情和评论等场景,星图接口提供达人营销相关数据。需要普通视频数据时,可阅读抖音视频采集教程。两类数据可以结合,但需要先确认 ID 关联方式与字段口径。

受众画像和传播指标可以一次取全吗?

本文是多个独立请求组成的流程。先选出候选达人,再按需要查询画像和传播指标,可以减少不必要的调用。不同接口的数据更新时点也可能不同,应随响应保留。

如何处理接口失败和暂时缺少指标?

业务失败应单独记录,成功响应中的空字段则保留为缺失。示例不自动重试。正式任务可以参考重试与并发策略,为瞬时故障设置有限次数重试,不要对参数或权限问题反复发请求。

从星图达人搜索测试一个与你业务相关的内容关键词,再为候选达人补充画像和传播数据。

继续使用 Just One API

登录 Dashboard 获取 Token,查看完整 API 文档,或打开 MCP GitHub 项目了解最新配置。