Files
meijiaka-zy/docs/anytocopy-api.md
T

10 KiB
Raw Blame History

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 秒查询一次     获取完整结果

推荐调用流程

  1. 提交任务

    • 调用 POST /video/extract 接口,传入作品链接
    • 成功后返回 taskId,用于后续查询
  2. 轮询查询

    • 使用返回的 taskId 调用 GET /video/query 接口
    • 建议每隔 3-5 秒 查询一次任务状态
  3. 处理结果

    • statusSUCCESS 时,获取完整的提取结果(标题、正文、视频、音频等)
    • 若为 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())