将图床从 SM.MS 迁移到腾讯云 COS

0 写在前边

那个,怎么个事情呢

以前写博客用的图床一直是 SM.MS 的,因为免费(因为我穷),某天日常打开博文看看,然后发现博文中的图片全部裂开,我以为是博客园出问题了,一看本地的图片,也是全部裂开,然后 SM.MS 的官网也进不去

寄了啊!寄大发了!内心犹如......

然后疯狂 Google 图床崩了怎么拯救,越看越心凉凉,国外的图床就是有说崩就崩的优点

过了快两个小时吧,突然又进去官网了,图片也都能访问了,心中狂喜

这也给我敲响了警钟,万一哪天真的崩了,哭都没地方,立马决定,换图床!换回国内的!

纠结再三,选择了腾讯的,不为什么,就问问我自己,给腾讯游戏中送的米还少吗 hhhhhh

1 注册腾讯云 COS

1.1 注册账号
1.2 购买存储对象
  • 点击主页的【购买资源包】,购买云存储对象

    购买资源包

  • 进入购买页面,选择适合自己的套餐,然后付款

    选择套餐

  • 付款成功后出现如下界面,购买成功,点击【进入控制台】

    付款成功

1.3 创建储存桶
  • 进入控制台后,依次点击【对象存储】→【存储桶列表】→【创建存储桶】,然后填写存储桶名称,访问权限一定要选择【公有读私有写】,其余内容按照自己依次填写即可

    创建储存桶

  • 依次点击【秘钥管理】→【API秘钥管理】→【新建秘钥】,该秘钥后续步骤会用到

    新建秘钥

2 配置 PicGo

  • 下载安装 PicGo 客户端

  • 打开 PicGo 客户端,【图床设置】→【腾讯云 COS】

  • 在腾讯云的【我的秘钥】界面,依次将上一步中的 SecretldSecretKeyAPPID 粘贴复制到 PicGo 中

  • 然后进入腾讯云控制台,点击【桶列表】,将【存储空间名】、【存储区域】依次粘贴到 PicGo 中,存储路径、自定义域名可以为空

    粘贴信息

    PicGo设置

  • 点击 PicGo 中的【设为默认图床】,至此,PicGo 配置完毕

3 配置 Typora

  • 依次点击【文件】→【偏好设置】→【图像】,选择 【PicGo app】,选择 PicGo APP 在本地的安装路径,配置完毕

    配置 Typora

  • 点击【验证图片上传选项】,检验图片是否上传成功(若出现失败,尝试在 PicGo 设置中将 【COS版本】 修改为 V5)

4 开始转移图床

注:因为本人有个习惯,博客笔记云端保存一份,本地也会保存一份,所以想要获取博客中每个图片的原图床链接,直接在本地读取 md 文件即可,替换完成后,将新的 md 文件内容全部 Ctrl + C、V 到网站写博客的后台替换即可

如果本地没有 md 文件,只要在写博客网站的后台,将博客内容全部 Ctrl + C、V 到本地就成,想来没什么大问题

  • 使用的编辑工具为 Pycahram

  • 查看 腾讯云文档 ,要上传图片,需要安装第三方库,安装命令为 pip install -U cos-python-sdk-v5 ,使用 PychramTerminal 命令行安装即可,速度还行

  • 运行程序前准备工作

    • 桌面新建以下三个文件夹
      • 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)

posted @ 2022-02-07 12:26  悟道九霄  阅读(329)  评论(0编辑  收藏  举报