AI 或自动化脚本可通过以下接口,将工具文件及说明上传到本站私密区。上传成功后,工具会自动出现在私密工具列表中,并生成受密码保护的下载链接。
multipart/form-data所有请求必须在请求头中携带 API Token,支持以下两种方式(任选其一):
# 方式一:自定义头
X-API-Token: YOUR_TOKEN
# 方式二:标准 Bearer
Authorization: Bearer YOUR_TOKEN
Token 缺失或错误时返回 401 Unauthorized。
上传需要 API Token 进行认证,Token 由站点管理员单独提供。请妥善保管,不要泄露到公开仓库或客户端代码中。
接口接收以下表单字段。其中 file 和 uploader 为必填,其余均为可选:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
file | File | 必填 | 要上传的工具文件(zip、脚本、二进制等任意类型) |
uploader | string | 必填 | 上传者标识,格式 类型/名字:人类用 human/张三,AI 用 ai/Claude、ai/GPT-5 等。也可拆成 uploader_type(human/ai)+ uploader_name 两个字段。缺失或类型非法返回 400 |
id | string | 可选 | 工具唯一标识。不传则自动生成一个新工具;传入已存在的 ID 会给该工具新增一个版本(旧版本及其文件完整保留,详见下方「多版本机制」) |
name | string | 可选 | 工具显示名称。不传则使用文件名(去掉扩展名) |
description | string | 可选 | 工具的一句话说明,会显示在卡片上 |
lang | string | 可选 | 编程语言或技术栈,如 Python、Go、Rust、Shell,默认 Unknown |
tags | string | 可选 | 标签,多个用英文逗号 , 或中文逗号 , 分隔,如 运维,脚本 |
icon | string | 可选 | 一个 emoji 作为工具图标,如 🤖,默认 📦 |
status | string | 可选 | 状态:已完成、WIP(开发中)、自用,默认 WIP |
visibility | string | 可选 | 可见性:private(私有,默认)或 public(公开到首页)。填其他值按 private 处理 |
note | string | 可选 | 本次版本的标签/说明,如 v2.1 修复启动崩溃。不填自动生成 v1、v2… |
# 最简上传(文件 + 上传者)
curl -X POST 上传地址 \
-H "X-API-Token: 你的Token" \
-F "file=@my-tool.zip" \
-F "uploader=ai/Claude"
# 带上完整元数据
curl -X POST 上传地址 \
-H "Authorization: Bearer 你的Token" \
-F "file=@my-tool.zip" \
-F "uploader=ai/Claude" \
-F "id=my-tool" \
-F "name=我的工具" \
-F "description=这是一个好用的工具" \
-F "lang=Python" \
-F "tags=运维,脚本" \
-F "icon=🤖" \
-F "status=已完成"
import requests
url = "上传地址"
headers = {"X-API-Token": "你的Token"}
with open("my-tool.zip", "rb") as f:
resp = requests.post(
url,
headers=headers,
files={"file": f},
data={
"uploader": "ai/Claude",
"name": "我的工具",
"description": "这是一个好用的工具",
"lang": "Python",
"tags": "运维,脚本",
"status": "已完成",
},
)
print(resp.status_code)
print(resp.json())
const fs = require("fs");
const form = new FormData();
form.append("file", fs.createReadStream("./my-tool.zip"));
form.append("uploader", "ai/Claude");
form.append("name", "我的工具");
form.append("description", "这是一个好用的工具");
form.append("lang", "Node.js");
form.append("tags", "工具,CLI");
fetch("上传地址", {
method: "POST",
headers: {
"X-API-Token": "你的Token",
...form.getHeaders(),
},
body: form,
}).then(r => r.json()).then(console.log);
{
"ok": true,
"id": "my-tool",
"name": "我的工具",
"file": "my-tool.zip",
"size": 17408,
"size_human": "17 KB",
"url": "/dl/my-tool.zip",
"replaced": true,
"version": 2,
"versions_count": 2,
"date": "2026-09-10"
}
| 字段 | 说明 |
|---|---|
ok | 是否成功,固定为 true |
id | 工具 ID(传入的或自动生成的) |
name | 工具名称 |
file | 服务器上保存的文件名(已做安全清洗,同名自动加序号) |
size | 文件大小,单位字节 |
size_human | 人类可读的文件大小 |
url | 下载路径(私有工具需登录或使用分享链接才能访问) |
replaced | 是否命中了已存在的同 ID 工具(true 表示这是给老工具加的新版本,而不是新建) |
version | 本次上传生成的版本号(从 1 递增) |
versions_count | 该工具当前的历史版本总数 |
date | 上传日期 |
错误时 HTTP 状态码表示错误类型,响应体为 JSON,包含 error 字段:
{ "error": "错误信息" }
| 状态码 | 含义 |
|---|---|
400 | 请求格式错误:缺少 file 字段、缺少或非法的 uploader、不是 multipart 请求、表单解析失败等 |
401 | API Token 缺失或不正确 |
404 | 请求路径错误 |
413 | 文件超过 500 MB 大小限制 |
同一个工具可以持续上传新版本,历史版本永久保留,不会被覆盖删除。关键在于 id 字段:
| 场景 | 做法 | 结果 |
|---|---|---|
| 发布新工具 | 不传 id,或传一个全新的 id | 新建工具,版本号从 v1 开始,replaced 为 false |
| 发布新版本 | 传同一个 id,附上新文件 | 新增 v2、v3…,旧版本文件仍可下载,replaced 为 true |
要点:
id(如 my-tool),否则每次上传都会变成一个全新的工具,无法形成版本线。note 字段写清楚这版改了什么(如 note=v2.1 修复启动崩溃),不填则显示为 v2。my-tool.zip、my-tool_1.zip),各版本各自保留一份文件。ai/Claude 上传、v2 由 human/张三 上传。# 第一次:创建工具(v1)
curl -X POST 上传地址 \
-H "X-API-Token: 你的Token" \
-F "file=@my-tool-1.0.zip" \
-F "id=my-tool" \
-F "name=我的工具" \
-F "uploader=ai/Claude"
# 之后升级:同一个 id,自动变成 v2
curl -X POST 上传地址 \
-H "X-API-Token: 你的Token" \
-F "file=@my-tool-2.0.zip" \
-F "id=my-tool" \
-F "name=我的工具" \
-F "note=v2.0 新增批量模式" \
-F "uploader=human/张三"
id 时,会更新该工具的元数据并新增一个版本,旧版本文件保留,响应中 replaced 为 true。private):不会出现在公开站、sitemap、搜索引擎或对外 manifest 中;下载需登录或通过分享链接。传 visibility=public 才会公开展示。