将图床从 SM.MS 迁移到腾讯云 COS
0 写在前边
那个,怎么个事情呢
以前写博客用的图床一直是
SM.MS
的,因为免费(因为我穷),某天日常打开博文看看,然后发现博文中的图片全部裂开,我以为是博客园出问题了,一看本地的图片,也是全部裂开,然后SM.MS
的官网也进不去寄了啊!寄大发了!内心犹如......
然后疯狂 Google 图床崩了怎么拯救,越看越心凉凉,国外的图床就是有说崩就崩的优点
过了快两个小时吧,突然又进去官网了,图片也都能访问了,心中狂喜
这也给我敲响了警钟,万一哪天真的崩了,哭都没地方,立马决定,换图床!换回国内的!
纠结再三,选择了腾讯的,不为什么,就问问我自己,给腾讯游戏中送的米还少吗
hhhhhh
1 注册腾讯云 COS
1.1 注册账号
- 数据处理方案-腾讯云
- 注册好账号之后,需要进行实名认证,几分钟完成
1.2 购买存储对象
-
点击主页的【购买资源包】,购买云存储对象
-
进入购买页面,选择适合自己的套餐,然后付款
-
付款成功后出现如下界面,购买成功,点击【进入控制台】
1.3 创建储存桶
-
进入控制台后,依次点击【对象存储】→【存储桶列表】→【创建存储桶】,然后填写存储桶名称,访问权限一定要选择【公有读私有写】,其余内容按照自己依次填写即可
-
依次点击【秘钥管理】→【API秘钥管理】→【新建秘钥】,该秘钥后续步骤会用到
2 配置 PicGo
-
下载安装 PicGo 客户端
-
打开 PicGo 客户端,【图床设置】→【腾讯云 COS】
-
在腾讯云的【我的秘钥】界面,依次将上一步中的
Secretld
、SecretKey
、APPID
粘贴复制到 PicGo 中 -
然后进入腾讯云控制台,点击【桶列表】,将【存储空间名】、【存储区域】依次粘贴到 PicGo 中,存储路径、自定义域名可以为空
-
点击 PicGo 中的【设为默认图床】,至此,PicGo 配置完毕
3 配置 Typora
-
依次点击【文件】→【偏好设置】→【图像】,选择 【PicGo app】,选择 PicGo APP 在本地的安装路径,配置完毕
-
点击【验证图片上传选项】,检验图片是否上传成功(若出现失败,尝试在 PicGo 设置中将 【COS版本】 修改为 V5)
4 开始转移图床
注:因为本人有个习惯,博客笔记云端保存一份,本地也会保存一份,所以想要获取博客中每个图片的原图床链接,直接在本地读取
md
文件即可,替换完成后,将新的md
文件内容全部Ctrl + C、V
到网站写博客的后台替换即可如果本地没有 md 文件,只要在写博客网站的后台,将博客内容全部
Ctrl + C、V
到本地就成,想来没什么大问题
-
使用的编辑工具为
Pycahram
-
查看 腾讯云文档 ,要上传图片,需要安装第三方库,安装命令为
pip install -U cos-python-sdk-v5
,使用Pychram
的Terminal
命令行安装即可,速度还行 -
运行程序前准备工作
- 桌面新建以下三个文件夹
Files
:用来存放待处理的md
文件Temp
:用来存放从原图床下载过来的图片New
:用来存放替换图片连接后,新的md
文件
- 重要!!!:替换本地
md
文件之前,记得做好备份!!!因为你不知道程序会出什么稀奇古怪的毛病!有备无患的好!!!
- 桌面新建以下三个文件夹
-
替换用户信息:将程序中的
upload_image
函数中的user_info
中的信息全部替换为自己腾讯云的信息即可secret_id
:用户的SecretId
secret_key
:用户的Secretkey
region
:用户存储桶所在的地域token
:设置为None
即可- 腾讯云的桶名形式为
桶名 - APPID
app_id
:用户的APPID
bucket_name
:用户的桶名- 主函数中的
path
,代表的是用户的待处理md
文件所在的文件夹路径 replace_image_url
函数中的temp_path
:临时存放原图床下载的图片的文件夹路径replace_image_url
函数中的new_md_path
:替换链接完成后,新生成的 md 文件存放的文件夹路径download_image
函数中的headers
:自己的浏览器随便打开一个网页,【右键】→【检查】→【网络】,左边框中随便点一个文件,右边框中点击【标头】,下拉到最下边,User-Agent
就是,粘贴复制到程序中
-
全部信息替换完成后,运行程序即可
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 + ".png ...")
headers = {
"User-Agent": "自己浏览器,右键检查获取"
}
r = requests.get(url=image_url, headers=headers)
image_save = r"C:\Users\16671\Desktop\Temp\\" + image_name + ".png"
if r.status_code == 200:
with open(image_save, "wb") as f:
f.write(r.content)
del r
print("图片 {0} 下载成功 ...".format(image_name + '.png'))
# 将下载到本地的图片上传到腾讯云,并获取新的图片链接
def upload_image(image_url: str) -> str:
time.sleep(2)
# 上传图片到腾讯云
user_info = {
'secret_id': '你的 SecretId', # 替换为用户的 secret_id
'secret_key': '你的 SecretKey', # 替换为用户的 secret_key
'region': '你的桶所在地域,如 ap-beijing', # 替换为用户的 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"临时存放原图床下载的图片的文件夹路径"
new_md_path = r"替换链接完成后,新生成的 md 文件存放的文件夹路径"
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] + ".png")
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] + ".png"))
# 处理完成,写入写文件
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"待处理 md 文件所在的文件夹的绝对路径"
md_list = get_md_file_list(path)
for md_file in md_list:
replace_image_url(md_file)