文章

Typora自定OSS图片上传

Typora 除了本身支持一些主流的图床接口以外,也支持执行自定义上传脚本。对于第三方的OSS图片上传服务,我们就需要自己编写上传脚本。

截屏2025-01-06 08.52.48

来看看 Typora 对此的要求:

截屏2025-01-06 08.53.51

我们根据这个规则可以写出以下代码:

  1. bash版(不推荐,Typora 可能会检测不到输出)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash

# 定义图床的上传 URL
UPLOAD_URL="【替换成你的端点url】"

# 定义请求头
HEADERS=(
    "-H 'Accept: application/json, text/plain, */*'"
    "-H 'Accept-Language: zh-CN,zh;q=0.9'"
    "-H 'Cache-Control: no-cache'"
    "-H 'Connection: keep-alive'"
    "-H 'Origin: 【替换此处】'"
    "-H 'Pragma: no-cache'"
    "-H 'Referer: 【替换此处】'"
    "-H 'Sec-Fetch-Dest: empty'"
    "-H 'Sec-Fetch-Mode: cors'"
    "-H 'Sec-Fetch-Site: cross-site'"
    "-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'"
    "-H 'sec-ch-ua: \"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"'"
    "-H 'sec-ch-ua-mobile: ?0'"
    "-H 'sec-ch-ua-platform: \"macOS\"'"
)

echo "Upload Success:"

# 遍历传入的图片路径
for img_path in "$@"; do
    # 生成文件名
    filename=$(basename "$img_path")
  
    # 计算文件的 MD5 值
    md5_value=$(openssl dgst -md5 "$img_path" | awk '{print $2}')
  
    # 生成随机边界字符串
    boundary=$(openssl rand -hex 16)
  
    # 添加 MD5 值和边界到请求头
    HEADERS+=("-H 'XueHai-MD5: $md5_value'")
    HEADERS+=("-H 'Content-Type: multipart/form-data;'")
  
    # 构建 curl 命令
    curl_command=(
        "curl"
        "${HEADERS[@]}"
        "-F 'files=@$img_path;filename=$filename'"
        "$UPLOAD_URL"
    )
  
    # 执行 curl 命令并获取响应
    response=$(eval "${curl_command[@]}" 2>/dev/null)

    # 使用字符串匹配提取 URL
    image_url=$(grep -oP '"fileId":"\K[^"]+' <<< "$response")

    # 输出图片 URL
    echo "$image_url"
  
    # 清除 MD5 请求头和边界,以便下一次使用
    HEADERS=("${HEADERS[@]::${#HEADERS[@]}-2}")
done
  1. Python 版(推荐,但是需要安装 Python3 及相应的库)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import os
import requests
import hashlib
import re
import sys

# 定义图床的上传 URL
UPLOAD_URL = "【替换此处】"

# 定义请求头
HEADERS = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Origin': '【替换此处】',
    'Pragma': 'no-cache',
    'Referer': '【替换此处】',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"'
}

print("Upload Success:")

# 遍历传入的图片路径
for img_path in sys.argv[1:]:
    # 生成文件名
    filename = os.path.basename(img_path)
  
    # 计算文件的 MD5 值
    with open(img_path, 'rb') as file:
        md5_value = hashlib.md5(file.read()).hexdigest()
  
    # 添加 MD5 值到请求头
    HEADERS['XueHai-MD5'] = md5_value
  
    # 构建文件数据
    files = {'files': (filename, open(img_path, 'rb'))}
  
    # 发送 POST 请求
    response = requests.post(UPLOAD_URL, headers=HEADERS, files=files)
  
    # 使用字符串匹配提取 URL
    image_url = re.search(r'"fileId":"([^"]+)"', response.text)
  
    if image_url:
        # 输出图片 URL
        print(image_url.group(1))
    else:
        print("Failed to extract image URL")

然后在图片上传设置页面填入以下命令:

截屏2025-01-06 08.58.47

这里我们假设这个 Python 文件保存在了 /path/to/file/upload_image.py

点击“验证图片上传选项”:

截屏2025-01-06 08.59.52

验证成功,大功告成。

本文由作者按照 CC BY 4.0 进行授权

© Dignite. 保留部分权利。 由  提供CDN加速。

浙ICP备2023032699号 | 使用 Jekyll 主题 Chirpy