小K导航 API

AI 提示词反推 + 全视频解析 + 语音合成服务 · 支持图片反推、视频文件反推、全平台视频解析、文本转语音。

图片反推 视频反推 全视频解析 语音合成 平均响应 3 秒
登录后使用
计费说明
AI 反推接口
全视频解析 NEW
语音合成 NEW
错误码
示例代码
在线调试

计费说明

本 API 平台采用「点数」作为计费单位,调用接口会消耗对应点数,点数通过充值获得。

计费规则

服务类型消耗点数说明
图片反推1 点 / 次上传图片,AI 生成可用于绘画的提示词,约 3-10 秒返回
视频反推2.8 点 / 秒上传视频文件(MP4/MOV/WEBM),AI 分析画面生成结构化提示词
全视频解析免费免费使用,需展示「小K导航赞助」水印
语音合成1 点 / 次输入文本(1-500 字符),返回 MP3 格式音频,无论文本长短均 1 点
💡 关于"链接反推提示词":该功能已下线。如需对抖音/B站等平台的视频做提示词反推,请先将视频下载到本地,再通过 service=video 上传视频文件调用。
视频/链接反推计费公式
消耗点数=视频时长(秒)×2.8 点/秒
10 秒视频28 点
30 秒视频84 点
60 秒视频168 点
120 秒视频336 点
300 秒视频840 点
600 秒视频1680 点
💡 失败退款:调用失败(网络错误、上游服务异常)点数会自动退回,只对成功的调用扣费。

全视频解析的双模式

免费模式

免费使用

  • 不消耗点数
  • 返回 watermark 对象
  • 需在播放器叠加「小K导航赞助」水印
  • 通过品牌曝光换取免费流量
💡 当前接口状态:目前为免费模式,调用后需配合展示水印。

充值套餐

尝鲜版
10
1000 点
≈ 1000 次图片反推
≈ 357 秒视频反推
≈ 1000 次语音合成
标准版
50
5000 点
🎁 赠送 500 点
合计 5500 点
≈ 1964 秒视频反推
≈ 5500 次语音合成
专业版
100
10000 点
🎁 赠送 2000 点
合计 12000 点
≈ 4286 秒视频反推
≈ 12000 次语音合成
企业版
500
50000 点
🎁 赠送 15000 点
合计 65000 点
≈ 23214 秒视频反推
≈ 65000 次语音合成

立即充值

常见问题

Q:点数会过期吗?
A:不会。充值后的点数永久有效,用完为止。

Q:调用失败会扣点吗?
A:全视频解析失败不扣点;视频反推和语音合成如果失败会自动退回。

Q:视频反推支持传链接吗?
A:不支持。请下载视频后通过上传文件方式调用。

Q:视频时长怎么计算?
A:调用方需在请求中传入 duration(视频时长,秒)。我们的官方演示页面会自动用浏览器读取。

Q:全视频解析支持哪些平台?
A:支持抖音、B站、小红书、快手、微博、西瓜视频、TikTok、YouTube 等主流平台。

Q:语音合成返回的是什么格式?
A:返回 base64 编码的 MP3 数据 URL,可直接用作 <audio src="..."> 播放,或解码后保存为 MP3 文件。

Q:有并发限制吗?
A:单账号默认每分钟 60 次调用上限。如需更高并发,请联系客服升级。

AI 反推接口

提供图片和视频的 AI 提示词反推能力,返回结构化提示词,可直接用于即梦 / Seedance / 可灵 / 豆包 等 AI 视频生成工具。

🔑 鉴权方式:所有接口都需要在 HTTP Header 中携带 X-API-Key,或使用 Authorization: Bearer sk_xxx

图片反推

上传图片,生成可用于 AI 绘画的提示词。

接口地址:https://www.4dj.net/api/v1/prompt.php
请求方式:POST
Content-Type:application/json

请求参数

参数名必填类型示例值 / 说明
service必填string固定值:image
image必填string图片 base64 data URL(data:image/jpeg;base64,...)或 https 图片地址

响应示例

JSON
{
  "code": 0,
  "message": "success",
  "data": {
    "prompt": "一幅写实风格的人物肖像,柔和的光线从左侧射入...",
    "credits_cost": 1,
    "credits_balance": 999
  }
}

视频反推 仅上传文件

上传视频文件,AI 分析画面并生成结构化视频提示词。本接口仅支持上传文件,不支持传链接。

⚠️ 链接反推已下线:请下载视频到本地后,通过 multipart/form-data 上传文件(字段名 video)。
接口地址:https://www.4dj.net/api/v1/prompt.php
请求方式:POST
Content-Type:multipart/form-data
鉴权 HEADER:X-API-Key: sk_xxxxx

请求参数(Form Data)

参数名必填类型示例值 / 说明
service必填string固定值:video
video必填file视频文件,支持 MP4 / MOV / WEBM / M4V / AVI / MKV,最大 500MB
duration必填int视频时长(秒),例如 30 秒的视频传 30
💡 时长如何获取:用浏览器 <video> 元素加载本地文件,读取 video.duration 后取整即可。

返回参数

字段名类型说明
codeint状态码,0 表示成功
data.task_idstring任务 ID,用于轮询查询结果
data.statusstring任务状态,初始为 pending
data.durationint视频时长(秒)
data.filenamestring上传的原始文件名
data.poll_urlstring轮询地址
data.credits_costint本次消耗点数
data.credits_balanceint当前剩余点数
data.billingobject计费明细

响应示例

JSON
{
  "code": 0,
  "message": "success",
  "data": {
    "task_id": "abcd1234-xxxx-xxxx-xxxx-xxxxxxxx",
    "status": "pending",
    "duration": 30,
    "filename": "my_video.mp4",
    "poll_url": "https://www.4dj.net/api/v1/prompt/status.php?task_id=abcd1234",
    "credits_cost": 84,
    "credits_balance": 916,
    "billing": {
      "unit_price": "2.8 点/秒",
      "duration": "30 秒",
      "total": "84 点"
    }
  }
}

查询任务状态

查询视频反推任务的处理状态和结果。

接口地址:https://www.4dj.net/api/v1/prompt/status.php
请求方式:GET

请求参数

参数名必填类型说明
task_id必填string提交任务时返回的 task_id

响应示例

JSON
{
  "code": 0,
  "message": "success",
  "data": {
    "status": "completed",
    "prompt": "一个女性角色,穿着黑色连衣裙..."
  }
}

全视频解析

粘贴抖音、B站、小红书、快手、微博、西瓜视频、TikTok、YouTube 等平台的分享链接,一键获取无水印视频直链。

🎁 免费模式:本接口当前免费使用,返回的数据中包含水印配置,请配合展示「小K导航赞助」水印。
ℹ️ 说明:本接口与上方"视频反推"不同。本接口返回的是视频直链(用于播放/下载),不做 AI 分析。

接口详情

接口地址:https://www.4dj.net/api/v1/video/parse.php
请求方式:POST
Content-Type:application/json

请求参数

参数名必填类型示例值 / 说明
url必填string视频分享链接或直链,例如 https://v.douyin.com/xxxxx/

返回参数

字段名类型说明
codeint状态码,0 表示成功
data.video_urlstring无水印视频直链
data.titlestring视频标题
data.cover_urlstring视频封面图
data.authorstring作者昵称
data.platformstring平台标识
data.is_freebool是否免费模式
data.watermarkobject\|null免费模式返回水印配置
data.credits_costint本次消耗点数
data.credits_balanceint当前剩余点数

响应示例

当前:免费模式

JSON
{
  "code": 0,
  "message": "success",
  "data": {
    "video_url": "https://v11-colds.douyinvod.com/xxx.mp4",
    "title": "视频标题",
    "cover_url": "https://p3-pc-sign.douyinpic.com/xxx.jpg",
    "author": "作者昵称",
    "platform": "douyin",
    "is_free": true,
    "watermark": {
      "text": "小K导航赞助",
      "link": "https://www.4dj.net",
      "logo": "https://www.4dj.net/assets/images/logo.png",
      "position": "top-left",
      "bg": "rgba(74,108,247,0.9)"
    },
    "credits_cost": 0,
    "credits_balance": 0,
    "notice": "本接口免费使用,条件是在播放器上展示「小K导航赞助」水印..."
  }
}

在线演示

点击下方按钮使用示例链接进行解析,演示效果:

点击上方按钮,使用示例链接解析

水印说明(免费模式)

免费模式下,接口返回的数据中包含 watermark 对象。接入方应当使用我们提供的水印组件在播放器上叠加水印。

水印组件接入(仅需 3 行代码)

HTML
<!-- 1. 引入水印组件 -->
<script src="https://www.4dj.net/assets/js/video-watermark.js"></script>

<!-- 2. 视频播放器 -->
<video id="player" controls playsinline></video>

<script>
fetch('https://www.4dj.net/api/v1/video/parse.php', {
    method: 'POST',
    headers: {
        'X-API-Key': 'sk_你的KEY',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ url: 'https://v.douyin.com/xxxxx/' })
})
.then(function(res) { return res.json(); })
.then(function(json) {
    if (json.code !== 0) { alert(json.message); return; }
    var player = document.getElementById('player');
    player.src = json.data.video_url;
    if (json.data.watermark && window.VideoWatermark) {
        VideoWatermark.attachFromResponse(player, json);
    }
});
</script>

水印配置项

字段类型说明
textstring水印文字,默认「小K导航赞助」
linkstring点击水印跳转地址
logostringLogo 图片 URL
positionstring位置:top-left(默认) / top-right / bottom-left / bottom-right
bgstring背景色

语音合成(TTS)

输入文本,返回 MP3 格式的语音数据 URL。支持 5 种中文音色,单次最多 500 字符。

💡 计费方式:每次调用消耗 1 点(约 0.01 元),无论文本长短。

接口详情

接口地址:https://www.4dj.net/api/v1/tts.php
请求方式:POST
Content-Type:application/json
鉴权 HEADER:X-API-Key: sk_xxxxx

请求参数

参数名 必填 类型 说明
text 必填 string 要合成的文本,1-500 字符(中英文均可)
voice_type 可选 string 音色,默认 female_zhubo。可选值见下表

可用音色

👩 女声主播 female_zhubo
新闻播报 / 有声书,清晰自然
👨 男声主播 male_zhubo
广告 / 解说,沉稳有力
🎤 男声说唱 male_rap
短视频 / 潮流,节奏感强
🗣️ 女声四川话 female_sichuan
方言 / 趣味,地方特色
🎙️ 男声低沉 male_db
故事 / 旁白,低沉磁性

响应字段

字段名类型说明
codeint状态码,0 表示成功
data.audio_urlstring音频数据 URL(data:audio/mpeg;base64,xxx),可直接作为 audio src 使用
data.voice_typestring本次使用的音色
data.voice_namestring音色名称
data.text_lengthint文本字数
data.audio_size_bytesint音频大小(字节)
data.audio_size_kbfloat音频大小(KB)
data.credits_costint本次消耗点数
data.credits_balanceint当前剩余点数

响应示例

JSON
{
  "code": 0,
  "message": "success",
  "data": {
    "audio_url": "data:audio/mpeg;base64,SUQzBAAAAAAA...",
    "voice_type": "female_zhubo",
    "voice_name": "女声主播",
    "text_length": 12,
    "audio_size_bytes": 45678,
    "audio_size_kb": 44.6,
    "credits_cost": 10,
    "credits_balance": 990
  }
}

调用示例(cURL)

Shell
curl -X POST "https://www.4dj.net/api/v1/tts.php" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"你好,欢迎使用语音合成","voice_type":"female_zhubo"}'

调用示例(Python)

Python
import requests
import base64

API_KEY = "YOUR_API_KEY"

resp = requests.post(
    "https://www.4dj.net/api/v1/tts.php",
    headers={"X-API-Key": API_KEY, "Content-Type": "application/json"},
    json={"text": "你好,欢迎使用语音合成", "voice_type": "female_zhubo"},
    timeout=60,
)
data = resp.json()

if data["code"] == 0:
    audio_url = data["data"]["audio_url"]   # data:audio/mpeg;base64,xxx
    b64 = audio_url.split(",", 1)[1]
    with open("output.mp3", "wb") as f:
        f.write(base64.b64decode(b64))
    print(f"生成成功,消耗 {data['data']['credits_cost']} 点,剩余 {data['data']['credits_balance']} 点")
else:
    print("错误:", data["message"])

调用示例(JavaScript)

JS
fetch('https://www.4dj.net/api/v1/tts.php', {
    method: 'POST',
    headers: {
        'X-API-Key': 'YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        text: '你好,欢迎使用语音合成',
        voice_type: 'female_zhubo'
    })
})
.then(r => r.json())
.then(data => {
    if (data.code !== 0) {
        alert(data.message);
        return;
    }
    // 直接播放音频
    const audio = new Audio(data.data.audio_url);
    audio.play();
    console.log('剩余点数:', data.data.credits_balance);
})
.catch(err => console.error('失败:', err));
💡 提示:
  • 单次最多 500 字符,中英文均按 1 字符计
  • 返回的 audio_url 是 base64 数据 URL,可直接用于 <audio src="...">
  • 失败会自动退款,成功才扣 1 点
  • 每分钟最多 60 次调用

错误码参照

所有接口统一使用以下状态码。

codeHTTP说明处理建议
0200成功处理返回数据
400400参数错误检查请求体字段
401401API Key 无效检查 API Key 或重新生成
402402点数不足用户中心 充值
405405请求方法错误仅支持 POST
429429请求过于频繁降低请求频率
500500服务端错误稍后重试
502502上游服务异常稍后重试,点数自动退回

示例代码

以下为各语言的完整调用示例,复制后替换 YOUR_API_KEY 即可使用。

cURL

Shell
# 图片反推
curl -X POST "https://www.4dj.net/api/v1/prompt.php" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"service":"image","image":"data:image/jpeg;base64,..."}'

# 视频反推(上传文件,必须传 duration)
curl -X POST "https://www.4dj.net/api/v1/prompt.php" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "service=video" \
  -F "duration=30" \
  -F "video=@/path/to/your_video.mp4"

# 全视频解析
curl -X POST "https://www.4dj.net/api/v1/video/parse.php" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://v.douyin.com/xxxxx/"}'

# 语音合成
curl -X POST "https://www.4dj.net/api/v1/tts.php" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"你好世界","voice_type":"female_zhubo"}'

# 查询任务状态
curl "https://www.4dj.net/api/v1/prompt/status.php?task_id=abcd1234" \
  -H "X-API-Key: YOUR_API_KEY"

Python

Python
import base64
import requests
import time
import subprocess

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://www.4dj.net/api/v1"
HEADERS = {"X-API-Key": API_KEY}


def get_video_duration(video_path):
    result = subprocess.run(
        ['ffprobe', '-v', 'error', '-show_entries', 'format=duration',
         '-of', 'default=noprint_wrappers=1:nokey=1', video_path],
        capture_output=True, text=True, timeout=10
    )
    return int(float(result.stdout.strip()))


def reverse_image(image_path):
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()
    image_data = f"data:image/jpeg;base64,{img_b64}"
    resp = requests.post(
        f"{BASE_URL}/prompt.php",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"service": "image", "image": image_data},
        timeout=60,
    )
    data = resp.json()
    if data["code"] == 0:
        print("提示词:", data["data"]["prompt"])
        print("剩余点数:", data["data"]["credits_balance"])
    else:
        print("错误:", data["message"])


def reverse_video(video_path):
    duration = get_video_duration(video_path)
    if duration <= 0:
        print("无法获取视频时长")
        return
    print(f"视频时长:{duration} 秒,预计消耗 {round(duration * 2.8)} 点")
    with open(video_path, "rb") as f:
        files = {"video": (video_path.split("/")[-1], f, "video/mp4")}
        data = {"service": "video", "duration": duration}
        resp = requests.post(
            f"{BASE_URL}/prompt.php",
            headers=HEADERS, data=data, files=files, timeout=120,
        )
    result = resp.json()
    if result["code"] != 0:
        print("提交失败:", result["message"])
        return
    task_id = result["data"]["task_id"]
    print(f"任务已提交,task_id={task_id}")
    print(f"消耗点数:{result['data']['credits_cost']}")
    for i in range(60):
        time.sleep(5)
        r = requests.get(
            f"{BASE_URL}/prompt/status.php",
            headers=HEADERS, params={"task_id": task_id}, timeout=15,
        )
        res = r.json()
        status = res["data"]["status"]
        print(f"[{i+1}] 状态:{status}")
        if status == "completed":
            print("\n提示词:")
            print(res["data"]["prompt"])
            return
        elif status == "failed":
            print("任务失败:", res["data"].get("message"))
            return


def parse_video(url):
    resp = requests.post(
        f"{BASE_URL}/video/parse.php",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"url": url}, timeout=30,
    )
    data = resp.json()
    if data["code"] != 0:
        print("解析失败:", data["message"])
        return
    d = data["data"]
    print("视频直链:", d["video_url"])
    print("标题:", d["title"])


def tts(text, voice_type="female_zhubo", output="output.mp3"):
    resp = requests.post(
        f"{BASE_URL}/tts.php",
        headers={**HEADERS, "Content-Type": "application/json"},
        json={"text": text, "voice_type": voice_type},
        timeout=60,
    )
    data = resp.json()
    if data["code"] != 0:
        print("语音合成失败:", data["message"])
        return
    audio_url = data["data"]["audio_url"]
    b64 = audio_url.split(",", 1)[1]
    with open(output, "wb") as f:
        f.write(base64.b64decode(b64))
    print(f"音频已保存到 {output},消耗 {data['data']['credits_cost']} 点")


if __name__ == "__main__":
    # reverse_image("test.jpg")
    # reverse_video("my_video.mp4")
    # parse_video("https://v.douyin.com/xxxxx/")
    tts("你好,欢迎使用语音合成", "female_zhubo", "hello.mp3")

JavaScript

JavaScript
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://www.4dj.net/api/v1';

// 语音合成
async function tts(text, voiceType = 'female_zhubo') {
    const resp = await fetch(`${BASE_URL}/tts.php`, {
        method: 'POST',
        headers: {
            'X-API-Key': API_KEY,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ text, voice_type: voiceType })
    });
    const data = await resp.json();
    if (data.code !== 0) {
        alert('失败:' + data.message);
        return;
    }
    const audio = new Audio(data.data.audio_url);
    audio.play();
    console.log('剩余点数:', data.data.credits_balance);
}

// 视频反推
async function reverseVideo(file) {
    const duration = await new Promise((resolve, reject) => {
        const video = document.createElement('video');
        video.preload = 'metadata';
        video.onloadedmetadata = () => {
            resolve(Math.ceil(video.duration));
            URL.revokeObjectURL(video.src);
        };
        video.onerror = () => reject(new Error('无法读取视频时长'));
        video.src = URL.createObjectURL(file);
    });

    console.log(`视频时长:${duration} 秒,预计消耗 ${Math.round(duration * 2.8)} 点`);

    const formData = new FormData();
    formData.append('service', 'video');
    formData.append('video', file);
    formData.append('duration', duration);

    const submitResp = await fetch(`${BASE_URL}/prompt.php`, {
        method: 'POST',
        headers: { 'X-API-Key': API_KEY },
        body: formData,
    });

    const submitData = await submitResp.json();
    if (submitData.code !== 0) {
        alert('提交失败:' + submitData.message);
        return;
    }

    const taskId = submitData.data.task_id;
    console.log('task_id=' + taskId);

    for (let i = 0; i < 60; i++) {
        await new Promise(r => setTimeout(r, 5000));
        const pollResp = await fetch(
            `${BASE_URL}/prompt/status.php?task_id=${taskId}`,
            { headers: { 'X-API-Key': API_KEY } }
        );
        const pollData = await pollResp.json();
        console.log(`[${i + 1}] 状态:${pollData.data.status}`);
        if (pollData.data.status === 'completed') {
            console.log('提示词:', pollData.data.prompt);
            return;
        }
        if (pollData.data.status === 'failed') {
            console.error('任务失败:', pollData.data.message);
            return;
        }
    }
}

在线调试

在下方填入您的 API Key 和请求参数,可以直接在浏览器里测试接口。

准备好了吗?

立即获取 API Key,开始你的 AI 之旅

登录 / 注册