把 Memos 同步到 Notion。包含:
- Cloudflare Worker webhook(实时处理 memo.created)
- 一次性批量同步脚本(用于历史的 memo)
- 解析 memo 内容并按段落拆分
- 同步附件图片与正文中的 Markdown 图片链接
- 写入 Notion 数据库字段:
Name、Created、Memos ID - 创建事件支持延迟拉取附件,减少外链生成延迟导致的缺图
- Node.js(本地开发与批量同步脚本)
- 可访问的 Memos API
- Notion Integration Token 与目标数据库
-
访问 https://www.notion.so/profile/integrations/internal 创建新集成,复制 token(NOTION_TOKEN)
-
在 notion 中创建数据库 请创建以下字段:(字段名必须一致,否则 worker 会报错找不到对应的字段)
NameCreatedMemos ID
- 地址栏中截图的部分就是需要的 NOTION_DATABASE_ID(数据库 ID)
- 给集成添加数据库权限,可以在集成中添加也可以在数据库页面添加
我用的 Memos 版本是 0.25.3,其他版本可能有不同,请自行查找
- 在设置 - 我的账号 - 访问令牌中 新建一个令牌(MEMOS_API_TOKEN)
- worker 部署之后可以获取到一个地址,把地址填入 设置 - 偏好设置 - Webhooks 中,地址应该类似(xxx.xxx.workers.dev)
Memos 返回的附件 URL 是带签名的 R2 私有链接,签名过期后图片将无法访问。配置 R2 公有域名后,同步时会自动将签名 URL 转换为永久可访问的公网 URL。
转换示例:
# 签名 URL(会过期)
https://memos.xxx.r2.cloudflarestorage.com/assets/file.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=...
# 公网 URL(永久可访问)
https://pub-xxx.r2.dev/assets/file.jpg
- Worker:在环境变量中配置
R2_PUBLIC_DOMAIN(如https://pub-xxx.r2.dev) - 批量同步脚本:直接修改
scripts/bulk-sync.mjs顶部的R2_PUBLIC_DOMAIN常量
如果不配置,图片 URL 将保持原样(带签名的 R2 链接)。
在 Worker 里配置环境变量:
NOTION_TOKENNOTION_DATABASE_IDMEMOS_API_BASE(如https://your-memos.com/api/v1)MEMOS_API_TOKENR2_PUBLIC_DOMAIN(R2 公有域名,如https://pub-xxx.r2.dev,可选)
可以在本地使用 wrangler push NOTION_TOKEN 等命令添加私密环境变量,也可以手动在后台配置
本地开发:
npm run dev部署:
npm run deploy脚本路径:scripts/bulk-sync.mjs。分页拉取 memos,并将 memo 写入 Notion。
使用前需修改脚本顶部的常量:
MEMOS_API_BASE— Memos API 地址MEMOS_API_TOKEN— Memos 访问令牌NOTION_TOKEN— Notion Integration TokenNOTION_DATABASE_ID— Notion 数据库 IDR2_PUBLIC_DOMAIN— R2 公有域名(如https://pub-xxx.r2.dev)
运行:
node scripts/bulk-sync.mjs可选环境变量:
MEMOS_PAGE_SIZE(默认 10)NOTION_DELAY_MS(默认 200)NOTION_UPDATE_EXISTING(设为true时更新已存在页面)
- webhook 创建事件会延迟 10 秒后再拉附件,避免外链生成延迟导致的缺图。
- 如果为了快速测试在脚本中写死 token,请避免提交到 GitHub。
