Typora 中设置图像上传到博客园中

Typora 图像上传功能

适配入口

在 Typora 的选项栏中,文件→偏好设置→图像→上传服务设定,其中可以看到官方提供了几种不同的图片上传服务,其中最底下还预留了一个 [自定义命令],这个可以留给我们自己适配,因此很容易联想到博客园的图片上传服务能否适配?

适配教程

如何完成适配呢?可以看到下方有一个说明链接

点开后可以看到在 custom 章节中,官方文档指出:

简单理解就是可以自行写一个脚本,然后通过命令行参数接收来自 Typora 的图片本地路径即可,如果有很多张图片,可以多次调用。

此外,官方还提供了可能出现的问题及解决方法

适配脚本

我们知道博客园开发了 vscode 插件是可以提供图片上传功能的,那么主要用到的是什么接口呢?

这里主要用的就是 MetaWeblog API ,它支持上传图片、发布文章。

在博客园后台的设置中,最底下有:

我们将 "允许 MetaWeblog 博客客户端访问" 设置为开启,于是可以得到:

  • MetaWeblog登录名【USERNAME】
  • MetaWeblog访问令牌【PASSWORD】
  • MetaWeblog访问地址【BLOG_URL】

这些参数就是每个人独立的接口参数,于是向豆包咨询后,得到下面的代码:

sh 复制代码
#!/bin/bash
set -euo pipefail

# ==================== 你的配置 ====================
BLOG_URL="你的MetaWeblog"
USERNAME="你的MetaWeblog登录名"
PASSWORD="你的MetaWeblog访问令牌"
BLOG_ID="你的博客园用户目录路径,如https://www.cnblogs.com/gshang,就是 gshang"
# ==================================================
echo "Upload Success:"

for img_path in "$@"; do
    # 转换路径
    [[ "$img_path" == [A-Za-z]:\\* ]] && img_path=$(cygpath -u "$img_path")

    # 基础信息
    filename=$(basename "$img_path")
    mime=$(file -b --mime-type "$img_path")

    # 【关键修复】用临时文件,避免参数过长
    xml_file=$(mktemp)

    # 写入 XML(不从命令行传,彻底解决超长)
    cat > "$xml_file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>metaWeblog.newMediaObject</methodName>
<params>
<param><value><string>${BLOG_ID}</string></value></param>
<param><value><string>${USERNAME}</string></value></param>
<param><value><string>${PASSWORD}</string></value></param>
<param><value><struct>
<member><name>name</name><value><string>${filename}</string></value></member>
<member><name>type</name><value><string>${mime}</string></value></member>
<member><name>bits</name><value><base64>$(base64 -w 0 "$img_path")</base64></value></member>
</struct></value></param>
</params>
</methodCall>
EOF

    # 【关键修复】从文件读取 XML,不拼命令行
    resp=$(curl -s -X POST \
        -H "Content-Type: text/xml; charset=utf-8" \
        --data-binary "@$xml_file" \
        "$BLOG_URL")

    # 提取 URL(100% 兼容 Windows)
    url=$(echo "$resp" | sed -n 's/.*<string>\(https[^<]*\)<\/string>.*/\1/p' | head -1)

    # 输出给 Typora
    [ -n "$url" ] && echo "$url" || echo ""

    # 清理临时文件
    rm -f "$xml_file"
done

将你的信息填写后,保存为 cnblogs.sh ,并将其放到 Typora.exe 同一目录下,我的目录是:

复制代码
D:\Program Files\Typora\cnblogs.sh

最后,确保你已经安装了 git-bash ,想必作为程序员应该都装了的。我的安装目录是

复制代码
D:\Program Files\Git\bin\bash.exe

于是我们得到最终输入给 Typora 的命令行:

bash 复制代码
"D:\Program Files\Git\bin\bash.exe" "D:\Program Files\Typora\cnblogs.sh"

点击 "验证图片上传选项" ,可以看到图片上传成功:

日常使用测试

在 Typora 中提供了两种上传图片的形式:

单张图片上传

图片选中后,右键可以上传当前图片。

批量上传

博客写完后,图片太多可以在顶部选项栏中,格式→图像→上传所有本地图片 ,点击后一次性全部上传。