小K导航 API
AI 提示词反推 + 全视频解析服务 · 支持图片反推、视频文件反推、全平台视频直链解析。
计费说明
本 API 平台采用「点数」作为计费单位,调用接口会消耗对应点数,点数通过充值获得。
计费规则
| 服务类型 | 消耗点数 | 说明 |
|---|---|---|
| 图片反推 | 1 点 / 次 | 上传图片,AI 生成可用于绘画的提示词,约 3-10 秒返回 |
| 视频反推 | 2.8 点 / 秒 | 上传视频文件(MP4/MOV/WEBM),AI 分析画面生成结构化提示词 |
| 全视频解析 | 免费 | 免费使用,需展示「小K导航赞助」水印 |
service=video 上传视频文件调用。
全视频解析的双模式
免费使用
- 不消耗点数
- 返回
watermark对象 - 需在播放器叠加「小K导航赞助」水印
- 通过品牌曝光换取免费流量
付费使用
- 按次扣点(0 点 / 次)
- 返回
watermark = null - 无任何水印,直出视频链接
- 适合商业项目、付费应用
充值套餐
≈ 357 秒视频反推
≈ 1964 秒视频反推
≈ 4286 秒视频反推
≈ 23214 秒视频反推
常见问题
Q:点数会过期吗?
A:不会。充值后的点数永久有效,用完为止。
Q:调用失败会扣点吗?
A:全视频解析失败不扣点;视频反推如果提交失败会自动退回。
Q:视频反推支持传链接吗?
A:不支持。请下载视频后通过上传文件方式调用。
Q:视频时长怎么计算?
A:调用方需在请求中传入 duration(视频时长,秒)。我们的官方演示页面会自动用浏览器读取。
Q:全视频解析支持哪些平台?
A:支持抖音、B站、小红书、快手、微博、西瓜视频、TikTok、YouTube 等主流平台。
Q:有并发限制吗?
A:单账号默认每分钟 60 次调用上限。如需更高并发,请联系客服升级。
AI 反推接口
提供图片和视频的 AI 提示词反推能力,返回结构化提示词,可直接用于即梦 / Seedance / 可灵 / 豆包 等 AI 视频生成工具。
X-API-Key,或使用 Authorization: Bearer sk_xxx。
图片反推
上传图片,生成可用于 AI 绘画的提示词。
请求参数
| 参数名 | 必填 | 类型 | 示例值 / 说明 |
|---|---|---|---|
service | 必填 | string | 固定值:image |
image | 必填 | string | 图片 base64 data URL(data:image/jpeg;base64,...)或 https 图片地址 |
响应示例
{
"code": 0,
"message": "success",
"data": {
"prompt": "一幅写实风格的人物肖像,柔和的光线从左侧射入...",
"credits_cost": 1,
"credits_balance": 999
}
}
视频反推 仅上传文件
上传视频文件,AI 分析画面并生成结构化视频提示词。本接口仅支持上传文件,不支持传链接。
multipart/form-data 上传文件(字段名 video)。
请求参数(Form Data)
| 参数名 | 必填 | 类型 | 示例值 / 说明 |
|---|---|---|---|
service | 必填 | string | 固定值:video |
video | 必填 | file | 视频文件,支持 MP4 / MOV / WEBM / M4V / AVI / MKV,最大 500MB |
duration | 必填 | int | 视频时长(秒),例如 30 秒的视频传 30 |
<video> 元素加载本地文件,读取 video.duration 后取整即可。
返回参数
| 字段名 | 类型 | 说明 |
|---|---|---|
code | int | 状态码,0 表示成功 |
data.task_id | string | 任务 ID,用于轮询查询结果 |
data.status | string | 任务状态,初始为 pending |
data.duration | int | 视频时长(秒) |
data.filename | string | 上传的原始文件名 |
data.poll_url | string | 轮询地址 |
data.credits_cost | int | 本次消耗点数 |
data.credits_balance | int | 当前剩余点数 |
data.billing | object | 计费明细 |
响应示例
{
"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 点"
}
}
}
查询任务状态
查询视频反推任务的处理状态和结果。
请求参数
| 参数名 | 必填 | 类型 | 说明 |
|---|---|---|---|
task_id | 必填 | string | 提交任务时返回的 task_id |
响应示例
{
"code": 0,
"message": "success",
"data": {
"status": "completed",
"prompt": "一个女性角色,穿着黑色连衣裙..."
}
}
全视频解析
粘贴抖音、B站、小红书、快手、微博、西瓜视频、TikTok、YouTube 等平台的分享链接,一键获取无水印视频直链。
接口详情
请求参数
| 参数名 | 必填 | 类型 | 示例值 / 说明 |
|---|---|---|---|
url | 必填 | string | 视频分享链接或直链,例如 https://v.douyin.com/xxxxx/ |
返回参数
| 字段名 | 类型 | 说明 |
|---|---|---|
code | int | 状态码,0 表示成功 |
data.video_url | string | 无水印视频直链 |
data.title | string | 视频标题 |
data.cover_url | string | 视频封面图 |
data.author | string | 作者昵称 |
data.platform | string | 平台标识 |
data.is_free | bool | 是否免费模式 |
data.watermark | object\|null | 免费模式返回水印配置 |
data.credits_cost | int | 本次消耗点数 |
data.credits_balance | int | 当前剩余点数 |
响应示例
当前:免费模式
{
"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 行代码)
<!-- 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>
水印配置项
| 字段 | 类型 | 说明 |
|---|---|---|
text | string | 水印文字,默认「小K导航赞助」 |
link | string | 点击水印跳转地址 |
logo | string | Logo 图片 URL |
position | string | 位置:top-left(默认) / top-right / bottom-left / bottom-right |
bg | string | 背景色 |
错误码参照
所有接口统一使用以下状态码。
| code | HTTP | 说明 | 处理建议 |
|---|---|---|---|
0 | 200 | 成功 | 处理返回数据 |
400 | 400 | 参数错误 | 检查请求体字段 |
401 | 401 | API Key 无效 | 检查 API Key 或重新生成 |
402 | 402 | 点数不足 | 到 用户中心 充值 |
405 | 405 | 请求方法错误 | 仅支持 POST |
429 | 429 | 请求过于频繁 | 降低请求频率 |
500 | 500 | 服务端错误 | 稍后重试 |
502 | 502 | 上游服务异常 | 稍后重试,点数自动退回 |
示例代码
以下为各语言的完整调用示例,复制后替换 YOUR_API_KEY 即可使用。
cURL
# 图片反推
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 "https://www.4dj.net/api/v1/prompt/status.php?task_id=abcd1234" \
-H "X-API-Key: YOUR_API_KEY"
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"])
if __name__ == "__main__":
# reverse_image("test.jpg")
reverse_video("my_video.mp4")
# parse_video("https://v.douyin.com/xxxxx/")
JavaScript
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://www.4dj.net/api/v1';
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);
console.log('消耗点数:' + submitData.data.credits_cost);
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 之旅
