[Python] Hexo博文图片上传图床并自动替换链接的Python脚本
前两天捣鼓了一下Github page + Hexo搭建博客,发现本地编写的Markdown博文发布以后图片链接还是用的本地路径,导致图片没法正常显示。网上搜了一下,解决办法大都是安装插件、手动上传图床再插入链接、用在线Markdown编辑器等。感觉不是很方便,于是写了一个Python脚本在文章发布以前自动把文章里的图片上传到SM.MS图床或者腾讯云对象存储并替换文章内的图片链接。
以下是代码
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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | import re import requests import json from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import sys #import logging import argparse import os import time import shutil from urllib import parse def get_artical_path(art_tittle): '' ' 合成文章路径 '' ' try : dir_path = os. getcwd () #如果是在博客根目录放置脚本,请修改testdir\_posts路径为source\_posts或其他放置文章的目录。 article_path = os.path.join(dir_path,r "source\_posts" ,art_tittle) return article_path print (article_path) except BaseException as err: print ( "error in get_artical_path\n{}" .format(err)) def change_pic_path(article_path,upld_method): '' ' article_path: 文章的本地路径 upld_method: 上传方法,sm.ms,腾讯 cos ,本地(github)。 '' ' print ( "please wait a moment" ) try : with open (article_path, 'r' ,encoding = 'utf-8' ) as md: article_content = md.read() pic_block = re.findall(r '\!.*?\)' ,article_content) #获取添加图片的Markdown文本 if upld_method == "smms" : for i in range(len(pic_block)): pic_origin_url = re.findall(r '\((.*?)\)' ,pic_block[i]) #获取插入图片时图片的位置 pic_new_url = smms(pic_origin_url[0]) print ( "pic_new_url is {}" .format(pic_new_url)) article_content = article_content.replace(pic_origin_url[0],pic_new_url) elif upld_method == "tx" : for i in range(len(pic_block)): pic_origin_url = re.findall(r '\((.*?)\)' ,pic_block[i]) #获取插入图片时图片的位置 # print ( "pic_origin_url is {}" .format(pic_origin_url)) pic_new_url = tx(pic_origin_url[0]) print ( "pic_new_url is {}" .format(pic_new_url)) article_content = article_content.replace(pic_origin_url[0],pic_new_url) elif upld_method == "local" : for i in range(len(pic_block)): pic_origin_url = re.findall(r '\((.*?)\)' ,pic_block[i]) #获取插入图片时图片的位置 pic_new_url = local(pic_origin_url[0]) print ( "pic_new_url is {}" .format(pic_new_url)) article_content = article_content.replace(pic_origin_url[0],pic_new_url) else : print ( "part of get_pic_path error" ) with open (article_path, 'w' ,encoding = 'utf-8' ) as md: md.write(article_content) print ( "job done" ) except BaseException as err: print ( "error in change_pic_path\n{}" .format(err)) #上传至SM.MS def smms(pic_origin_url): try : smms_url = 'https://sm.ms/api/upload' #file_path = r "C:\Users\Root\AppData\Roaming\Typora\typora-user-images\1542107269017.png" # for test data = requests.post( smms_url, files={ 'smfile' :open(pic_origin_url, 'rb' ), 'format' : 'json' } ) pic_new_url = json.loads(data.text) cloud_path = pic_new_url[ 'data' ][ 'url' ] return (cloud_path) except BaseException as err: print ( "error in smms\n{}" .format(err)) def tx(pic_origin_url): '' ' 上传至腾讯云 '' ' try : secret_id = '' # 替换为用户的 secretId secret_key = '' # 替换为用户的 secretKey region = '' # 替换为用户的 Region Bucket = '' #替换为用户的Bucket token = None # 使用临时密钥需要传入 Token,默认为空,可不填 scheme = 'https' # 指定使用 http/https 协议来访问 COS ,默认为 https,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) pic_basename = os.path. basename (pic_origin_url) #获取文件名及后缀 time_for_dir = time. strftime ( "%Y-%m-%d" ) #获取当前日期用于命名文件夹 #默认上传后建立一个以当前日期命名的文件夹,如果不需要,注释掉这一行用下一行。 cloud_path = time_for_dir + r '/' + pic_basename #cloud_path = pic_basename key = cloud_path # 2. 获取客户端对象 with open(pic_origin_url, 'rb' ) as fp: response = client.put_object( Bucket=Bucket, Body=fp, Key=key, #StorageClass= 'STANDARD' , #ContentType='text/html; #charset= 'utf-8' ) cloud_path = client._conf.uri(bucket=Bucket, path=key) return cloud_path except BaseException as err: print ( "error in tx\n{}" .format(err)) if __name__ == '__main__' : parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help= "commands" , dest= "command" ) smms_parser = subparsers.add_parser( "smms" ,help= "use smms" ) smms_parser.add_argument( "art_tittle" ,help= "input filename" ) tx_parser = subparsers.add_parser( "tx" ,help= "use tx cos" ) tx_parser.add_argument( "art_tittle" ,help= "input filename" ) local_parser = subparsers.add_parser( "local" ,help= "use local" ) local_parser.add_argument( "art_tittle" ,help= "input filename" ) args = parser.parse_args() if args.command == "smms" : article_path = get_artical_path(args.art_tittle) change_pic_path(article_path, 'smms' ) if args.command == "tx" : print ( 'use tx,file name is {}' .format(args.art_tittle)) article_path = get_artical_path(args.art_tittle) change_pic_path(article_path, 'tx' ) |
使用方法
将脚本放在博客本地根目录,当前目录下命令行输入python uploadpic.py <上传方式> <文章名.md>
貌似通常情况下博客文章都是放在source/_posts
文件夹的,所以脚本自动查找的是source/_posts
目录,如果你的文章是放在其他目录中,请手动修改代码中的目录。
上传方式:
smms
- SM.MS
ts
- 腾讯云COS,需要填写相应的secret_id、secret_key、region、Bucket
及安装腾讯云cos-python-sdk-v5
库
最后
本人乃初学编程的业余选手,在代码书写、编程思路等各方面还请大佬们多多指点。
可能是搜索力度不够,真的没发现有啥好的插入图片方法,如果有更好方法的也请说一下。
测试较少,可能出现各种奇怪的问题。我也不知道是怎么回事。
Github地址:https://github.com/lixint/img_upload_for_Markdown
分类:
Hexo+Github博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架