通用约定
示例中的 https://launcher.example.com 代表当前部署的站点地址。除 manifest 和安装链接接口外,插件商店接口通常返回统一外层对象:成功时包含 success: true,失败时包含 success: false 与 error。
启动器信息
读取当前正式版、测试版、各平台下载地址、提示语和活动信息。无需登录。
curl https://launcher.example.com/api/info
返回字段:latestVersion、description、newVersionDescription、beta、downloads、BLTips、activity。
读取快速下载配置。无需登录。
fetch('/api/fastdownload').then(r => r.json())
返回对象包含 enabled 和 versions 数组;服务端未配置时返回 {"enabled":false,"versions":[]}。
登录与会话
将浏览器重定向到 Bloret PassPort 授权页。可选参数 return_to 指定登录后返回的站内路径。
GET /apps/auth/login?return_to=%2Fapps%2Fmine
PassPort 授权回调入口。用户同意后携带一次性 code 和 state,服务端验证成功后写入会话 Cookie 并跳回原页面。该接口由 PassPort 调用,不建议业务代码直接模拟。
查询当前会话。无需登录也可调用。
{
"success": true,
"loggedIn": true,
"user": { "username": "example", "avatar": "https://...", "admin": false }
}
未登录时返回 loggedIn: false 且 user: null。
清除当前会话 Cookie。无需请求体。
curl -X POST -b cookies.txt -c cookies.txt https://launcher.example.com/apps/auth/logout
成功返回 {"success":true}。GET /apps/auth/logout 也可用于浏览器跳转退出,退出后回到插件商店。
插件商店 API
插件提交后状态为 pending,管理员审核通过后变为 approved,驳回后为 rejected。未登录访客只能看到已上架插件;作者可查看和修改自己的记录,管理员可查看全部记录。
插件字段
| 字段 | 类型 | 要求与说明 |
|---|---|---|
id | string | 必填,3–128 个字符,只允许字母、数字、点、下划线、连字符。 |
name | string | 必填,插件显示名称。 |
version | string | 必填,插件版本号。 |
author | string | 可选,展示用作者名;提交者账号由会话确定。 |
description / longDescription | string | 简短描述和详细描述。 |
download | string | 必填,必须是 HTTPS ZIP 直链。 |
sha256 | string | 可选,必须是 64 位小写或大写十六进制 SHA-256 值。 |
url | string | 可选,必须是 HTTPS 主页链接。 |
icon | string | 可选,HTTPS 图片链接或站内绝对路径。 |
permissions / tags | string[] 或 string | 权限和标签;字符串可用逗号、中文逗号或空格分隔。 |
screenshots | array | 最多 8 张,元素可为 URL 字符串或 {url,webpUrl};链接必须是 HTTPS 或站内路径。 |
列出当前调用者可见的插件。
| 查询参数 | 说明 |
|---|---|
q | 按 id、名称、作者、简介或标签模糊搜索。 |
tag | 按标签精确筛选,不区分大小写。 |
sort | updated(默认)、rating、installs。 |
public=1 | 只返回已上架插件。 |
scope=mine | 需要登录,只返回当前用户提交的插件。 |
scope=admin | 需要管理员权限,返回全部插件。 |
status | 按 pending、approved 或 rejected 筛选;管理员和对应作者可查看非公开记录。 |
curl 'https://launcher.example.com/apps/api/plugins?q=shader&sort=rating'
{
"success": true,
"plugins": [{
"id": "example.shader", "name": "Example Shader", "version": "1.2.0",
"author": "Example Team", "description": "...", "download": "https://.../plugin.zip",
"permissions": ["minecraft:read"], "tags": ["shader"], "status": "approved",
"installCount": 12, "ratingAvg": 4.5, "ratingCount": 2, "featured": false
}]
}
读取插件详情。已上架插件公开;待审核或已驳回插件仅对作者和管理员可见。添加 ?include=related 或 ?related=1 时返回最多 6 个相关插件。
返回给启动器使用的精简清单,仅限已上架插件,允许跨域。
{ "name": "Example Shader", "master": "Example Team", "download": "https://.../plugin.zip", "version": "1.2.0" }
提交插件,需要登录。Content-Type 为 application/json。新插件进入 pending 状态。
curl -X POST -b cookies.txt https://launcher.example.com/apps/api/plugins \
-H 'Content-Type: application/json' \
-d '{
"id":"example.shader", "name":"Example Shader", "version":"1.2.0",
"author":"Example Team", "description":"一个示例插件",
"download":"https://downloads.example.com/example-shader-1.2.0.zip",
"sha256":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"permissions":["minecraft:read"], "tags":["shader"]
}'
修改插件,需要登录。作者可修改自己的插件;管理员可修改任意插件并设置 featured。已上架插件由作者修改时会生成待审核更新,不会立即覆盖线上版本。
PATCH /apps/api/plugins/example.shader
Content-Type: application/json
{ "version":"1.2.1", "description":"修复加载问题" }
审核插件,仅管理员可用。请求体中的 action 必须为 approve 或 reject;驳回时可传 reason。
{ "action": "approve" }
{ "action": "reject", "reason": "下载地址无法访问" }
记录一次安装点击,无需登录。仅已上架插件可计数。
{ "success": true, "installCount": 13 }
生成启动器一键安装数据,无需登录,仅限已上架插件。返回自定义协议链接、下载地址、SHA-256 和本地启动器 propose 请求体。
{
"success": true,
"install_url": "bloret://plugin/install?download=https%3A%2F%2F...&id=example.shader&source=store",
"download": "https://downloads.example.com/example-shader-1.2.0.zip",
"sha256": "...",
"propose": { "download":"https://...", "id":"example.shader", "source":"store" }
}
媒体上传
需要登录,使用 multipart/form-data 上传一个名为 image 的图片文件。支持 JPG、PNG、GIF、WebP,单文件最大 8 MiB。接口会转发到配置的图床并返回绝对 URL。
curl -X POST -b cookies.txt https://launcher.example.com/apps/api/media/upload \
-F 'image=@./screenshot.png'
{ "success": true, "data": {
"url": "https://img.bloret.net/...",
"webpUrl": "https://img.bloret.net/...webp",
"timestamp": 1710000000, "md5": "...", "filename": "screenshot.png"
} }
评分与评论回复
读取已可见插件的评分统计和分页评论。可选查询参数 limit(1–50,默认 20)与 offset(默认 0)。登录用户会额外得到 myRating。
{ "success":true, "avg":4.5, "count":2, "distribution":{"1":0,"2":0,"3":0,"4":1,"5":1}, "ratings":[], "limit":20, "offset":0, "myRating":null }需要登录,为已上架插件新增或更新当前用户评分。stars 必须是 1–5 的整数,comment 最多 500 字。
{ "stars": 5, "comment": "安装简单,运行稳定。" }需要登录,删除当前用户对该插件的评分。
需要登录,回复指定用户的评论。请求体可使用 body 或兼容字段 comment,最多 500 字。
{ "body": "感谢反馈,我们会在下个版本修复。" }需要登录,仅回复作者本人或管理员可以删除回复。
错误与权限
| 状态码 | 含义 | 常见场景 |
|---|---|---|
400 | 请求或字段校验失败 | 缺少字段、URL 不是 HTTPS、stars 不在 1–5、图片类型不支持。 |
401 | 未登录 | 调用需要登录的提交、修改、评分、上传接口。 |
403 | 无权限 | 普通用户调用管理员审核接口,或修改他人插件/回复。 |
404 | 资源不存在或不可见 | 插件不存在、未上架,或当前用户无权查看。 |
502 | 上游图床失败 | 媒体上传时图床返回错误。 |
500 | 服务端错误 | 数据库或配置读取异常。 |
{ "success": false, "error": "需要管理员权限", "code": "FORBIDDEN" }
安全建议:下载地址和插件主页使用 HTTPS;不要把会话 Cookie、PassPort 密钥、数据库密码或任何配置令牌写进前端代码、插件清单或公开文档。