NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • 教程

    • 安装
    • 流程控制与定义函数
    • 数据结构(类型)
    • 模块
    • 输入与输出
    • 错误与异常
    • 类
    • 标准库
    • 虚拟环境和包
    • 开发环境
    • ORM - SQLAlchemy
  • Python
NipGeihou
2022-01-03
目录

批量迁移Markdown文件微博图床到七牛云

# 「Python 脚本」批量迁移 Markdown 文件微博图床到七牛云

# 前言

hi,好久没有写过博客了,上一次写博客还是两年多之前,这两年实在太过忙碌了,同时也因为转用一些笔记软件来记录,之所以你能看到这篇文章,正是我实在受不了这些笔记软件,始终找不到一个我满意的,加上近来有像 Typora 这样的 md 编辑器,又有像 vuepress 这样的框架,我想使用博客记录我的开发日常会变得十分简单。

那在使用 hexo 时编写的文章时发现(其实很久以前就发现了),微博图床已经挂了,不仅仅是防盗链,而是直接 404 了,庆幸的是微博并没有物理删除这些图片,而是更改了域名,将原来的 https://ws1.sinaimg.cn 更改为了 https://wx1.sinaimg.cn ,那我就可以把旧的图片迁移到七牛云的对象存储中使用,废话不多说,开干!

# 编码

# 上传七牛云

通过七牛云的 SDK (opens new window) 很轻松的写出了下面的上传方法

def upload(local_path, upload_path):
    """
    上传方法
    :param local_path:
    :param upload_path:
    :return:
    """
    print("正在上传 {} ,上传到 {}".format(local_path, upload_path))
    # 构建鉴权对象
    q = Auth(access_key, secret_key)
    key = upload_path
    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, key, 3600)

    # 要上传文件的本地路径
    localfile = local_path
    ret, info = put_file(token, key, localfile, version='v2')
    print(info)

    assert ret['key'] == key
    assert ret['hash'] == etag(localfile)

# 获取目录下的所有 md 文件路径

def subdir_list(dirname):
    """获取目录下所有子目录名
    @param dirname: str 目录的完整路径
    @return: list(str) 所有子目录完整路径组成的列表
    """
    return list(filter(os.path.isdir, map(lambda filename: os.path.join(dirname, filename), os.listdir(dirname))))


def file_list(dirname, ext='.csv'):
    """获取目录下所有特定后缀的文件
    @param dirname: str 目录的完整路径
    @param ext: str 后缀名, 以点号开头
    @return: list(str) 所有子文件名(不包含路径)组成的列表
    """
    return list(filter(lambda filename: os.path.splitext(filename)[1] == ext, os.listdir(dirname)))


def list_file_path(root_dirname, ext='.md'):
    """
    获取文件路径列表
    :param root_dirname:
    :param ext:
    :return:
    """
    file_path_list = []
    dirname_list = subdir_list(root_dirname)
    for dirname in dirname_list:
        filename_list = file_list(dirname=dirname, ext='.md')
        for filename in filename_list:
            file_path_list.append(r'{}\{}'.format(dirname, filename))
    return file_path_list

# 替换文件中的图床地址

def replace_file_img_url(file_path):
    """
    替换文件中的图床地址,通过下载图片再上传到七牛云实现
    :param file_path:
    :return:
    """
    # 存储读取的文件内容,用于更新文件,从而实现修改的效果
    file_data = ""
    i = 0
    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            # 正则匹配当前行
            # 读内容
            res = re.search(OLD_IMG_URL_PREFIX + r'.+(?=\))', line)
            if res:
                # 提取url
                img_url = line[res.span()[0]: res.span()[1]]

                # 替换成备用的url
                img_url = img_url.replace(OLD_IMG_URL_PREFIX, OLD_IMG_URL_REPLACE_PREFIX)
                print(os.path.dirname(__file__) + os.path.basename(img_url))

                # 通过备用的url下载到本地
                img_path = wget.download(img_url, "temp/" + os.path.basename(img_url))

                # 上传到七牛云
                upload(img_path, img_url[len(OLD_IMG_URL_REPLACE_PREFIX) + 1:])

                # 删除本地图片
                os.remove(img_path)

                # 更新当前行的图床地址
                line = line.replace(OLD_IMG_URL_PREFIX, NEW_IMG_URL_PREFIX)
            file_data += line

    # 写出文件
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(file_data)

# 运行

if __name__ == '__main__':
    # 遍历每一个md文件路径
    for file_path in list_file_path(ROOT_DIR_PATH):
        # 将md文件中的图床地址更换为七牛云的
        replace_file_img_url(file_path)

完整脚本代码查看此处:https://github.com/NipGeihou/weibo-to-qiniu-img-url (opens new window)

#Python脚本
上次更新: 2024/10/14, 11:17:11
最近更新
01
Docker Swarm
04-18
02
安全隧道 - gost
04-17
03
Solana最佳实践
04-16
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式