10 KiB
10 KiB
AnyToCopy API 开发文档
原文档:https://www.anytocopy.com/account/api/docs
功能:支持 50+ 平台视频文案提取、视频去水印
概述
AnyToCopy API 提供视频/图片文案提取功能,支持抖音、小红书、快手等 50+ 平台。
核心功能:
- 视频文案提取(语音转文字)
- 视频去水印下载
- 图片去水印下载
- 支持 50+ 内容平台
基础信息
| 项目 | 内容 |
|---|---|
| Base URL | https://api.anytocopy.com/vip/open-api/v1 |
| 协议 | HTTPS |
| 数据格式 | JSON |
鉴权方式
在请求头中携带 API Key 和 Secret:
X-API-Key: your_api_key
X-API-Secret: your_api_secret
接口列表
1. 提交视频文案提取任务
创建提取任务,返回 taskId 用于后续查询。
请求
| 项目 | 内容 |
|---|---|
| Method | POST |
| Endpoint | /video/extract |
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
workUrl |
String | 是 | 作品链接(支持抖音、小红书等) |
taskType |
String | 否 | 任务类型,默认 TEXT(文案提取) |
curl 示例
curl -X POST 'https://api.anytocopy.com/vip/open-api/v1/video/extract?workUrl=https://v.douyin.com/xxx&taskType=TEXT' \
-H 'X-API-Key: your_api_key' \
-H 'X-API-Secret: your_api_secret'
响应示例
成功响应(HTTP 200):
{
"msg": "任务已提交",
"code": 200,
"data": "2008802706718072832"
}
失败响应(并发限制):
{
"msg": "您的并发任务已达上限(5/5),请等待任务完成后再试",
"code": 500
}
2. 查询任务状态和结果
根据 taskId 查询任务进度与提取结果。
请求
| 项目 | 内容 |
|---|---|
| Method | GET |
| Endpoint | /video/query |
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskId |
String | 是 | 任务 ID(提交任务时返回) |
curl 示例
curl -X GET 'https://api.anytocopy.com/vip/open-api/v1/video/query?taskId=2008802706718072832' \
-H 'X-API-Key: your_api_key' \
-H 'X-API-Secret: your_api_secret'
响应示例
任务完成(SUCCESS):
{
"msg": "操作成功",
"code": 200,
"data": {
"taskId": "2008802706718072832",
"title": "小个子女生如何逆袭第一眼大美女",
"content": "#听劝改造[话题]# #如何找到自己的风格",
"videoUrl": "https://sns-video-bd.xhscdn.com/f0370019b934b9b6e_258.mp4",
"videoUrlList": ["https://sns-video-bd.xhscdn.com/stream/79258.mp4"],
"imageUrlList": ["https://ci.xiaohongshu.com/1040g2sg31r0hdqhjnge05q"],
"cover": "https://ci.xiaohongshu.com/1040g2sg31r0hdqhjnge05",
"textContent": "小个子女生真的不要再和别人卷身高上的天赋...",
"platform": "xhs",
"audioUrl": "https://pub-6026ae78487b47e5bd4a5b8a0d9ae5aa.r2.dev/audio.mp3",
"duration": 156.36,
"workType": "video",
"status": "SUCCESS",
"errorMessage": "视频处理成功!",
"createBy": "60227",
"createTime": "2026-01-07 15:27:42"
}
}
任务处理中(WAITING):
{
"msg": "操作成功",
"code": 200,
"data": {
"taskId": "2008805155734429696",
"title": "今日摘抄,不知道原创是谁,太多了",
"content": "今日摘抄,不知道原创是谁,太多了,可以在",
"videoUrl": "https://sns-video-qc.xhscdn.com/stream/79/258.mp4",
"videoUrlList": ["https://sns-video-qc.xhscdn.com/stream/79/258.mp4"],
"imageUrlList": ["https://ci.xiaohongshu.com/spectrum/1040g0k031qo"],
"cover": "https://ci.xiaohongshu.com/spectrum/1040g0k031qoj7pr9gm905",
"textContent": "",
"platform": "xhs",
"audioUrl": null,
"duration": null,
"workType": "video",
"status": "WAITING",
"errorMessage": "作品内容提取中...",
"createBy": "60227",
"createTime": "2026-01-07 15:37:26"
}
}
任务失败(FAILURE):
{
"msg": "操作成功",
"code": 200,
"data": {
"taskId": "2008805155734429696",
"status": "FAILURE",
"errorMessage": "任务执行失败"
}
}
响应状态码
| 状态码 | 说明 | 场景 |
|---|---|---|
| 200 | 成功 | 任务创建成功或查询成功 |
| 500 | 失败 | 并发任务已达上限或其他错误 |
任务状态说明
| 状态值 | 说明 | 处理建议 |
|---|---|---|
WAITING |
任务等待中或处理中 | 继续轮询查询任务状态 |
PROCESSING |
任务处理中 | 继续轮询查询任务状态 |
SUCCESS |
任务执行成功 | 可获取完整的提取结果数据 |
FAILED / FAILURE |
任务执行失败 | 检查 errorMessage 字段获取失败原因 |
响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
taskId |
String | 任务唯一标识 |
title |
String | 作品标题 |
content |
String | 作品正文内容 |
textContent |
String | 视频语音转文字文案(任务完成后) |
videoUrl |
String | 视频下载链接(无水印) |
audioUrl |
String | 音频文件链接(任务完成后) |
imageUrlList |
Array | 图片链接列表 |
cover |
String | 封面图片链接 |
platform |
String | 平台标识(xhs、douyin 等) |
duration |
Number | 视频时长(秒) |
workType |
String | 作品类型(video、image) |
status |
String | 任务状态(WAITING、SUCCESS、FAILURE) |
errorMessage |
String | 状态描述或错误信息 |
createBy |
String | 创建者 ID |
createTime |
String | 创建时间 |
接口使用流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1. 提交任务 │ --> │ 2. 轮询查询 │ --> │ 3. 处理结果 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
POST /video/extract GET /video/query status = SUCCESS
获取 taskId 每 3-5 秒查询一次 获取完整结果
推荐调用流程
-
提交任务
- 调用
POST /video/extract接口,传入作品链接 - 成功后返回
taskId,用于后续查询
- 调用
-
轮询查询
- 使用返回的
taskId调用GET /video/query接口 - 建议每隔 3-5 秒 查询一次任务状态
- 使用返回的
-
处理结果
- 当
status为SUCCESS时,获取完整的提取结果(标题、正文、视频、音频等) - 若为
FAILURE,检查errorMessage了解失败原因
- 当
最佳实践
- 轮询间隔建议:3-5 秒,避免过于频繁请求
- 最大轮询次数:建议设置 60 次上限,避免无限轮询
- 安全保管:妥善保管 API Key 和 Secret,不要泄露到客户端
- 并发限制:并发任务上限为 5 个,合理安排任务提交
支持平台
支持 50+ 平台,主要包括:
| 平台 | 标识 | 说明 |
|---|---|---|
| 小红书 | xhs | 视频、图文 |
| 抖音 | douyin | 视频 |
| 快手 | kuaishou | 视频 |
| ... | ... | 更多平台 |
Python 集成示例
import asyncio
import aiohttp
class AnyToCopyClient:
BASE_URL = "https://api.anytocopy.com/vip/open-api/v1"
def __init__(self, api_key: str, api_secret: str):
self.api_key = api_key
self.api_secret = api_secret
self.headers = {
"X-API-Key": api_key,
"X-API-Secret": api_secret,
}
async def submit_task(self, work_url: str, task_type: str = "TEXT") -> dict:
"""提交视频文案提取任务"""
url = f"{self.BASE_URL}/video/extract"
params = {"workUrl": work_url, "taskType": task_type}
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=self.headers, params=params) as resp:
return await resp.json()
async def query_task(self, task_id: str) -> dict:
"""查询任务状态和结果"""
url = f"{self.BASE_URL}/video/query"
params = {"taskId": task_id}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=self.headers, params=params) as resp:
return await resp.json()
async def extract_video(self, work_url: str, max_retries: int = 60) -> dict:
"""完整的视频提取流程(提交 + 轮询)"""
# 1. 提交任务
submit_result = await self.submit_task(work_url)
if submit_result.get("code") != 200:
raise Exception(f"提交任务失败: {submit_result.get('msg')}")
task_id = submit_result["data"]
print(f"任务已提交,taskId: {task_id}")
# 2. 轮询查询
for i in range(max_retries):
await asyncio.sleep(3) # 每 3 秒查询一次
query_result = await self.query_task(task_id)
if query_result.get("code") != 200:
continue
data = query_result.get("data", {})
status = data.get("status")
if status == "SUCCESS":
print(f"任务完成!")
return data
elif status == "FAILURE":
raise Exception(f"任务失败: {data.get('errorMessage')}")
else:
print(f"[{i+1}/{max_retries}] 任务处理中...")
raise Exception("轮询超时,任务未完成")
# 使用示例
async def main():
client = AnyToCopyClient(
api_key="your_api_key",
api_secret="your_api_secret"
)
try:
result = await client.extract_video("https://v.douyin.com/xxxxx")
print(f"标题: {result['title']}")
print(f"文案: {result['textContent']}")
print(f"视频: {result['videoUrl']}")
except Exception as e:
print(f"错误: {e}")
if __name__ == "__main__":
asyncio.run(main())