TIM'S BLOG

TIM'S BLOG

使用 Halo 作为 Typora 图床

390
2023-10-03

前言

自从上次阿里云 OSS 被盗刷流量后,一直找不到合适的 Typora 图床。虽然 Halo 带后端管理可以上传图片等附件,富文本编辑器也非常的好用,但是无论是博客还是本地文章,都需要先手动上传图片,然后再在编辑器中插入链接。总归是没有之前 Typora + PicGo 的方案优雅,在 Typora 中 Ctrl + V 一下,图片就自动上传并插入新的链接,无论是发布到哪里都不受影响。

PicGo 其实有 Halo 的插件,但是尝试了下,似乎还没有适配最新的 Halo 版本🤦‍♂️

偶然间发现 Halo 官方有个命令行工具(Halo Attachment Upload CLI)可以直接配合 Typora 使用,甚至都不需要安装 PicGo 了。

GitHub 上是以 MacOS 举例的,这里记录下 Windows 下的安装配置。

安装

安装 Node.js

安装 Halo Attachment Upload CLI 需要 Node.js 环境,直接官网下载 LTS 版本,安装过程全程下一步就行。

安装 Halo Attachment Upload CLI

完成 Node.js 的安装后,打开 Windows 终端,全局安装 Halo Attachment Upload CLI 工具。

$ npm install @halo-dev/attachment-upload-cli -g

等待安装完成之后,运行 hau --help 可以查看帮助信息。

配置

配置 Halo Attachment Upload CLI

$ hau setup

按照提示输入 Halo 实例的地址、用户名、密码、存储策略、分组等信息,配置信息保存在 C:\Users\%USERNAME%\.config\@halo-dev\attachment-upload-cli\config.json 文件中,是明文存储的,注意保管。

配置完成后可以找个图片上传试一下。

$ hau upload -f /path/to/file

配置 Typora

打开 Typora,进入文件 -> 偏好设置 -> 图像,将上传服务改为自定义命令,输入 hau upload -f 即可。

image-20231003194708871

保存配置后,点击验证图片上传选项,竟然验证失败,看返回信息,第一个参数位置的图片显示是上传成功的,应该是该命令不支持批量上传多个文件。

image-20231003200645774

查看 Halo 后台的附件库,也确实如此,只成功上传了第一个参数位置的图片。

image-20231003200550215

查看 Upload Images - Typora Support 说明,用 Python 写个脚本分别上传每一张图片后再格式化输出,顺便重命名图片。

import datetime
import os
import requests
import shutil
import sys
import urllib.parse

TEMP_PATH = "C:\\Users\\t1m2h0u\\AppData\\Local\\Temp\\Typora\\"

print("Upload Success:")

for old_image_url in sys.argv[1:]:
    old_image_urlparse = urllib.parse.urlparse(old_image_url)
    new_image_name = f"image-{datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")}"
    new_image_suffix = os.path.splitext(old_image_urlparse.path)[-1]
    new_image_url = f"{TEMP_PATH}{new_image_name}{new_image_suffix}"
    if old_image_urlparse.scheme in ["http", "https"]:
        with open(new_image_url, "wb") as image:
            image.write(requests.get(old_image_url).content)
    else:
        shutil.copy(old_image_url, new_image_url)
    print(os.popen(f"hau upload -f {new_image_url}").readlines()[1].strip("\n"))

将自定义命令修改为调用 Python 脚本。

image-20231031155142513

再次点击验证图片上传选项,验证成功。

image-20231227165853991

后记

将插入图片时的默认操作修改为复制到指定路径,如果该文章需要发布到博客,手动点击格式 -> 图像 -> 上传所有本地图片,可以同时兼顾本地笔记图片的隐私性以及快速上传图片,可以说是非常方便了。


  • 3