如何用 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 uri

当然,这个功能主要是为了在 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,体验上会好一点。

Davy
Davy
学习📚 技术👨‍💻 投资📈

一些心得体会,希望能对你有所帮助🚀。