English | 简体中文
Important
中文文档可能落后于英文文档,如果有问题请先查看英文文档。
Trilium Note的ETAPI的Python客户端。
- 🐍 trilium-py
python3 -m pip install trilium-py --user
以下是Trilium的ETAPI提供的基本功能。下面是一些使用这个包的简单示例代码。
如果你有一个ETAPI令牌,请将 server_url
和 token
更改为你自己的。
from trilium_py.client import ETAPI
server_url = 'http://localhost:8080'
token = 'YOUR_TOKEN'
ea = ETAPI(server_url, token)
如果你还没有创建ETAPI令牌,你可以使用密码创建一个。请注意,你只能看到这个令牌一次,请保存它以便重用。
from trilium_py.client import ETAPI
server_url = 'http://localhost:8080'
password = '1234'
ea = ETAPI(server_url)
token = ea.login(password)
print(token)
初始化后,就可以使用Python使用Trilium的ETAPI了。以下是一些示例。
首先,你可以获取应用程序的信息。
print(ea.app_info())
可以输出服务器应用程序的版本等信息。
使用关键字搜索笔记。
res = ea.search_note(
search="python",
)
for x in res['results']:
print(x['noteId'], x['title'])
使用正则表达式进行搜索。例如,搜索并获取特定笔记下的所有子笔记:
res = ea.search_note(
# 通过笔记标题进行正则表达式搜索
search="note.title %= '.*'",
ancestorNoteId="父笔记ID",
fastSearch=False,
orderBy=["title"],
limit=100,
)
注意: limit
必须配合 orderBy
一起使用
你可以像这样创建一个简单的笔记。
res = ea.create_note(
parentNoteId="root",
title="笔记标题",
type="text",
content="笔记内容",
noteId="note1"
)
noteId
不是必需的,如果没有提供,Trilium会生成一个随机的。返回信息里可以看到这个noteId的值。
noteId = res['note']['noteId']
图像笔记是一种特殊类型的笔记。你可以使用最少的信息创建一个图像笔记,如下所示。image_file
是图片的路径。
res = ea.create_image_note(
parentNoteId="root",
title="Image note 1",
image_file="shield.png",
)
检索笔记的内容。
ea.get_note_content("noteid")
你可以通过笔记的ID获取笔记的元数据。
ea.get_note(note_id)
更新笔记内容
ea.update_note_content("noteid", "由Python更新")
修改笔记标题
ea.patch_note(
noteId="noteid",
title="Python客户端修改",
)
通过笔记ID删除一个笔记。
ea.delete_note("noteid")
你可以使用 get_day_note
获取特定日期的内容。日期字符串应该采用"%Y-%m-%d"的格式,例如 "2022-02-25"。
ea.get_day_note("2022-02-25")
然后使用 set_day_note
设置/更新一个日记。内容应该是一个(HTML)字符串。
ea.set_day_note(date, new_content)
导出笔记有两种格式 html
或 markdown
/md
。
res = ea.export_note(
noteId='sK5fn4T6yZRI',
format='md',
savePath='/home/nate/data/1/test.zip',
)
这个例子将创建一个数据库备份文件,类似于 trilium-data/backup/backup-test.db
。
res = ea.backup("test")
你可以使用Linux中的cron实用程序来安排定期自动备份。例如,要在每天上午3:00进行一次备份,你可以使用以下cron表达式:
0 3 * * * python /path/to/backup-script.py
获取图片标题等。
res = ea.get_attachment('Y5V6pYq6nwXo')
更改图片标题等。
res = ea.update_attachment(
attachmentId='2b7pPzqocS1s', title='你好ETAPI', role='image', mime='image/png'
)
获取真实的图片文件。
res = ea.get_attachment_content('icpDE4orQxlI')
with open('1.png', 'wb') as f:
f.write(res)
用新的图片替换旧的。
res = ea.update_attachment_content('icWqV6zFtE0V', '/home/nate/data/1.png')
上传一个图片文件作为笔记的附件。
res = ea.create_attachment(
ownerId='8m8luXym5LxT',
file_path='/home/nate/data/ksnip_20230630-103509.png',
)
借助Python的强大功能,我已经扩展了ETAPI的基本用法。现在你可以对待办事项列表做一些事情了。
你可以使用 add_todo
来添加一个TODO项,参数是TODO的描述。
ea.add_todo("买暖宝宝")
参数是TODO项的索引。
ea.todo_check(0)
ea.todo_uncheck(1)
使用 update_todo
来更新某个索引处的TODO项描述。
ea.update_todo(0, "去码头整点薯条")
通过索引删除TODO项。
ea.delete_todo(1)
如标题所示,你可以将昨天未完成的事情移到今天。未完成的待办事项将从昨天的笔记中删除。
ea.move_yesterday_unfinished_todo_to_today()
现在你可以将带有图片的Markdown文件导入Trilium了!trilium-py将帮助你上传图片并为你修复链接!
res = ea.upload_md_file(
parentNoteId="root",
file="./md-demo/manjaro 修改caps lock.md",
)
你可以上传一个包含许多Markdown文件的文件夹到Trilium并保留文件夹结构!
比如,上传所有来自VNote的笔记,只需执行以下操作:
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="~/data/vnotebook/",
ignoreFolder=['vx_notebook', 'vx_recycle_bin', 'vx_images', '_v_images'],
)
Joplin可以轻松导入。
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="/home/nate/data/joplin_data/",
ignoreFolder=['_resources', ],
)
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="/home/nate/data/logseq_data/",
ignoreFolder=['assets', 'logseq'],
)
Obsidian有一个非常独特的文件链接系统。你应该使用obsidian-export将Obsidian vault转换为常规的Markdown文件。然后再使用trilium-py将笔记导入Trilium。
首先进行转换。
obsidian-export /path/to/your/vault /out
然后像导入普通markdown一样导入,trilium-py会为你处理图片。
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="E:/data/out",
)
有道云笔记不再提供导出功能。不过好在你可以使用https://github.com/DeppWang/youdaonote-pull下载你的笔记并将其转换为Markdown文件。之后,trilium-py应该能够帮助你导入它们。
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="/home/nate/gitRepo/youdaonote-pull/out/",
)
你需要首先将Turtl从json转换为markdown。 详见 turtl-to-markdown。
然后你可以像这样使用trilium-py导入:
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="/home/nate/gitRepo/turtl-to-markdown/out/",
ignoreFolder=['_resources'],
)
一般来说,markdown文件有各种标准。你可以尝试使用以下方法导入它们
res = ea.upload_md_folder(
parentNoteId="root",
mdFolder="/home/nate/data/your_markdown_files/",
)
如果有任何问题,请随时创建一个issue。
由于Trilium使用的库的限制,导入的笔记可能会遇到轻微的格式问题。这些问题包括代码块末尾出现额外的一行,图像与笔记内容融为一体,标题之间缺少换行符,导致笔记内容显得拥挤。
以下是你可以用来美化你的笔记的方法。
指定笔记ID以美化笔记内容。
ea.beautify_note('krm8B9JthNfi')
ea.beautify_sub_notes('tlPuzU2szLJh')
按照标题名称对笔记进行排序。这个功能对包含大量列表的笔记非常有价值,比如按各种流派排序的书名列表。它同样适用于管理浏览器书签或收集链接。
此外,你还可以为排序指定一个语言代码,以根据你的本地语言进行排序。这可以增强排序过程并使其适应你的语言偏好。
res = ea.sort_note_content('lPxtkknjR2bJ')
res = ea.sort_note_content('y6hROhWjNmHQ', 'zh_CN.UTF-8')
##(高级用法)🧹 删除空的“新笔记”
有时,我无意中创建了大量的“新笔记”,而这些笔记在我的笔记树中仍未被删除。这些“新笔记”使我的工作区杂乱不堪,散落在各个地方。我开发了这个批量删除空的“新笔记”的功能。此外,它会为包含内容的“新笔记”生成警告消息,也许我们应该为这些笔记更改标题。
ea.delete_empty_note()
尝试使用PIL的优化功能来减少图片大小。如果你笔记中的图片没有压缩过,可以试试这个方法。 在执行这个过程后,我成功地将一个44MB的笔记转换为9.9MB。尝试之前请备份数据。
默认质量设置为90。
optimize_image_attachments
会保留原始图像格式并尝试压缩它。
ea.optimize_image_attachments('uMJt0Ajr1CuC')
为了进一步节省空间,可以尝试以下方法。
optimize_image_attachments_to_webp
函数将图像转换为 WebP
格式,显著减少文件大小。根据我的经验,WebP
图像的大小可能只有 PNG
图像的25%到50%。
ea.optimize_image_attachments_to_webp('H2q3901uFDCH')
如果你有很多剪辑的页面,这个操作可以节省大量空间。发明 WebP
的人真是个天才。
此功能可以在笔记中自动创建内部链接。以下是使用示例:
这是一个示例笔记:
执行以下代码后:
auto_create_internal_link('put_note_id_here')
笔记变成这样:
可以看到,部分文本已被替换为内部链接。该功能遵循以下规则:
- 标题匹配:与其他笔记标题匹配的内容会被替换为内部链接。
- 重复标题忽略:如果存在多个笔记使用相同标题,则不会为该标题创建链接。
- 优先匹配较长标题:较长的标题优先。例如,在上面的示例中,
Nate River
被链接,而不是River
。 - 现有链接保留:文本中已有的链接不会被修改。
然而,在示例中,像 "make" 和 "work" 这样的词属于我的笔记《我不认识的英语单词》。由于这些词短且常用,我不希望它们频繁生成内部链接。
如果需要排除某些笔记的链接:
- 给这些笔记添加标签
#ignoreAutoInternalLink
,这些笔记(及其子笔记)将在创建内部链接时被忽略。 - 你可以设置为可继承的:为父笔记添加这个标签并设置为可继承的,其所有子笔记也会被自动排除。
应用排除规则后,效果如下:
结果更加简洁美观。
当多个笔记共享相同标题时,以下情况可以生成内部链接:
- 直接子笔记优先:直接子笔记的优先级高于其他拥有相同标题的笔记。
例如:
在此例中,笔记 TriliumNext
会将 "How to compile" 链接到自己的子笔记,而不是 Trilium
的同名笔记。
笔记不会创建指向自身的内部链接。
为特定笔记添加内部链接(通过笔记 ID):
auto_create_internal_link('gLmmsIM8yPqx')
为多个笔记添加内部链接:
auto_create_internal_link(target_notes=['gLmmsIM8yPqx', 'T4Ui3wNByO03'])
(实验性功能 - 谨慎使用)
为所有文本笔记添加内部链接:
这是一个实验性功能。在使用前请备份数据库,因为此操作可能会不可逆地修改您的笔记。如果使用后发现问题,请提供一个最小化的笔记样本以便调试。
auto_create_internal_link(process_all_notes=True)
使用pip egg link进行安装,以便在不重新安装的情况下进行包更改。
python -m pip install --user -e .
原始OpenAPI文档在这里。你可以使用swagger editor打开它。