HTTP API 使用指南

macOS · Premium · 更新于 2026-09-17

让本机脚本按 Key 读取当前保险库中的 Secret 文本或文件。HTTP API 是 macOS Premium 功能;iOS 和 Android 可以创建、查看 Secret,但不提供 API 服务。

Base URLhttps://127.0.0.1:49443

1. 开始使用

  1. 解锁 LockMemo,等待首次同步完成。在 Memos 中添加一个 Secret,设置 Key = demo.api-key、文本 Value 为 example-value。Key 在当前保险库的所有 Secret 中必须唯一,区分大小写。
  2. 打开 Settings → Sync → HTTP API。复制 Access token,然后点击 Start access
  3. 首次启动后,打开右上角 ⋮ → Client configuration,点击 Export public CA,把证书保存为下载目录中的 lockmemo-local-ca.pem。如果使用其他路径,请修改下方范例。
  4. 在同一台 Mac 的终端运行下方命令。下面先用 pbpaste 读取刚复制的 Token,不需要把 Token 直接写进命令历史。
LOCKMEMO_CA="$HOME/Downloads/lockmemo-local-ca.pem"
LOCKMEMO_TOKEN="$(pbpaste)"

这里是 HTTPS,需要信任 App 导出的本机 CA。范例使用 --cacert 校验证书,无需把 CA 安装到系统信任列表,也不要用 -k 跳过校验。

2. cURL 范例

检查服务状态

curl --noproxy '*' --http1.1 --silent --show-error --fail \
  --cacert "$LOCKMEMO_CA" \
  https://127.0.0.1:49443/v1/status
{"service":"lockmemo","apiVersion":1,"state":"active"}

此接口不需要 Token,也不会返回 Secret。服务停止后通常无法连接,而不是返回状态 JSON。

读取文本

printf 'Authorization: Bearer %s\n' "$LOCKMEMO_TOKEN" |
  curl --noproxy '*' --http1.1 --silent --show-error --fail \
    --cacert "$LOCKMEMO_CA" \
    --header @- \
    --header 'Content-Type: application/json' \
    --data-binary '{"key":"demo.api-key"}' \
    https://127.0.0.1:49443/v1/resolve

成功响应是 example-value 的原始 UTF-8 字节,没有 JSON 包装,也不会额外添加换行。--header @- 从标准输入读取 Authorization 头。

读取文件

在 Secret 中再添加 demo.config,点击回形针选择一个测试 JSON 文件。下面命令会写入或覆盖当前目录的 demo-config.json;请使用专门的测试目录。

umask 077
printf 'Authorization: Bearer %s\n' "$LOCKMEMO_TOKEN" |
  curl --noproxy '*' --http1.1 --silent --show-error --fail \
    --cacert "$LOCKMEMO_CA" \
    --header @- \
    --header 'Content-Type: application/json' \
    --data-binary '{"key":"demo.config"}' \
    --output ./demo-config.json \
    https://127.0.0.1:49443/v1/resolve

文本和文件使用同一个接口。文件返回原始内容,不是文件名或 Base64;输出文件名由客户端决定。测试完成后清理当前 shell 中的 Token 变量:

unset LOCKMEMO_TOKEN

3. Python 范例

安装 Python 3 后可直接运行以下脚本,无需第三方库。按提示输入或粘贴 Token,输入不会回显。成功内容写到标准输出,也可替换为你自己的业务处理。

import getpass
import json
from pathlib import Path
import ssl
import sys
import urllib.error
import urllib.request

ca_file = Path.home() / "Downloads" / "lockmemo-local-ca.pem"
context = ssl.create_default_context(cafile=str(ca_file))
token = getpass.getpass("LockMemo access token: ")
request = urllib.request.Request(
    "https://127.0.0.1:49443/v1/resolve",
    data=json.dumps({"key": "demo.api-key"}).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    },
    method="POST",
)
# Keep loopback requests direct, even when a proxy is configured.
opener = urllib.request.build_opener(
    urllib.request.ProxyHandler({}),
    urllib.request.HTTPSHandler(context=context),
)
try:
    with opener.open(request, timeout=30) as response:
        sys.stdout.buffer.write(response.read())
except urllib.error.HTTPError as error:
    print(f"HTTP {error.code}: {error.read().decode('utf-8')}", file=sys.stderr)
    raise SystemExit(1)
except urllib.error.URLError:
    print("Check LockMemo access, the local CA file, and the endpoint.", file=sys.stderr)
    raise SystemExit(1)

4. 接口约定

接口用途
GET /v1/status读取服务状态,无需认证。
POST /v1/resolve以 Bearer Token 认证,提交 {"key":"demo.api-key"}

5. Token 与启停

6. 常见问题

结果处理方法
400 · invalid_request检查方法、路径、JSON 和 Content-Type;只提交一个 key 字段。
401 · invalid_tokenToken 缺失、格式错误或已失效;重新复制当前 Token,注意 Bearer 后面的空格。
404 · secret_not_available检查 Key 大小写及条目是否存在于当前保险库。
423 · access_inactive解锁正确的保险库、等待同步完成,并点击 Start access。
429 · rate_limited减少频率或并发,稍后重试。
500 · resolution_failed等待同步或编辑完成后重试;若持续发生,检查重复 Key、缺失附件或保险库数据一致性。

无法连接:先确认 App 已启动、已解锁,HTTP API 显示运行中,且端口 49443 没有被其他程序占用。锁定、写入暂停或连接限制也可能直接关闭连接,而不返回 JSON 错误。证书错误:使用此 Mac 当前导出的 CA,保留 HTTPS 校验。

← 返回 LockMemo