Obsidian 发布博客的 N+1 种方法
之前看到有为文章讨论 Obsidian 管理博文。想想方法还挺多的,写下备忘。
概述
我是用的是静态博客生成器 Hugo ,文章实际上就是 markdown 文件。其他 CMS 之类的,大概写一些代码也能使用。
博客 markdown 在 Obsidian 的前提下,Obsidian 管理博文需求,需要解决的问题就是把 markdown 文件交给构建程序,构建之后发布。方法其实挺多的,不过方法也是大同小异。
我在 Obsidian 使用过 Remotely Save 和 RunJS 插件。
- Remotely Save 能将 markdown 文件同步到 S3 对象存储,WebDAV。
- RunJS 运行 JS ,能使用 Obsidian 提供的 API,读写文件,发送 HTTP 请求等等。
下面介绍几个思路和方法。
方法
1. Obsidian + Obsidian Git 插件 + Github Action
使用 Obsidian Git 插件同步到 Github ,然后触发 Github Action 构建。
2. Obsidian + Obsidian Remotely Save 插件 + Github Action
使用 Obsidian Remotely Save 插件同步到私有对象存储,Github Action 运行 Rclone 之类的工具下载,然后部署。
或者同步到对象存储,然后对象存储开启静态网站功能,也就是所有文件可以被公开访问了,Github Action wget 一下所有 markdown 文件就行了。Obsidian markdown 图片链接处理一下,换成 Obsidian 公开库的图片链接就行了。
轻量处理脚本个人使用的是 Lua,比 Bash + jq 使用起来顺手。
这个活 Nushell 看起来也能胜任。 https://www.nushell.sh/zh-CN/
文章太多的话,RunJS 生成个文档列表,只下载最近的文件就行了。
3. Obsidian + Obsidian Remotely Save 插件 + OSS + FC
这里 OSS 和 FC 都是阿里的,阿里云函数计算可以挂载自己家的对象存储 OSS 为硬盘。所以可以这么操作:
- 函数计算挂载 Obsidian 用的对象存储桶。
- 把其余需要的打包,也就是 Hugo + Hugo 博客文件 + Hugo 博客主题之类的。
- 写一个云函数,处理带验证身份的 HTTP 请求。通过后,复制挂载的 OSS 中的,Obsidian 上传的 markdown 文件。
- Hugo 构建网站
- 生成的静态网站上传到另一个开启静态网站功能的存储桶
触发方法,写个 RunJS 脚本 GET 云函数,触发一下就行了。
云函数 + OSS IO 实际上是有一点点慢的,性能够不够用需要测试,整个流程能不能在 HTTP 超时之前完成也需要测试。
4. Obsidian + Obsidian Remotely Save 插件 + WebDAV
原理很简单,Obsidian Remotely Save 插件同步到自己的 WebDAV 服务。写个 Bash 脚本监测文件变化,有变化就触发构建。
构建完成后,如果有公网 IP ,直接用 Nginx 部署静态网站了。没有公网 IP ,用命令行,比如 OSSutil 上传到对象存储就行了。
5. Obsidian + RunJS 插件 + 服务
写 JS ,把最近修改的 markdown 文件都写进一个 JSON 里,然后 POST 到云函数或者自己部署的程序。服务器取出 markdown 文本,把所有发送过的文章去重,然后给构建系统使用,构建完上传部署。
RunJS 代码
顺带这是试过的 RunJS 代码
RunJS 发送 HTTP 请求
文档 https://docs.obsidian.md/Reference/TypeScript+API/request
// https://docs.obsidian.md/Reference/TypeScript+API/request
request({
url: "http://localhost:8080/",
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer "
},
body: JSON.stringify([{
"key": "some",
"key": "some text"
}])
}).then((res) => {
new Notice(JSON.stringify(res));
}).catch((err) => {
new Notice(JSON.stringify(err));
})
RunJS 文件排序
https://docs.obsidian.md/Reference/TypeScript+API/FileStats
let files = this.app.vault.getMarkdownFiles();
files.sort((a,b) => {
//new Notice(a.stat.ctime - b.stat.ctime);
return b.stat.mtime - a.stat.mtime;
});
RunJS 修改文件
const xxxx = this.app.vault.getAbstractFileByPath("xxxx.json");
this.app.vault.modify(xxxx, JSON.stringify(obj)).then(res => {
new Notice("Finish!");
})
总结
上面这些方法,也是实现了手机管理博客。这些方法在 Obsidian 移动端也都能做到,Remotely Save 和 RunJS 插件支持移动端。
Obsidian 比较自由,方法也多。发布为网站可谓各显神通,像是 Obsidian 搭建数字花园就有好几种方法。
暂时想到这五种方法,抛砖引玉,就这样。
Q.E.D.
欢迎赞赏~
赞赏