原因

由于SM.MS图床已经暂停对大陆开放,图片无法正常加载,需要迁移图床

步骤

申请腾讯云COS对象存储的流程不多赘述,自行百度

1.安装第三方库

命令👇
pip install -U cos-python-sdk-v5
如果网络不好可以使用以下命令👇
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com -U cos-python-sdk-v5

2.在电脑上创建三个文件夹

Files:用来存放待处理的.md文件
Temp:用来存放从原图床下载过来的图片
New:用来存放替换图片连接后,新的.md文件
文件路径最好简单一点,待会需要用到,我这里创建在桌面

3.将以下信息替换为自己的信息

secret_id :用户的 SecretId
secret_key :用户的 Secretkey
region :用户存储桶所在的地域
token :设置为 None 即可
app_id :用户的 APPID
腾讯云的桶名形式为 桶名 - APPID
bucket_name :用户的桶名
主函数中的 path ,代表的是用户的待处理 md 文件所在的文件夹路径
replace_image_url 函数中的 temp_path :临时存放原图床下载的图片的文件夹路径
replace_image_url 函数中的 new_md_path :替换链接完成后,新生成的 md 文件存放的文件夹路径
download_image 函数中的 headers :自己的浏览器随便打开一个网页,【右键】→【检查】→【网络】,左边框中随便点一个文件,右边框中点击【标头】,下拉到最下边,User-Agent 就是,粘贴复制到程序中

运行之前请先备份!!!

  运行时可能会连接sm.ms超时,因为禁止大陆访问,所以需要搭梯子,搭完梯子可能又会遇到连接腾讯云超时,这时候只需要在v2RayN中自行设置让sm.ms走代理,而腾讯云不走代理即可

4.运行程序

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import re
import os
import time
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import requests

# 获取文件夹下所有的 md 文件的绝对路径列表
def get_md_file_list(dir_path: str) -> list:
mds = []
for file in os.listdir(dir_path):
if file.endswith(".md"):
mds.append(os.path.join(dir_path, file))
return mds


# 从 SM.MS 下载图片
def download_image(image_name: str, image_url: str) -> None:
time.sleep(2) # 若是一直请求,腾讯这边问题不大,SM.MS 那边会限制请求[o(╥﹏╥)o]
print("开始处理图片 " + image_name)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
}
r = requests.get(url=image_url, headers=headers)
image_save = r"C:\Users\87613\Desktop\Temp\\" + image_name
if r.status_code == 200:
with open(image_save, "wb") as f:
f.write(r.content)
del r
print("图片 {0} 下载成功 ...".format(image_name))


# 将下载到本地的图片上传到腾讯云,并获取新的图片链接
def upload_image(image_url: str) -> str:
time.sleep(2)
# 上传图片到腾讯云
user_info = {
'secret_id': '', # 替换为用户的 secret_id
'secret_key': '', # 替换为用户的 secret_key
'region': '', # 替换为用户的 region
'token': None, # 使用临时密钥需要传入 Token,默认为空,可不填
'app_id': '', # 替换为用户的 app_id
'bucket_name': '' # 替换为用户的桶名
}

config = CosConfig(Region=user_info['region'], SecretId=user_info['secret_id'],
SecretKey=user_info['secret_key'], Token=user_info['token'])
client = CosS3Client(config)

object_key = image_url.split("\\")[-1]

with open(image_url, 'rb') as fp:
client.put_object(
Bucket=user_info['bucket_name'] + '-' + user_info['app_id'],
Body=fp,
Key=object_key,
EnableMD5=True,
StorageClass='STANDARD',
ContentType='text/html; charset=utf-8'
)
temp_name = object_key.split("\\")[-1]
print("图片 {0} 上传成功 ...".format(temp_name))
# 获取新的图片链接
new_url = client.get_object_url(
Bucket=user_info['bucket_name'] + '-' + user_info['app_id'],
Key=object_key
)
print("图片 {0} 获取新链接成功 ...".format(temp_name))
return new_url


# 获取单个 md 文件中的所有图片的链接,上传腾讯云后,替换成新的链接
def replace_image_url(md_path: str) -> None:
# 图片从 sm.ms 下载下来后临时的存放地址,提前在桌面新建 Temp、New 文件夹,不然会报错找不到文件
temp_path = r"C:\Users\87613\Desktop\Temp\\"
new_md_path = r"C:\Users\87613\Desktop\New\\"
md_name = md_path.split("\\")[-1]

print("================== 开始处理文件 {0} ==================".format(md_name))
with open(md_path, "r", encoding="utf-8") as f:
files = ""
for s in f.readlines():
files += s
# 获取 md 文件中的图片链接
images_list = re.findall(r"!\[(.*?)\]\((.*?)\)", files)

new_url_list = []
for image in images_list:
# 下载图片到本地
download_image(image[0], image[1])
# 上传图片到腾讯云 COS,获得新链接
new_image_url = upload_image(temp_path + "\\" + image[0])
new_url_list.append(new_image_url)

# 依次替换链接
new_files = ""
with open(md_path, "r", encoding="utf-8") as f:
for s in f.readlines():
new_files += s
for i in range(len(images_list)):
new_files = new_files.replace(images_list[i][1], new_url_list[i])
print("正在替换图片 {0} ...".format(images_list[i][0]))
# 处理完成,写入写文件
with open(new_md_path + "\\" + md_name, "w", encoding="utf-8") as ff:
ff.write(new_files)
print("================== 文件 {0} 处理完成 !==================\n".format(md_name))


if __name__ == '__main__':
path = r"C:\Users\87613\Desktop\Files\\"
md_list = get_md_file_list(path)
for md_file in md_list:
replace_image_url(md_file)

5.将生成的新.md文件替换原来的.md文件