本地 API
基础信息
| 服务 | 默认端口 | 说明 |
|---|---|---|
| 分享服务 | 8721 | 健康检查、配对、文件下载 |
| API 服务 | 8722 | /api/v1/ 路由前缀 |
鉴权
- 本地请求免鉴权 — Host 为
127.0.0.1/localhost/[::1]时跳过 Bearer 校验 - 远程请求需令牌 —
Authorization: Bearer <api_key>
API Key 在应用「配置中心」查看,为 64 位十六进制随机串。
为什么本地免鉴权
员工本地调用是主要场景,要求每次带令牌会大幅提高上手成本。远程访问才需要鉴权保护。
错误响应
所有错误统一格式:
{
"error": "error_code",
"message": "中文描述"
}
| HTTP | error | 场景 |
|---|---|---|
| 400 | bad_request | 参数错误、文件不存在、base64 解码失败 |
| 401 | auth_failed | 非本地请求且 API Key 无效 |
| 404 | not_found | 分享/队列项不存在 |
健康检查
GET /health
无需鉴权。返回应用信息与配对码。
{
"app": "sidekick-desktop",
"version": "1.0.0.0",
"status": "ok",
"pairing_code": "123456"
}
状态
GET /api/v1/status
{
"version": "1.0.0.0",
"share_port": 8721,
"api_port": 8722,
"share_count": 3,
"hotkey_installed": true,
"hotkey_last_trigger": 1729584000,
"hotkey_last_result": "已发完 2 条,耗时 1700ms",
"foreground_im": "微信 4.x",
"foreground_window": "Qt51514QWindowIcon | 微信 | Weixin"
}
hotkey_* 字段用于诊断快捷键是否触发、发送结果如何。
队列
POST /api/v1/queue
统一入口,通过 type 区分内容类型。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | string | 是 | text / file / base64 / url |
content | string | 视类型 | text=文字, file=本地路径, url=下载地址 |
filename | string | base64 必填 | base64 时的文件名;url 时可用于自定义 |
data_base64 | string | base64 必填 | base64 编码的文件内容 |
label | string | 是 | 显示名 |
group | string | 否 | 分组号,不传归入 default |
type=text
{"type":"text","content":"你好","label":"问候","group":"batch-1"}
type=file(本地文件)
{"type":"file","content":"C:\\Users\\admin\\report.pdf","label":"周报"}
type=base64(浏览器直接传文件)
{"type":"base64","filename":"photo.png","data_base64":"iVBORw0KGgo...","label":"截图"}
type=url(网络文件,自动下载后入队)
{"type":"url","content":"https://example.com/manual.pdf","label":"手册"}
响应:{"id":"0f7e752fb570378f"}
文件名来源
| type | 传 filename | 不传 |
|---|---|---|
url | 用自定义名(非法字符已清洗) | 从 URL 或 Content-Disposition 推断 |
base64 | 用自定义名 | 魔数推断扩展名(file.pdf / file.png) |
file | 不可改 | 本地文件真实名 |
GET /api/v1/queue
[
{
"id": "0f7e752fb570378f",
"kind": "text",
"content": "你好",
"label": "问候",
"group": "default"
}
]
DELETE /api/v1/queue/{id}
移除指定待发送项。
POST /api/v1/queue/send-next
从当前激活分组取队首 → 写剪贴板 → 自动 Ctrl+V。
{"status":"sent","remaining":2}
空队列返回 400。
POST /api/v1/queue/clear
清空当前激活分组的待发送项。
GET /api/v1/queue/groups
["batch-1", "batch-2"]
GET /api/v1/queue/active-group
{"active_group":"batch-1"}
POST /api/v1/queue/active-group
{"group":"batch-2"}
GET /api/v1/queue/sent
已发送列表,支持 ?group=xxx 过滤。
[
{
"id": "a1b2c3d4",
"kind": "text",
"content": "你好",
"label": "问候",
"group": "default",
"sent_at": 1729584000,
"sent_at_readable": "2026-10-22 17:07:11"
}
]
POST /api/v1/queue/restore
| body | 行为 |
|---|---|
{} | 还原全部已发送项 |
{"group":"default"} | 只还原该分组 |
{"id":"a1b2c3d4"} | 只还原指定项 |
响应:{"restored":3}
GET /api/v1/queue/mode · POST /api/v1/queue/mode
{"mode":"auto"}
auto = 一次触发发完整个分组;single = 每次只发一条。
GET /api/v1/queue/timing · POST /api/v1/queue/timing
{
"paste_settle_ms": [250, 700],
"file_settle_ms": [400, 900],
"item_gap_ms": [600, 2600],
"typing_sim": false
}
可设字段:settle_min settle_max file_settle_min file_settle_max gap_min gap_max typing_sim。
分享
GET /api/v1/shares
分享列表。
POST /api/v1/shares
{"path":"C:\\Users\\admin\\Documents"}
DELETE /api/v1/shares/{id}
快传
POST /api/v1/quick-transfer
{"url":"https://example.com/file.zip"}
下载并放入剪贴板。
打印
POST /api/v1/print
{"path":"C:\\test.pdf"}
或网络文件:
{"url":"https://example.com/doc.pdf","printer":"Microsoft Print to PDF"}
传输历史
GET /api/v1/transfers
最近 100 条传输记录。
分享服务端点
以下端点运行在 8721 端口。
GET /s/{token}
授权后展示文件/目录列表与下载入口。
GET /s/{token}/download
下载文件(目录打包为 zip)。
令牌过期返回 410,不存在返回 404。
POST /pair
设备配对,提交配对码。
GET /pairing-code
获取当前配对码。
更新
GET /api/v1/queue/timing 之外的更新端点
更新相关通过 Tauri 命令提供(check_update / download_update / install_update),
因为需要访问应用上下文与本地文件系统。详见更新机制。