Typora自定OSS图片上传
Typora 除了本身支持一些主流的图床接口以外,也支持执行自定义上传脚本。对于第三方的OSS图片上传服务,我们就需要自己编写上传脚本。
来看看 Typora 对此的要求:
我们根据这个规则可以写出以下代码:
- 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
- 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")
然后在图片上传设置页面填入以下命令:
这里我们假设这个 Python 文件保存在了 /path/to/file/upload_image.py
。
点击“验证图片上传选项”:
验证成功,大功告成。
本文由作者按照
CC BY 4.0
进行授权