[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

posted @   JS脚本  阅读(356)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示