基于墨问开放 API 的 Obsidian 插件开发
[!quote] 一言 不茶不饭,不言不语,一味供他憔悴。 —— 《鹊桥仙·说盟说誓》 · 蜀妓
背景
虽然不是墨问社区的第一个 Obsidian 插件,但是因为自己也是 Obsidian 和墨问的用户,并且自己确实经常需要将墨问上的笔记同步到墨问上去,因此有一个墨问的 Obsidian 插件就成了一个强需求,现在墨问开放了 OpenAPI,那么自己制作一个 Obsidian 的插件也就成了必然。
基于当前墨问开放的三个笔记接口,分别是创建、修改和隐私设置,插件的功能也相应实现了笔记的发布和修改,已经隐私设置的功能,先看一下整体的发布页面如下所示

发布页面看上去还是很清晰的,支持了当前墨问开放的三个接口,下面聊一下具体的实现方案。
使用 cursor 生成代码
看到社区冯威老哥的文章,参考文章里面的提示词,输入给 cursor,cursor 瞬间就帮我们生成了整个插件项目的基础代码。
提示词:
我现在要开发一个obsidian插件,这个插件的作用如下:1、选择一段文本,点击右键,点击publish to mowen ,可以弹出界面让我输入标题和tag,确定后调用api发布到墨问笔记;2、点击右上角三个点,在展开的菜单中点击 publish to mowen 可以将当前文章发布到墨问笔记,弹出的窗口中自动带出当前文章的标题,可以允许修改。 墨问笔记创建的接口文档地址如下: https://mowen.apifox.cn/295621359e0
发布笔记
这段提示词只生成了发布笔记的相关代码,还不太符合我上面的诉求,不能修改笔记和设置笔记的隐私属性。另外我自己的 Obsidian 笔记是基于 markdown 语法写的,直接发布到墨问不太美观,并且在笔记开头还有很多 frontmatter 属性。所以还需要将 markdown 的语法映射成墨问笔记的 NoteAtom 结构,直接交给 AI 来帮我们处理。

最终生成了一个函数,虽然还不是很完美,但是勉强能用。同时让 AI 给我们生成了一个从 YAML 中解析 Obsidian tag 的函数,这样就可以自动将 Obsidian 笔记的 tag 映射到墨问笔记的 tag 中。

修改笔记
接着我们让 cursor 帮我们把接口升级,支持修改笔记,笔记发布成功后会有 noteId 返回,我们在发布成功后将 noteId 写入到文章的 YAML 区块中,后续修改的时候根据 YAML 中是否有 noteId 字段来决定我们是创建还是修改。

Cursor 帮我们生成了下面的代码,直接可以使用。

发布之前我们从 YAML 中提取noteId 属性,如果为 null 表示是新创建笔记,如果不为空则表示是修改笔记。

隐私设置
在继续给 cursor 提示词,让它帮我们升级接口支持隐私设置
在当前项目中实现笔记设置功能,接口文档参考 https://mowen.apifox.cn/298137640e0

允许评论的字段似乎不太正确,文档中定义的是隐私设置类型,在 section 为 1 的情况下可以设置笔记的隐私类型,分别为 public,private 和 rule 规则,在 rule 的情况下可以设置是否允许分享以及需要公开的过期时间,请按照这个规则重新生成代码 。
cursor 会根据我们的提示,自动生成相关的代码也会修改现有的接口代码,再进行适当的调试和修改,就实现了我们的需求。
最后
墨问的 OpenAPI 目前还不支持图片,以及一些引号样式,不过对于普通的笔记已经够用了,后续如果有增强在继续进行适配。
项目的原始代码已经开源,地址为:Obsidian-mowen-plugin。
在使用 cursor 的过程中因为是免费用户,虽然自动提示有数量限制,但是整体的使用体验还是很不错的。期间也尝试过使用阿里最新出的 Lingma,但是说实话,效果跟 cursor 还是有一定的差距的。Lingma 用起来有一点卡顿,模型的输出内容往往跟实际需要的东西有一定的差异,不像 cursor 生成的内容基本符合要求。
简单来说就是 cursor 会想你所想,尽量一步到位;Lingma 需要一步步调教引导才能达到预期效果。
最后我尝试让 cursor 基于已经完成的项目来生成一个提示词,帮我们创建插件的示例代码和框架,它给出的完成提示词如下,感兴趣的小伙伴可以用这个 AI 帮我们生成的提示词去尝试一下效果。
你是一个 Obsidian 插件开发专家。请帮我实现一个 Obsidian 插件,要求如下:
1. 插件名称:Obsidian-mowen-plugin
2. 主要功能:
- 支持将当前笔记或选中文本一键发布到墨问(mowen)平台。
- 支持发布时弹窗输入标题、标签、自动发布选项。
- 支持设置笔记隐私(section=1 时可选 public/private/rule,rule 时可设置是否允许分享和过期时间)。
- 支持自动在 YAML frontmatter 写入/更新 noteId,后续发布时根据 noteId 决定是创建还是更新。
- 支持 API-KEY 配置。
1. 界面与交互:
- 右键菜单可选中内容发布,文章菜单可整篇发布。
- 弹窗可输入/修改标题、标签、自动发布、隐私类型、允许分享、过期时间(日期选择器,转为秒级时间戳)。
- 标签自动补充 Obsidian。
1. API 交互:
- 创建/更新笔记接口、设置接口严格遵循墨问OpenAPI文档和笔记设置接口,接口文档地址:https://mowen.apifox.cn/6682121m0。
- 发布成功后自动写入 noteId 到 frontmatter。
1. 代码风格:
- TypeScript,结构清晰,注释详细,易于扩展。
- 关键逻辑(如 frontmatter 处理、API 参数组装、弹窗交互)要有健壮性和用户友好提示。
- 适当使用 async/await,错误处理完善。
请输出完整的 main.ts、api.ts、settings.ts 代码,并给出样式文件 styles.css 的建议内容。
发表评论