开放 API
红石阁 公开 API 文档
这份文档面向想接入红石阁公开数据的开发者。下面列出的接口都不需要登录,也不用任何凭证,直接请求就能拿到数据。
所有接口地址都以 /api 开头,返回的数据基本都是 JSON 格式。
目录
1. 作品列表
GET /api/doors
这是作品档案馆的主列表,返回的都是已经过审核的作品,默认按发布时间从新到旧排。
查询参数(都是可选的)
| 参数 | 作用 |
|---|---|
size |
按开启尺寸筛选,比如 3x3 |
door_type |
按分类筛选,比如 piston_door |
speed |
传 high 只看高速作品 |
compact |
传 high 只看紧凑作品 |
version |
按已测试版本筛选 |
edition |
按游戏版本筛选(Java / 基岩) |
user |
按作者筛选,看某个创作者的全部作品 |
page |
页码,默认第 1 页 |
per_page |
每页几条,默认 60 |
返回示例
{
"doors": [
{
"id": "abc123",
"name": "双触发活塞门",
"author": "Steve",
"door_type": "piston_door",
"opening_size": "3x3",
"high_speed": false,
"high_compact": true,
"tested_versions": ["1.20", "1.21"],
"size": [3, 3, 1],
"block_count": 142,
"tags": [],
"has_preview": true,
"has_open": true,
"thumb_url": "/work/abc123/thumb.png",
"poster_url": "/work/abc123/poster.png"
}
],
"page": 1,
"per_page": 60,
"has_more": true
}
怎么用
# 翻到第 2 页,只看活塞门,每页 30 条
GET /api/doors?door_type=piston_door&page=2&per_page=30
# 看某个创作者的全部作品
GET /api/doors?user=u_88
# 只看高速 + 紧凑的
GET /api/doors?speed=high&compact=high
# 按 1.21 版本筛
GET /api/doors?version=1.21
几个要说明的点:
thumb_url和poster_url是缩略图和海报地址,能直接拿去前端展示。但不是每件作品都有——只有这件作品实际生成了对应图片,才会带这俩字段,没有就不出现。至于图片是.webp还是.png,也由实际文件决定,地址里会带上。has_more表示后面还有没有更多内容。不过它的判断方式有点粗:只要本页返回的条数等于per_page,就认为「还有更多」。所以最后一页如果恰好满页,has_more会是true但其实没下一页了。翻页时建议同时看「实际返回条数」,不够per_page就到头了。size是作品的体积,格式是[x, y, z]三个数。- 列表里的作品都是已过审的,未过审的不会出现。
2. 作品详情
GET /api/doors/{id}
传一个作品 ID,返回这件作品的完整信息。找不到就返回 404。
GET /api/doors/abc123
{
"id": "abc123",
"name": "双触发活塞门",
"description": "……",
"door_type": "piston_door",
"opening_size": "3x3",
"high_speed": false,
"high_compact": true,
"tested_versions": ["1.20", "1.21"],
"size": [3, 3, 1],
"block_count": 142,
"tags": ["redstone", "hidden"],
"meta": { "edition": "java" },
"created_at": "2025-01-01T00:00:00Z"
}
meta 里装的是这件作品的附加信息(比如 Java / 基岩版标识之类),具体有哪些字段取决于作品本身,不同作品可能不一样。
3. 在线预览结构
GET /api/doors/{id}/template
返回这件作品的结构预览数据(JSON 格式),可以直接拿去做网页里的 3D 预览。如果这件作品没有结构数据,会返回 404。
GET /api/doors/abc123/template
4. 下载结构文件
GET /api/doors/{id}/file/{which}
下载作品的结构文件。只有过审的作品才能公开下载,没过审或下架的不开放。
{which} 告诉后端你要取哪一份文件,能填这几个值:
| 值 | 是什么 |
|---|---|
open |
开启态结构(Java 版) |
close |
关闭态结构(Java 版) |
preview |
预览结构 |
open_be |
开启态结构(基岩版) |
close_be |
关闭态结构(基岩版) |
关于文件后缀:你不用、也没法指定要 .nbt 还是 .mcstructure。后端会根据 {which} 找到这件作品对应的那份文件,原样发给你——Java 版作品存的是什么格式,下载下来就是什么格式,基岩版同理。也就是说,后缀由作品本身决定,调用方管不了。
如果某件作品没有对应的那份文件(比如基岩版作品没传 open_be),会返回 404。
# 下载 Java 版的开启态结构
GET /api/doors/abc123/file/open
# 下载基岩版的关闭态结构
GET /api/doors/abc123/file/close_be
# 下载预览结构
GET /api/doors/abc123/file/preview
前端用的时候直接 <a href="..." download> 就能触发浏览器下载。
5. 作品评论列表
GET /api/doors/{id}/comments
返回这件作品的全部评论。同样只有过审的作品才开放评论查看。没登录的时候,每条评论的 liked 都是 false。
GET /api/doors/abc123/comments
{
"comments": [
{
"id": "c_1",
"author": "Alex",
"body": "太强了!",
"parent_id": null,
"reply_to": null,
"likes": 5,
"liked": false,
"title": { "id": "t_1", "name": "红石大师" },
"created_at": "2025-01-02T00:00:00Z"
}
]
}
几个字段说明:
liked表示「当前请求者有没有点过这条赞」。因为这是免登录接口,没人登录,所以永远是false。parent_id和reply_to是回复关系:parent_id是这条回复所属的根评论 ID,reply_to是它直接回复的那条评论 ID。不是回复的话这俩都是null。title是评论者当前装备的称号,没有装备就是null。likes是这条评论收到的点赞数。
6. 用户公开主页
GET /api/users/{id}
返回某个用户的公开资料和他已过审的全部作品。不需要登录。
GET /api/users/u_1
{
"user": {
"id": "u_1",
"account_name": "steve",
"game_name": "Steve",
"bio": "红石爱好者",
"titles": [ { "id": "t_1", "name": "红石大师" } ],
"title": { "id": "t_1", "name": "红石大师" }
},
"doors": [ { "id": "abc123", "name": "双触发活塞门" } ]
}
这里返回的只是用户自己公开出来的信息(昵称、简介、称号、作品),不涉及任何隐私数据。
7. 创作者订阅人数
GET /api/creators/{id}/subscription
返回某个创作者被多少人订阅。没登录的话,subscribed 一直是 false。
GET /api/creators/u_1/subscription
{ "count": 128, "subscribed": false }
8. 称号列表
两个接口:
GET /api/titles—— 站内全部称号GET /api/users/{id}/titles—— 某个用户拥有的全部称号
GET /api/titles
GET /api/users/u_1/titles
{ "titles": [ { "id": "t_1", "name": "红石大师", "desc": "……" } ] }
9. 创作者排行榜
GET /api/creators/top
创作者排行榜,按作品数、方块数这些排,分页返回。
| 参数 | 作用 |
|---|---|
limit |
每页几条,默认 24 |
offset |
跳过几条,默认 0 |
GET /api/creators/top?limit=10&offset=0
{
"creators": [
{
"id": "u_1",
"account_name": "steve",
"works": 12,
"blocks": 1820,
"followers": 128
}
],
"total": 56,
"limit": 10,
"offset": 0,
"has_more": true
}
10. 铭文 / 记录列表
GET /api/records
站内的「铭文 / 记录」列表,可以按关键词搜,也能分页。
| 参数 | 作用 |
|---|---|
q |
搜索关键词 |
page |
页码,默认 1 |
per_page |
每页几条,默认 9 |
GET /api/records?q=活塞&page=1&per_page=9
{
"records": [
{
"id": "abc123",
"name": "双触发活塞门",
"author": "Steve",
"door_type": "piston_door",
"opening_size": "3x3",
"record": {
"note": "经典之作,收录纪念"
}
}
],
"total": 30,
"page": 1,
"per_page": 9,
"pages": 4
}
11. 页面
下面这几个是网页页面,不是 JSON 接口,但同样不需要登录,浏览器里直接打开就行:
| 地址 | 是什么 |
|---|---|
GET /work/{id} |
作品详情页 |
GET /creator/{id} |
创作者主页 |
https://your-host/work/abc123
https://your-host/creator/u_1
12. 速查表
| 接口 | 要登录吗 | 返回什么 |
|---|---|---|
GET /api/doors |
不用 | JSON |
GET /api/doors/{id} |
不用 | JSON |
GET /api/doors/{id}/template |
不用 | JSON(结构预览) |
GET /api/doors/{id}/file/{which} |
不用 | 文件流 |
GET /api/doors/{id}/comments |
不用 | JSON |
GET /api/users/{id} |
不用 | JSON(公开资料) |
GET /api/creators/{id}/subscription |
不用 | JSON |
GET /api/titles |
不用 | JSON |
GET /api/users/{id}/titles |
不用 | JSON |
GET /api/creators/top |
不用 | JSON |
GET /api/records |
不用 | JSON |
GET /work/{id} |
不用 | HTML |
GET /creator/{id} |
不用 | HTML |
几点说明
- 作品搜索:列表接口目前只能按分类、尺寸、版本这些条件筛,还不能按作品名模糊搜索。
- 下载限制:没过审的作品不开放下载。
- 用户资料:用户主页接口只返回用户自己公开的信息和作品,不含隐私数据。
- 文件格式:下载结构和图片地址里的后缀(
.nbt/.mcstructure、.webp/.png等)都由作品实际存的文件决定,调用方指定不了,地址里会带出来。 - 分页:列表类接口的
has_more用「本页条数等于每页条数」来判断,最后一页恰好满页时会误报「还有更多」,翻页时建议同时看实际返回的条数。 - 评论点赞:免登录看评论时,
liked永远是false,因为没人登录就无所谓「我有没有点过赞」。