DupeForums API

通过访问令牌调用接口,完成资源上传与查询。令牌在「个人设置 → API 令牌」生成与管理。

基础信息

接口根地址https://dupeforums.net/api/v1
数据格式请求与响应均为 JSON(UTF-8);上传资源支持 multipart/form-data。
鉴权头Authorization: Bearer <token>

所有需要鉴权的接口都必须带 Authorization 头;未携带或令牌无效时返回 401。

鉴权方式

推荐使用个人访问令牌(PAT):权限可限定、可设有效期、可随时撤销,泄露后影响可控。

  1. 登录网站,进入「个人设置 → API 令牌」。
  2. 填写备注名,勾选权限范围(read / upload / delete / all)与有效期,点击生成。
  3. 复制只显示一次的令牌明文,在请求头中以 Bearer 方式携带。
curl -H "Authorization: Bearer <your_token>" https://dupeforums.net/api/v1/me

权限范围

范围说明
read读取用户信息、分类列表与自己的资源状态。
upload上传并创建资源(需要创作者权限)。
delete删除自己上传的、尚无购买记录的资源。
all拥有以上全部权限,请谨慎使用。

关于账号密码登录

/api/v1/login 端点默认关闭(需服务端显式开启)。因为它要求客户端保存账号密码原文,一旦泄露等同于账号失守;建议仅在本地脚本中临时使用,长期集成请改用访问令牌。

接口列表

POST/api/v1/login—用账号密码换取令牌(默认关闭)。参数 identifier 为用户名或邮箱,password 为密码。
GET/api/v1/meread返回当前令牌对应的用户信息。
GET/api/v1/categoriesread返回全部分类,用于获取上传资源所需的 category_id。
POST/api/v1/resourcesupload创建资源。支持 JSON(含 file.download_url,由服务端拉取资源包)或 multipart(file 字段直接上传)。创建后为待审核状态。
GET/api/v1/resources/{id}read查询资源状态(仅本人或管理员)。
POST/api/v1/resources/{id}/deletedelete删除(软删)自己上传的、尚无购买记录的资源;仅草稿/待审核/已驳回状态可删。
POST/api/v1/logout—撤销当前请求所用的令牌。

上传资源

资源包有两种给法:JSON 中提供 file.download_url 由服务器下载,或用 multipart/form-data 的 file 字段直接上传(两者同时提供时以上传的文件为准)。图标同理:icon 传图片直链,或用 cover_image 字段上传。

字段说明

字段必填说明
title是资源标题,最长 128 字符。
tagline否一句话简介,最长 255 字符。
description_html是资源详细描述,支持 HTML。
icon否图标图片直链,由服务端下载后保存。
version否版本号,默认 1.0.0。
file.download_url二选一资源包直链,由服务端下载;需该地址对服务器可达。
file.name否原始文件名,用于推导扩展名(zip/rar/7z/gz/tar/jar)。
file (multipart)二选一资源包文件本体,multipart 上传。
category_id否分类 ID;缺省时使用站点默认分类,可先调用分类接口获取。
price / is_free否定价。缺省按免费处理;付费需 price > 0 且 is_free=0,currency 支持 gold(金锭)或 iron(铁锭)。
tags否标签,数组或英文逗号分隔的字符串。
mc_edition / mc_version / mc_platform否Minecraft 版本信息;mc_edition 为 java 或 bedrock,mc_version / mc_platform 为数组。

请求示例

{
  "title": "Iris - Dimension Engine",
  "tagline": "A Beautiful, Incredibly fast world generator.",
  "description_html": "<div class=\"bbWrapper\">…</div>",
  "icon": "https://example.com/icons/725.jpg",
  "version": "4.3.0",
  "file": {
    "name": "Iris-4.3.0.jar",
    "download_url": "https://example.com/files/725/Iris-4.3.0.jar",
    "content_type": "application/octet-stream",
    "sha256": "3446…09f7",
    "size": 5683335
  },
  "id": "725",
  "url": "https://example.com/resources/iris.725/",
  "category_id": 8,
  "price": 50,
  "currency": "iron",
  "is_free": 0,
  "tags": "world,generator"
}
curl -X POST https://dupeforums.net/api/v1/resources \
  -H "Authorization: Bearer <your_token>" \
  -H "Content-Type: application/json" \
  --data-binary @payload.json
curl -X POST https://dupeforums.net/api/v1/resources \
  -H "Authorization: Bearer <your_token>" \
  -F "title=My Plugin" \
  --form-string "description_html=<p>desc</p>" \
  -F "category_id=6" -F "is_free=1" \
  -F "file=@MyPlugin.jar"

成功时返回 code=0 与新建资源的信息(含 id、slug、status、url)。资源创建后为待审核状态,审核通过后才会在站内公开。

错误码

状态码含义
401未携带令牌,或令牌无效、已过期、已撤销。
403令牌缺少所需权限、账号没有创作者权限,或该功能已关闭。
404资源或接口不存在。
409当前状态不允许该操作(例如资源已有购买记录,不能删除)。
422参数校验失败(缺少必填项、分类不存在、文件类型或大小不符合要求)。
429请求过于频繁(登录尝试或发布冷却)。
500服务器内部错误。
{ "code": 401, "message": "未登录或令牌无效/已过期,请先调用 POST /api/v1/login 获取令牌", "data": null }

频率限制

创建资源有 60 秒冷却(与网页端共用);账号密码登录时,同一 IP 5 分钟内最多 10 次尝试,同一账号连续失败 5 次锁定 15 分钟。

中文 English