如何用 Python 启动并打开 Obsidian 笔记
什么是 Obsidian 链接
Obsidian 支持自定义的 URI 协议,obsidian://
,在安装了 Obsidian 的电脑上会自动注册相应的处理程序。
获取 Obsidian 链接
每个笔记都有一个对应的链接:
大概长这样:
obsidian://open?vault=%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0&file=Notes%2F%E5%A6%82%E4%BD%95%E7%94%A8%20Python%20%E5%90%AF%E5%8A%A8%E5%B9%B6%E6%89%93%E5%BC%80%20Obsidian%20%E7%AC%94%E8%AE%B0
如何使用
可以像对待 HTTP 链接那样在 Markdown 中使用它,例如:
[打开笔记](obsidian://open?vault=%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0&file=Notes%2F%E5%A6%82%E4%BD%95%E7%94%A8%20Python%20%E5%90%AF%E5%8A%A8%E5%B9%B6%E6%89%93%E5%BC%80%20Obsidian%20%E7%AC%94%E8%AE%B0)
如果在 Obsidian 笔记内插入这个链接,点击将直接跳转到对应的笔记。
当然,这个功能主要是为了在 Obsidian 应用程序之外使用。
既然是 URL 链接,想当然地将它复制到浏览器的地址栏里,会有如下提示:
点击「打开 Obsidian」即可。
但是,其实可以不用经过浏览器,直接使用 Win+R
,然后把链接贴进去运行就可以了:
注意,虽然复制出来的链接是经过编码处理的,其实没有空格或特殊字符的情况下,直接使用中文是没有问题的。
如何在 Python 中使用
在 Python 代码中也可以借助于浏览器:
import webbrowser
url = 'obsidian://open?vault=%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0&file=Notes%2F%E5%A6%82%E4%BD%95%E7%94%A8%20Python%20%E5%90%AF%E5%8A%A8%E5%B9%B6%E6%89%93%E5%BC%80%20Obsidian%20%E7%AC%94%E8%AE%B0'
webbrowser.open(url)
或者直接运行:
import os
url = 'obsidian://open?vault=工作笔记'
os.startfile(url)
解码和编码
可以看到,这个 URL 中包含了 %2F
这样的特殊字符,这是编码后的结果。
在 Python 中如何编码:
>>> from urllib.parse import quote
>>> quote('笔记')
'%E7%AC%94%E8%AE%B0'
如何解析和解码:
>>> from urllib.parse import urlparse, parse_qs, parse_qsl
>>> parsed_url = urlparse(ob_url) # 解析整个 URL
>>> parsed_url
ParseResult(scheme='obsidian', netloc='open', path='', params='', query='vault=%E5%B7%A5%E4%BD%9C%E7%AC%94%E8%AE%B0&file=Notes%2F%E5%A6%82%E4%BD%95%E7%94%A8%20Python%20%E5%90%AF%E5%8A%A8%E5%B9%B6%E6%89%93%E5%BC%80%20Obsidian%20%E7%AC%94%E8%AE%B0', fragment='')
>>> parse_qs(parsed_url.query) # 解析其中的参数,结果是字典
{'vault': ['工作笔记'], 'file': ['Notes/如何用 Python 启动并打开 Obsidian 笔记']}
>>> parse_qsl(parsed_url.query) # 解析其中的参数,结果是列表
[('vault', '工作笔记'), ('file', 'Notes/如何用 Python 启动并打开 Obsidian 笔记')]
查询参数有两种解析方法,第一种结果是字典,其中的值是一个列表,这是因为在 URL 中一个参数可以有多个值。确定不会有多个值的情况下,使用后者返回的列表可以更方便的得到字典。
拼接 URL 并打开
例如打开我当前的这篇笔记:
import os
from urllib.parse import quote
vault = quote('工作笔记')
note = quote('如何用 Python 启动并打开 Obsidian 笔记')
url = f'obsidian://open?vault={vault}&file={note}'
os.startfile(url)
注意到这里的
vault
只需要有名字即可,不需要给出完整路径。Obsidian 将打开过的笔记库在系统配置中有记录。
根据 Obsidian 文档的说明,还可以实现新建笔记的操作:
使用 new
动作替代上面的 open
,可能用到的参数:
vault
既可以是库名称,也可以是库 ID,这和open
动作里一样。name
用于指定创建的笔记名称。新笔记的存放位置受设置中新建笔记的存放位置
选项控制。file
通过基于库的绝对路径来创建笔记。这将覆盖name
的设置。path
通过全局的绝对路径来创建笔记,这和open
动作中的一样。该参数将覆盖vault
和file
的设置。content
指定新笔记中的内容,该参数非必须。silent
如果你不想打开新笔记,则设置此参数。
import os
from urllib.parse import quote
name = '如何通过 Python 新建 Obsidian 笔记'
content = """
参考:[[如何用 Python 启动并打开 Obsidian 笔记]]
"""
url = f'obsidian://new?vault={vault}&name={quote(name)}&content={quote(content)}'
os.startfile(url)
🚀,笔记瞬间就创建好了😀:
可能的使用场景
场景一:
在 Obsidian 中可以通过模板来生成笔记,但是模板的语法不够灵活。如果对 Python 很熟悉的话,则可以用此方法新建笔记(当然,要能提供一个可以快捷调用的入口才行)。
场景二:
将 Python 爬虫爬取到的内容存到笔记中,做一个一键摘录之类的东东。
当然,如果只是想要注入内容,由于 Obsidian 的笔记就是纯粹的 Markdown 文件,其实直接创建文件也是可以的。只是通过 Obsidian URI 的方式可以直接唤醒 APP,体验上会好一点。