将文件夹的 markdown 文件中的所有图片上传到 b 站图床

优点:

自带 CDN,大厂基本不会被删(但还是建议本地保留一份),加载速度极快

缺点:

网上发布会有跨域问题

下载:https://github.com/xlzy520/typora-plugin-bilibili/releases 中的 main.exe 程序到本地

创建 python 脚本 MarkdownPicTOBilibiliPic.py

import os
import re
import subprocess

def get_md_files(folder_path):
    """获取指定文件夹下所有.md文件的路径"""
    md_files = []
    for root, _, files in os.walk(folder_path):
        for file in files:
            if file.endswith(".md"):
                md_files.append(os.path.join(root, file))
    return md_files

def extract_image_urls(md_file_path):
    """从.md文件中提取所有图片的相对链接"""
    pattern = r'!\[.*?\]\((.*?)\)'  # 匹配 ![标识](url)
    urls = []
    with open(md_file_path, 'r', encoding='utf-8') as file:
        content = file.read()
        urls = re.findall(pattern, content)
    return urls, content

def get_absolute_path(md_file_path, relative_url):
    """根据.md文件路径和相对图片链接生成图片的绝对路径"""
    md_dir = os.path.dirname(md_file_path)
    absolute_path = os.path.normpath(os.path.join(md_dir, relative_url))
    return absolute_path

def replace_urls_in_content(content, old_new_url_map):
    """将文件内容中的旧URL替换为新URL"""
    for old_url, new_url in old_new_url_map.items():
        content = content.replace(old_url, new_url)
    return content

def process_md_files(folder_path, main_exe_path, token, csrf):
    """核心功能实现"""
    md_files = get_md_files(folder_path)
    print(f"找到 {len(md_files)} 个.md文件:")
    for md_file in md_files:
        print(f"- {md_file}")
    
    for md_file_path in md_files:
        print(f"\n处理文件: {md_file_path}")
        # 提取图片相对URL和文件内容
        urls, content = extract_image_urls(md_file_path)
        print(f"找到 {len(urls)} 个图片链接。")

        # URL映射:{相对URL: 新URL}
        old_new_url_map = {}
        
        for relative_url in urls:
            # 获取图片的绝对路径
            absolute_path = get_absolute_path(md_file_path, relative_url)
            print(f"相对路径: {relative_url} -> 绝对路径: {absolute_path}")

            # 调用main.exe,获取新的图片URL
            command = f'"{main_exe_path}" token={token} csrf={csrf} "{absolute_path}"'
            print(f"执行命令: {command}")
            
            try:
                result = subprocess.run(command, capture_output=True, text=True, shell=True)
                new_url = result.stdout.strip()  # 假设返回的URL在stdout中
                if new_url:
                    old_new_url_map[relative_url] = new_url
                    print(f"新图片URL: {new_url}")
                else:
                    print(f"未能获取新URL,跳过: {relative_url}")
            except Exception as e:
                print(f"执行命令时出错: {e}")

        # 替换内容中的旧URL为新URL
        updated_content = replace_urls_in_content(content, old_new_url_map)

        # 将更新后的内容写回.md文件
        with open(md_file_path, 'w', encoding='utf-8') as file:
            file.write(updated_content)
        print(f"文件更新完成:{md_file_path}")

if __name__ == "__main__":
    # 文件夹路径(需要遍历.md文件的目录)
    folder_path = r"C:/Users/t295/Downloads/ (1)"
    
    # main.exe路径
    main_exe_path = r"C:/Users/t295/Downloads/main.exe"
    
    # Token和csrf参数
    token = "f45d0aad%2C175房东0f24%2A11CjD57FWOhgdLG43LXCsczMMWPfE14HdoiJ1adu47okRjUqXl-9bDZGX8nvxbml8LIgESVkxMbEJzSzE0eldYakVwaUxKeThnbll5bFBFV1JLcTF4R0RxcnBuSjVRTDNOcDB1NXVhMG0tMFpvRVJkMXdCRncxckFHMnB6ZGJYRGxnMUNBZ0ZuU0p3IIEC"
    csrf = "7c703b2f1f27f52反对f5c17409850f"

    process_md_files(folder_path, main_exe_path, token, csrf)

修改内容:

# markdown文件夹路径(需要遍历.md文件的目录)
    folder_path = r"C:/Users/t295/Downloads/markdown文件夹/"
# main.exe路径
main_exe_path = r"C:/Users/t295/Downloads/main.exe"

# Token和csrf参数
token = "f45d0aad%2C170f24%WOhgdLG43LXCsczMMWPfE14HdoiJ1adu47okRjUqXl-9bDZGX8nvxbml8LIgESVkxMbEJzSzE0eldYakVwaUxKeThnbll5bFBFV1JLcTF4R0RxcnBuSjVRTDNOcDB1NXVhMG0tMFpvRVJkMXdCRncxckFHMnB6ZGJYRGxnMUNBZ0ZuU0p3IIEC"
csrf = "7c703b2f1f27ff59850f"

注意其中的 cmd 命令将路径进行替换

同时将 token 和 csrf 进行替换,具体位置在 b 站中登录后,在应用程序(F12⇒ 应用程序)中查看 cookie 了,两个值分别对应:推荐使用浏览器插件 Cookie-Editor,更加方便:

  1. SESSDATA⇒token
  2. bili_jct⇒csrf

最后运行脚本即可,最后随机打开一个查看效果:

250108_105055.png

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 147 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 729 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 2 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    7 引用 • 40 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 634 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 121 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    30 引用 • 96 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8681 引用 • 39581 回帖 • 144 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 5 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 109 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 157 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    493 引用 • 928 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 4 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 18 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    26 引用 • 196 回帖 • 16 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    178 引用 • 997 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 74 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 29 关注