本页是给 AI(或任何程序)使用的写入接口规范。人用后台请走 /admin。
所有 /api/* 接口都需要 API Key,两种传法任选其一:
X-API-Key: 你的密钥?api_key=你的密钥密钥错误返回 401 {"ok": false, "error": "..."}。
| 方法 + 路径 | 用途 | 说明 |
|---|---|---|
GET /api/notes | 列出所有笔记的元数据 | 不含正文;返回 count(现有条数)和 next_order(下一个排序值),用于判断序号 |
GET /api/notes/<id> | 取一条完整笔记 | 含正文 content,可参考已有笔记的写法风格 |
POST /api/notes | 新增笔记(AI 最常用) | 成功返回 201 + 新笔记(含 id) |
PUT /api/notes/<id> 或 PATCH | 修改笔记 | 只传要改的字段即可(部分更新) |
DELETE /api/notes/<id> | 删除笔记 | 不可恢复,慎用 |
GET /api/style | 正文的样式类速查(JSON) | content 字段该用什么 HTML 结构,一查便知 |
GET /api/export | 导出完整静态 HTML 备份 | 返回和旧版 Unity学习笔记.html 同构的单文件 |
| 字段 | 必填 | 说明 |
|---|---|---|
title | 必填 | 目录短标题,纯文本(≤200字,写HTML会被去除),例:"广播与订阅事件机制原理"。带圈序号(⑦ 等)由系统自动加,不要自己写序号 |
question | 可选 | 提问原文,纯文本(≤500字),鼠标悬停目录标题时显示;不填则用 title |
date | 可选 | 记录日期 YYYY-MM-DD(严格校验格式);不填默认服务器当天 |
ord | 可选 | 排序值(整数,越小越靠前);不填默认追加到最后(即 next_order) |
content | 建议必填 | 正文,自定义标签 DSL(见下节),提交时自动转换为安全 HTML |
curl -X POST "http://服务器地址:端口/api/notes" \
-H "X-API-Key: 你的密钥" \
-H "Content-Type: application/json" \
-d '{
"title": "广播与订阅事件机制原理",
"question": "这个项目中,广播事件,订阅事件机制原理是什么?举例说明",
"content": "<ctx><t>前情提要:</t>来自 FPS 项目</ctx><h3>一、原理</h3><warnbox>坑:…</warnbox>"
}'
import requests
requests.post(
"http://服务器地址:端口/api/notes",
headers={"X-API-Key": "你的密钥"},
json={
"title": "广播与订阅事件机制原理",
"question": "这个项目中,广播事件,订阅事件机制原理是什么?",
"content": "<ctx><t>前情提要:</t>…</ctx><h3>一、原理</h3>",
},
)
{
"ok": true,
"note": {
"id": 8, "ord": 8, "title": "广播与订阅事件机制原理",
"question": "这个项目中,广播事件,订阅事件机制原理是什么?",
"date": "2026-09-15",
"content": "<div class='ctx'><span class='t'>前情提要:</span>…</div>…"
}
}
正文不写原生 HTML(写了也会被白名单过滤),改用下面的自定义标签,提交时系统自动转换:
| 你写的标签 | 渲染效果 |
|---|---|
<ctx>…</ctx> | 蓝色前情提要框(开头放 <t>前情提要:</t> 蓝色加粗前缀) |
<law>…</law> | 金色口诀/铁律框 |
<warnbox>…</warnbox> | 红色警告/坑框 |
<tipbox>…</tipbox> | 绿色建议/小结框 |
<flow>…</flow> | 浅色流程图/伪代码块 |
<codeblock>…</codeblock> | 深色代码块;内用 <k>关键字</k> <c>注释</c> <s>字符串</s> <m>方法</m> <t>类型</t> <hl>高亮</hl> 着色;代码里显示尖括号要写 < > |
<ok>…</ok> <bad>…</bad> <star>…</star> | 绿/红/金着色强调(行内,或表格单元格内) |
h3 / h4 / p / ul / ol / li / b / strong / i / em / br | 分节标题、段落、列表、加粗、换行(可直接使用) |
table / thead / tbody / tr / th / td | 表格(可直接使用);th/td 可写 style="width:30%" 调列宽(仅允许列宽样式) |
<code>…</code> | 行内代码 |
<ctx><t>前情提要:</t>来自 FPS Microgame 项目</ctx> <law>一句话原理:事件就是一张方法订阅名单</law> <h3>一、原理</h3> <p>正文段落,<b>加粗</b>,行内代码 <code>Invoke()</code>。</p> <table><thead><tr><th>写法</th><th>含义</th></tr></thead> <tbody><tr><td class="ok">+=</td><td>订阅</td></tr></tbody></table> <flow>子弹命中 → 扣血 → 广播 OnDamaged → 火花特效</flow> <codeblock><k>public</k> UnityAction OnDie; <c>// 广播名单</c></codeblock> <warnbox>坑:订阅代码别写进 Update,会重复注册!</warnbox> <tipbox>小结:发布方和订阅方互不认识,靠名单传话。</tipbox>
script / style / img / a / form / iframe 等白名单之外的标签连同内容一起被丢弃;onclick 等事件属性、javascript: 链接、未知 class 一律剥离——想注入 JS 也没用,写什么都只会变成无害文本。GET /api/notes → 看现有条数 count 和 next_order,确认新笔记该排第几;GET /api/style 或 GET /api/notes/<某条id> → 校准写作风格;POST /api/notes 写入;GET /api/notes 复查确认成功。| 状态码 | 含义 |
|---|---|
| 200 / 201 | 成功(新增返回 201,其余 200) |
| 400 | 请求体不是 JSON / title 缺失或为空 / date 格式不对 / ord 非整数 |
| 401 | API Key 缺失或错误 |
| 404 | 笔记 id 不存在 |
| 429 | 认证失败次数过多被临时锁定(1 分钟内失败超 10 次锁 2 分钟,正常调用不会触发) |