浏览器直达
直接访问 /ingest 即得网页录入页:与微信 / API 共用同一套指令,明暗主题自适应、移动端友好。带上 ?token= 可免填凭证直接记账:
https://你的域名/ingest?token=tsk_…
?token=本身就是鉴权凭证(等效Authorization: Bearer),页面提交会自动沿用、不写入浏览器本地存储——带 token 的链接注意保密。
请求
POST /ingest
Authorization: Bearer tsk_… # 或省略 header,改用 URL 鉴权 ?token=tsk_…
Content-Type: application/json
| 字段 | 必填 | 说明 |
|---|---|---|
text | ✅ | 指令文本,与使用指南一致(#ai、#日记、/撤销 等) |
client_id | ✅ | 幂等键,见下文 |
通道默认关闭(env
INGEST_ENABLED),未开启时返回 404。
响应
成功返回 { kind, message },kind 与指令对应:
bill-recorded记账完成ai-bill-startedAI 记账已受理,结果稍后可见(也可发/ai 任务编号查询)diary-recorded日记已存档revoked撤销成功
失败返回 HTTP 错误码与 { error }。
幂等
同一 client_id 重复提交不会重复记账,返回幂等命中:
{ "kind": "idempotent", "message": "该请求已处理,未重复记账" }
Node.js 调用(fetch)
Node.js ≥ 18 自带 fetch,无需装依赖。存为 ingest.mjs:
// 用法:INGEST_TOKEN=tsk_… node ingest.mjs "午饭 25"
// 可选:INGEST_URL=https://你的域名/ingest(缺省用下方地址)
import { randomUUID } from 'node:crypto';
const url = process.env.INGEST_URL ?? 'https://你的域名/ingest';
const text = process.argv[2] ?? '午饭 25';
const res = await fetch(url, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.INGEST_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text, // 指令文本:#ai、#日记、/撤销 均适用
client_id: randomUUID(), // 每次提交取新值;超时重发沿用旧值即可避免重复记账
}),
});
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new Error(`HTTP ${res.status}: ${data.error ?? res.statusText}`);
console.log(data.message);
client_id 也可以是你自己的业务键(如订单号、任务 ID)——同键重复提交即幂等命中,天然适合脚本重试。
iOS 快捷指令
「快捷指令」三步即可:
- 输入:接收记账文本
- 获取 URL 内容
https://你的域名/ingest:方法 POST,请求头Authorization: Bearer tsk_…,请求体{ "text": "文本", "client_id": "唯一值" }client_id每次提交取新值(如当前时间戳);超时重发沿用旧值即可避免重复记账
- 显示通知:取返回的
message即可