# 鼓捣星球 · 提交作品的官方接口 ## 排行榜与徽章(2026-09-06) GET /api/rank?scope=week|all GET /api/achievements?name= 两个接口都公开可读,统计缓存 60 秒。排行榜页面 /rank.html;个人页 /me.html#badges。 排行榜回 {ok,since,boards:{play_dur,days,comments,works}},每个榜最多 20 行, 每行只有 {name,avatar,value}。play_dur 单位是秒,其余依次是天、条、件。 有效登录凭据放 X-Uid 请求头时,另有 me:{play_dur:{rank,value},days:{rank,value}, comments:{rank,value},works:{rank,value}};未登录或凭据无效不回 me。 scope 不合法按 week;本周按北京时间周一开始,总榜从 2026-09-06 开始。 被禁言、管理员、站长及已注销成员不参榜;每人每天时长最多计 24 小时。 徽章口回 {ok,name,avatar,got:[{key,title,ts}],next:[{key,title,progress}]}。 got.ts 是可推得的获得事件 Unix 秒;没有可靠时间则为 null,不编造获得时间。 next.progress 是“还差多少”的文字。12 枚徽章由服务端固定定义, “被站长鼓励过”“单词王赢 10 场”暂显示“即将开放”;不存在的昵称回 404。 以上两个接口不回 uid、手机号、设备或 IP;不要把登录凭据写进 URL。 ## 提交作品 做完作品直接 POST 到这里就行。**不用装任何东西。** > 嫌麻烦的话,有个现成的 skill 把下面这些都包好了(离线自检 + 打包 + 投稿): > https://github.com/zhulielie/gudao-submit-skill > 装上之后跟 AI 说「帮我发到鼓捣星球」就行。**装不装都一样能投**, > 下面这份接口说明永远是准的 —— 那个 skill 也是照它写的。 POST https://gudao.games/api/submit Content-Type: application/json X-Submit-Token: <一次性投稿口令> 平台规矩在 https://gudao.games/kit.txt —— 做之前先读那一份。 ## 请求体 { "title": "作品名字", 必填,最多 24 字 "html": "", 单文件走这个 "zip": "", 多文件走这个(和 html 二选一) "ai": "用了哪个 AI", 可选,最多 30 字 "notes": "作品简介", 可选,最多 500 字。**过审后公开显示** "mobile": true/false 手机上真能玩就 true;玩不了别写 true "pad": "wasd", 可选,手机虚拟按钮用哪套键位;只用点按的作品填 "tap",别的填 "" "fit": "fixed", 可选,画面固定 16:9;铺满屏幕写 "fill" "scary": "yes" 或 "no" **必填**,见下 "cover": "", 可选,作品封面。不交就用默认卡带图 "parent": "要更新的作品编号", 可选。带了就是「某件的新版」,不是新作品 "allow_remix": true/false 可选,默认 true。愿不愿意让别人改编(要写明改自我) "remix_of": "来源作品编号", 可选。改编自站内哪件;编号必须是来源清单里的 } **pad 只认六个值:** "contra" / "wasd" / "baozi" / "dark" / "tap" / ""。 四套分别是 J 攻击 K 跳、Space 动作、Z 跳 X 冲刺、E 互动 F 手电; "tap" 表示点屏幕就是全部操作(比如一键跳的跑酷),手机上平台不出虚拟手柄、 不出摇杆,画面干干净净 —— 触屏操作由作品自己接; 空字符串表示作品只用鼠标或触屏,手机手柄只显示方向摇杆,不会替作者猜成 contra。 **fit 只认 "fixed" 或 "fill":** fixed 保持 1280×720 的 16:9 画面并等比缩放, fill 让作品跟着屏幕宽高铺满。老作品没有 fit 时仍沿用原来的显示方式。 **⚠ scary 是必填的,而且只认 "yes" / "no" 两个值。** 不填、填别的、填 null, 一律退回 400。**没有默认值,这是有意的** ——「不会吓人」是作者作的证, 「没填」是我们不知道,两者差着一条红线。 问的是:**这个作品会不会突然吓人?** 站规是「恐怖不禁,**不打招呼地吓人**才禁」。填 "yes" 不会让你过不了审, 只是玩的人在点进去之前会看到一句提醒。**填错比填 yes 严重得多。** **⚠ notes 是公开的,不是私聊。** 它会原样显示在作品卡片和作品页上, 任何人不登录都看得见(GET /api/submissions 也会返回它)。 这里写玩法、键位、做的时候踩了什么坑 —— 都合适。 **恐怖向提示不用写在这儿了** —— 上面那个 scary 字段专门问这件事, 而它会显示在玩之前看得到的位置。(2026-08-24 之前只能靠作者自己想起来往这儿写, 15 件里只有 3 件想起来了。) **不要**写真名、学校、班级、联系方式,或者任何"只想让我们看到"的话。 ## cover:自己给作品配张封面(可选) 不交**不算问题** —— 不交就用默认那张卡带图,照样能上架。 收 JPG / PNG / WebP (改扩展名没用,服务端看的是文件本身) 最大 2MB 短边 >= 160 像素 (小于这个在卡片上是糊的) 最长边 <= 3000 像素 **总像素 <= 600 万** (注意:3000x3000 两条边都合格,但 900 万像素过不去) 收下后会按画面中央裁成 16:9,再转成 512 / 1024 两档 WebP; 重要的人物和文字别贴着上下边缘,那里可能会被裁掉。 不合格会明确告诉你**是封面的问题、不是作品的问题** —— 看到「封面这张图不行:…」就换张图,或者干脆别交,别回去改游戏。 ## parent:交一件旧作品的新版(可选) "parent": "sub-016" ← 要更新的那件的编号 带了 parent 就不是投新作品,是给那一件交新版: **编号不变**,底下的留言和玩过次数**都留着** 照样进待审队列 —— **我们过审之后才替换**,旧版自动留档 这次不交 cover 的话,原来那张封面继续用 限制:只能更新**你自己的、已经上架的**作品。编号只认小写字母数字和减号。 投稿口令可能带着一件作品的锁。带锁时,请求体里的 parent **必须和锁定的编号完全一致**, 不能省掉 parent 当新作品投,也不能改成另一件;否则接口会返回 4xx, 并明确告诉你「口令只能给 sub-xxx 交新版」。**原来不带作品锁的口令行为不变**。 **更新不是一条绕过审核的路** —— 我们点通过之前,原作品一个字节都不动。 ## 改编:许可与来源 "allow_remix": true, ← 愿不愿意被改编(默认 true) "remix_of": "sub-003", ← 改编自哪件(可不带) **allow_remix 只收 true/false 两个布尔值。** 缺省按 true(老作品都算允许); 字符串 "true"/"false"、数字、null 一律退回 400,**没有「帮你转一下」这回事** —— "false" 是字符串不是布尔,静默转掉等于替作者改了主意。 **remix_of 只认合法来源编号**:规则 `[a-z0-9-]{1,64}`,且必须在 GET /api/remix-sources 的清单里 —— 已上架的站内投稿和通过核验的库作品, 隐藏、待审、被下架的都不算。缺省、空字符串或不带,就是原创投稿; **不在清单里的编号直接 400,不会静默忽略** —— 网页表单和这个接口共用这套口径。 **带 parent(新版)的请求不要带这两个字段**:新版的改编许可和来源沿用原作品, 服务端合并时保留原作品当前值;带了冲突值退回 400。 **allow_remix=false 不是禁令,是作者的心意。** 作品页会标出来;别的投稿 **仍然可以**把它标为来源(remix_of 照常有效)—— 署名义务不因「不愿意」消失。 **改编别人,要做两件事:写明改自谁(remix_of),并且真的改了东西。** 只换名字、只挪素材不算改编,审核会退。 ### 来源清单与本人改许可 GET /api/remix-sources 公开。回 {ok,items:[{id,title,allow_remix}]}, items 已由服务端过滤,网页和投稿校验共用这一份。 POST /api/me/remix {"id":"sub-003","allow_remix":false} 改自己作品的改编许可。身份只认请求头 X-Uid, 不接受放进 URL 或请求体。 成功回 {ok:true,id,allow_remix};没登录 403 (和「不是本人的作品」同码,两样都回 403); 编号不存在 404; 更新申请或已并入的记录 400;allow_remix 非布尔 400。 ## 投稿前需绑定手机号 **账号没绑定手机号,投不了稿**(未成年人请用家长的)—— 这是真实身份核验(公安要求), 先于下面的一切步骤。 孩子在站上登录后打开投稿页 https://gudao.games/submit.html , 没绑定的账号会先看到绑定引导:大人填自己的手机号,未成年人由家长填, 页面上给出同意提示,同意后收验证码、完成绑定。 大人收本人的号,孩子收家长的 · 只用于核验 · 加密存储 · 站内只显示末四位 不展示、不营销、不给第三方 · 注销账号时一起删 已经在站上的成员有 **7 天宽限期**:没绑定只是不能投稿,登录和玩不受影响。 没绑定就 POST /api/submit,会被退回来 —— 先绑定,再重试。 ## 投稿口令从哪来 **孩子自己去拿,不用把账号给你。** 他在站上登录后打开投稿页 https://gudao.games/submit.html ,点「🎟️ 生成投稿口令」, 把那一串复制给你。(账号得先绑定手机号,见上一节,否则这一步走不到。) 一小时内有效 · 只能用一次 · 只能用来投稿 > **2026-09-08 已上线:投稿前要先绑定一次手机号**(未成年人请用家长的; > 公安要求的真实身份核验)。没绑定就调 /api/submit 或 /api/submit-token, > 一律回 403 并带 need_phone:true —— 去 https://gudao.games/me.html 绑一次就行。 > 已经在站上的成员有 7 天宽限期,期内不绑也能投,过期就不行了。 **放进请求头 X-Submit-Token,不要放进 URL、不要放进请求体。** **⚠ 给 AI 的话:这串口令不许写进 title / notes / ai 任何一个字段。** notes 是**过审后公开显示**的,口令落进去等于把凭据贴出去了。 它只属于请求头。 **别再问孩子要「uid / 账号编号」了。** 那是「谁拿到谁就是他」的凭据, 拿到就能替他干任何事;而投稿口令泄了,最多是有人替他投一件作品,还得过人审。 (网页表单自己投那条路不受影响,照旧。) ## 多文件怎么打包 整个作品目录压成一个 zip。**解开后根目录要有 index.html。** 外面多套一层文件夹也行,服务端会自己剥掉。 限制:压缩包 48MB / 解开后 96MB / 800 个文件 / 目录 12 层 / 包里任何单个文件 24MB(引擎构建的 .wasm / .pck / .data 二进制例外:48MB —— Godot/Unity 官方模板 37MB 起步)。膨胀比超过 200 倍会被当成攻击拒掉。 **注意 html 字段那条路不一样:走 "html" 交单个文件的,上限是 8MB。** (比这大就打成 zip 走 "zip" 字段。这两个数字不一样是服务端的实际行为, 不是笔误 —— 单文件那条路是为"一个 html 就是全部"准备的窄门。) 作品可以很大、可以很多文件 —— 站上现在跑着 22 个 js 的、32MB 引擎构建的。 **没有「必须单文件」这回事。** ## 成功 { "ok": true, "id": "sub-012" } **它现在在待审队列里,站上看不见。** 我们在后台点一下才上架 —— 这条对所有人一样。 同时最多 3 个投稿在排队,满了要等审完。 ## 被拒 { "ok": false, "error": "一句人话", "findings": [ { "rule": "不许一 · 不连外部网站", "file": "index.html", "line": 47, "text": "