Skip to content

抖音热搜 API (V1)

GET
接口健康状态
健康 可用 少量可用 基本不可用 暂无数据
正在加载健康状态…

搜索抖音内容,支持可选的关键词、类别、视频类型、排序、分页、互动量和创作者粉丝数筛选。用于支持趋势发现和活动研究。

请求参数

参数名位置类型必填默认值说明
tokenquerystring-此 API 服务的访问令牌。
keywordquerystring-可选的搜索关键词。
contentTypequerystringALL顶级内容类型。只能选择一种内容类型。


可选值:

- ALL:所有内容类型。

- FASHION:时尚。

- TECHNOLOGY:科技。

- SCIENCE:科学。

- PHOTOGRAPHY:摄影与摄像。

- FOOD:美食。

- MOTHER_BABY:母婴。

- PARENTING:育儿。

- DRAMA:戏剧。

- GAME:游戏。

- AUTOMOTIVE:汽车。

- ANIMAL:动物。

- TRAVEL:旅行。

- DANCE:舞蹈。

- TRADITIONAL_CULTURE:传统文化。

- ART:艺术。

- SPORTS:体育。

- MUSIC:音乐。

- LIFE_RECORD:生活记录。

- HOME_LIVING:家居生活。

- LEISURE_ENTERTAINMENT:休闲娱乐。

- WORKPLACE:职场。

- AGRICULTURE:农业。

- CASUAL:随拍。

- ACG:动漫、漫画与游戏。

- MOVIE:电影。

- TV_SERIES:电视剧。

- VARIETY_SHOW:综艺。

- CELEBRITY:明星。

- HUMANITIES_SOCIAL_SCIENCE:人文社科。

- EDUCATION_CAMPUS:教育校园。

- EMOTION:情感。

- FINANCE:财经。

- PUBLIC_WELFARE:公益。
videoTypequerystringALL视频类型筛选。


可选值:

- ALL:所有视频类型。

- XINGTU_VIDEO:星图商业视频。

- NATURAL_VIDEO:自然视频。
sortTypequerystringCOMPREHENSIVE热门内容结果的排序标准。


可选值:

- COMPREHENSIVE:综合排序。

- HIGH_INTERACTION:最高互动量。

- HIGH_LIKE:最高点赞量。

- HIGH_COMMENT:最高评论量。

- HIGH_SHARE:最高分享量。
pagequeryinteger1页码(从1开始)。每页固定10条。
likeCountMinqueryinteger-最低原始点赞数。
likeCountMaxqueryinteger-最高原始点赞数。
commentCountMinqueryinteger-最低原始评论数。
commentCountMaxqueryinteger-最高原始评论数。
shareCountMinqueryinteger-最低原始分享数。
shareCountMaxqueryinteger-最高原始分享数。
interactionCountMinqueryinteger-最低原始互动数。
interactionCountMaxqueryinteger-最高原始互动数。
followerCountMinqueryinteger-最低原始创作者粉丝数。
followerCountMaxqueryinteger-最高原始创作者粉丝数。

代码示例

💡 环境说明

默认使用 https://api.justoneapi.com;可选 http://47.117.133.51:30015

bash
curl --max-time 120 -X GET 'https://api.justoneapi.com/api/douyin/hot-search/v1?token=YOUR_API_KEY'
text
我想使用 Just One API 提供的“热搜 (V1)”接口。
接入地址: 默认使用 https://api.justoneapi.com;中国大陆用户也可以改用 http://47.117.133.51:30015。
接口路径: /api/douyin/hot-search/v1?token=YOUR_API_KEY
接口地址: BASE_URL + /api/douyin/hot-search/v1?token=YOUR_API_KEY
HTTP 方法: GET
身份验证: 在 URL 中传入 token 查询参数。
OpenAPI 定义: https://docs.justoneapi.com/openapi/douyin-tiktok-china/hot-search-v1-zh.json

请求参数说明:
- token (query): 此 API 服务的访问令牌。 (必填)
- keyword (query): 可选的搜索关键词。
- contentType (query): 顶级内容类型。只能选择一种内容类型。

可选值:
- `ALL`:所有内容类型。
- `FASHION`:时尚。
- `TECHNOLOGY`:科技。
- `SCIENCE`:科学。
- `PHOTOGRAPHY`:摄影与摄像。
- `FOOD`:美食。
- `MOTHER_BABY`:母婴。
- `PARENTING`:育儿。
- `DRAMA`:戏剧。
- `GAME`:游戏。
- `AUTOMOTIVE`:汽车。
- `ANIMAL`:动物。
- `TRAVEL`:旅行。
- `DANCE`:舞蹈。
- `TRADITIONAL_CULTURE`:传统文化。
- `ART`:艺术。
- `SPORTS`:体育。
- `MUSIC`:音乐。
- `LIFE_RECORD`:生活记录。
- `HOME_LIVING`:家居生活。
- `LEISURE_ENTERTAINMENT`:休闲娱乐。
- `WORKPLACE`:职场。
- `AGRICULTURE`:农业。
- `CASUAL`:随拍。
- `ACG`:动漫、漫画与游戏。
- `MOVIE`:电影。
- `TV_SERIES`:电视剧。
- `VARIETY_SHOW`:综艺。
- `CELEBRITY`:明星。
- `HUMANITIES_SOCIAL_SCIENCE`:人文社科。
- `EDUCATION_CAMPUS`:教育校园。
- `EMOTION`:情感。
- `FINANCE`:财经。
- `PUBLIC_WELFARE`:公益。
- videoType (query): 视频类型筛选。

可选值:
- `ALL`:所有视频类型。
- `XINGTU_VIDEO`:星图商业视频。
- `NATURAL_VIDEO`:自然视频。
- sortType (query): 热门内容结果的排序标准。

可选值:
- `COMPREHENSIVE`:综合排序。
- `HIGH_INTERACTION`:最高互动量。
- `HIGH_LIKE`:最高点赞量。
- `HIGH_COMMENT`:最高评论量。
- `HIGH_SHARE`:最高分享量。
- page (query): 页码(从1开始)。每页固定10条。
- likeCountMin (query): 最低原始点赞数。
- likeCountMax (query): 最高原始点赞数。
- commentCountMin (query): 最低原始评论数。
- commentCountMax (query): 最高原始评论数。
- shareCountMin (query): 最低原始分享数。
- shareCountMax (query): 最高原始分享数。
- interactionCountMin (query): 最低原始互动数。
- interactionCountMax (query): 最高原始互动数。
- followerCountMin (query): 最低原始创作者粉丝数。
- followerCountMax (query): 最高原始创作者粉丝数。

返回格式: 请根据实际 Content-Type 安全处理 JSON 或文本响应。

响应处理与错误码:
1. 需通过返回体中的 "code" 字段判断业务结果(code 为 0 表示成功)。
2. 超时建议:建议将请求超时时间设置为 120 秒;如果 120 秒偏长,请至少设置为 60 秒,但可能会有少量请求因超时而未接收到结果。
3. 业务码说明:
   - 0: 成功
   - 100: Token 无效或已失效
   - 301: 采集失败,请重试
   - 302: 超出速率限制
   - 303: 超出每日配额
   - 400: 参数错误
   - 500: 内部服务器错误
   - 600: 权限不足
   - 601: 账户余额不足
   - 602: TOKEN 限额超限
4. code 601 表示账户共享余额不足。code 602 表示当前 API TOKEN 自身的累计消费上限已达到。TOKEN 限额不是资金划拨,多个 TOKEN 仍共享同一个账户余额。

请帮我用我擅长的编程语言写一个脚本来调用这个接口,并处理返回结果。
python
import requests

BASE_URL = "https://api.justoneapi.com"  # 可选服务器: "http://47.117.133.51:30015"

url = BASE_URL + "/api/douyin/hot-search/v1?token=YOUR_API_KEY"
response = requests.get(url, timeout=120)
print(response.status_code)
if response.content:
    content_type = response.headers.get("content-type", "").lower()
    if "json" in content_type:
        try:
            print(response.json())
        except ValueError:
            print(response.text)
    elif content_type.startswith("text/") or "xml" in content_type or content_type.split(";", 1)[0].strip() in {"application/javascript", "application/x-www-form-urlencoded", "application/graphql"}:
        print(response.text)
    else:
        with open("response.bin", "wb") as output:
            output.write(response.content)
        print(f"Saved {len(response.content)} bytes to response.bin")
js
const BASE_URL = "https://api.justoneapi.com"; // 可选服务器: "http://47.117.133.51:30015"
const url = BASE_URL + "/api/douyin/hot-search/v1?token=YOUR_API_KEY";

const response = await fetch(url, {
  method: "GET",
  signal: AbortSignal.timeout(120000)
});
console.log(response.status);
const responseBytes = await response.arrayBuffer();
if (responseBytes.byteLength) {
  const contentType = (response.headers.get("content-type") || "").toLowerCase();
  const mediaType = contentType.split(";", 1)[0].trim();
  const textual = contentType.startsWith("text/") || contentType.includes("json") || contentType.includes("xml") || ["application/javascript", "application/x-www-form-urlencoded", "application/graphql"].includes(mediaType);
  if (textual) {
    const responseText = new TextDecoder().decode(responseBytes);
    let data = responseText;
    if (contentType.includes("json")) {
      try { data = JSON.parse(responseText); } catch { /* Keep the raw body. */ }
    }
    console.log(data);
  } else {
    console.log(`Received ${responseBytes.byteLength} binary bytes`);
  }
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {
    public static void main(String[] args) throws Exception {
        final String BASE_URL = "https://api.justoneapi.com"; // 可选服务器: "http://47.117.133.51:30015"
        final String url = BASE_URL + "/api/douyin/hot-search/v1?token=YOUR_API_KEY";

        HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(120)).build();
        HttpRequest.Builder builder = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .timeout(Duration.ofSeconds(120))
            .method("GET", HttpRequest.BodyPublishers.noBody());

        HttpRequest request = builder.build();

        HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
        System.out.println(response.statusCode());
        String contentType = response.headers().firstValue("content-type").orElse("").toLowerCase();
        String mediaType = contentType.split(";", 2)[0].trim();
        if (contentType.startsWith("text/") || contentType.contains("json") || contentType.contains("xml") || mediaType.equals("application/javascript") || mediaType.equals("application/x-www-form-urlencoded") || mediaType.equals("application/graphql")) {
            System.out.println(new String(response.body(), StandardCharsets.UTF_8));
        } else {
            Files.write(Path.of("response.bin"), response.body());
            System.out.println("Saved " + response.body().length + " bytes to response.bin");
        }
    }
}
go
package main

import (
	"fmt"
	"io"
	"os"
	"strings"
	"net/http"
	"time"
)

const BASE_URL = "https://api.justoneapi.com" // 可选服务器: "http://47.117.133.51:30015"

func main() {
	client := &http.Client{Timeout: 120 * time.Second}
	url := BASE_URL + "/api/douyin/hot-search/v1?token=YOUR_API_KEY"
	req, _ := http.NewRequest("GET", url, nil)
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	fmt.Println(resp.StatusCode)
	bodyBytes, _ := io.ReadAll(resp.Body)
	contentType := strings.ToLower(resp.Header.Get("Content-Type"))
	mediaType := strings.TrimSpace(strings.SplitN(contentType, ";", 2)[0])
	if strings.HasPrefix(contentType, "text/") || strings.Contains(contentType, "json") || strings.Contains(contentType, "xml") || mediaType == "application/javascript" || mediaType == "application/x-www-form-urlencoded" || mediaType == "application/graphql" {
		fmt.Println(string(bodyBytes))
	} else {
		os.WriteFile("response.bin", bodyBytes, 0600)
		fmt.Printf("Saved %d bytes to response.bin\n", len(bodyBytes))
	}
}
php
<?php
$BASE_URL = 'https://api.justoneapi.com'; // 可选服务器: "http://47.117.133.51:30015"
$url = $BASE_URL . '/api/douyin/hot-search/v1?token=YOUR_API_KEY';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$contentType = strtolower((string) curl_getinfo($ch, CURLINFO_CONTENT_TYPE));
curl_close($ch);
echo $status . PHP_EOL;
$mediaType = trim(explode(';', $contentType, 2)[0]);
if (str_starts_with($contentType, 'text/') || str_contains($contentType, 'json') || str_contains($contentType, 'xml') || in_array($mediaType, ['application/javascript', 'application/x-www-form-urlencoded', 'application/graphql'], true)) {
    echo $response;
} else {
    file_put_contents('response.bin', $response);
    echo 'Saved ' . strlen($response) . ' bytes to response.bin' . PHP_EOL;
}

响应示例

正在加载响应示例…