本篇主要阐述使用python脚本,完成文章图片水印添加、上传、CDN链接替换、wordpress发布等一系列机械重复的过程。
0.效果
第一步:在vscode里写好markdown格式的文章
第二步:执行python脚本,自动完成以下过程
1.设计思路
整个过程分为量大部分:
写作部分:由我们自己创作文章,图片截图后贴入文章里。
机械部分:源文章–>使用Pillow加水印–>使用Picgo上传图片到GitHub仓库–>源文章图片链接替换为jsDelivr的CDN地址–>导出markdown格式为html格式–>推送到wordpress发布文章
看似简单,实际上我也是折腾了整整两天多,从最初的整个逻辑实现,到后来从wordpress的角度出发,重新设计了原始文件头部。下面来看下主要过程。
2.实现过程
如何添加水印?
这个其实没啥,python添加图片水印一搜一大堆,主要使用pillow库即可。
如何上传图片到GitHub?
这里,需要用到PicGo工具,具体教程设置可以参考链接。我们主要用到了PicGo-Server
功能,相当于一个本地的webapi接口,因此python请求该接口即可上传文件。
PicGO只需要一个Github的token即可实现上传,因此设置也非常容易。
然后就是python请求该接口了,以下是代码:
def get_img_list():
img_list = []
img_suffix_list = ['png', 'jpg', 'bmp']
for i in os.listdir():
if i.split('.')[-1] in img_suffix_list:
img_list.append('https://gcore.jsdelivr.net/gh/Baiyuetribe/yyycode@dev/img/20/' + i)
return img_list
def upload():
data = json.dumps({'list':get_img_list()})
r = requests.post('http://127.0.0.1:36677/upload',data=data)
print(r.json())
if r.json()['success'] == True:
return True
return False
如何替换本地图片链接为jsDelivr的CDN地址?
这一步非常简单,因为jsDelivr无需注册,映射的GitHub仓库文件地址,因此前缀都一样,只需要将文件里本地的图片链接replace
一下即可。
markdown文件如何转换为html?
这种文件转换,基本没任何困难,使用markdown库就行,这里需要注意markdown库的一些插件。
import markdown
from markdown.extensions.fenced_code import FencedCodeExtension #文章代码转换
from markdown.extensions.abbr import AbbrExtension
# fenced_code是代码转换的,这是必须。没有的话,markdown识别不了代码块,会转换为p标签
with open('终稿.html','w',encoding='utf-8') as f:
html = markdown.markdown(markdown_text,extensions=['fenced_code','abbr'])
f.write(html)
这里的abbr
也很重要,是因为可以原始的markdown转html后没有#ID
属性和.class
属性,这个插件就可以识别这种。不过佰阅博客里基本很少用到特殊属性的,因此暂时保留该插件。
如何使用python自动发布wordpress?
这个我也是稍微做了下研究,以前在wordpress看到过邮件发布之类的设置,那么纠结是什么API可以实现无需登陆后台,直接发布呢?
wordpress_xmlrpc就库可以,在本地测试完毕后,真的感觉到这东西真的非常好用。先来看下最最常规的发布方式
wp = Client('http://localhost/xmlrpc.php', 'admin', 'admin')
#创建对象
post = WordPressPost()
post.title = title #标题
post.content = html #内容
post.terms_names = {
'post_tag': ['python','markdown'], #标签
'category': ['教程','linux'] #分类,没有则自动创建
}
post.post_status = 'publish' #发布状态,不写默认是草稿,private表示私密的,draft表示草稿,publish表示发布
post.custom_fields = [] #自定义字段列表
#提交
post.id = wp.call(NewPost(post)) #获得文章ID
然后分析了下主题自带的一些代码,最后可以用下面的实现,以日主题为例,如果手动操作后台,wp数据库里会有wp_postmeta
的新增记录。
而用代码,就可以如下方式实现
post.custom_fields.append({ #添加一个自定义字段
'key': 'cao_is_video_free',
'value': 1
})
post.custom_fields.append({ #添加一个自定义字段
'key': 'cao_video',
'value': 1
})
post.custom_fields.append({ #添加一个自定义字段
'key': 'video_url',
'value': 'https://pan.yy-code.com/down/movie/1589720021870.mp4'
})
post.custom_fields.append({ #添加第二个自定义字段
'key': 'video_poster_url',
'value': 'https://gcore.jsdelivr.net/gh/Baiyuetribe/yyycode@dev/img/image-20200618000647534.png'
})
3.价值意义
本次尝试可以说彻底解放了以往机械重复的过程,一次折腾,就可以为后续节约不少时间和精力。后面只需专注写作,再也不用思考加水印、上传、替换、发布等机械重复的过程。
4.小白该怎么办?
如果可以,建议学点python知识,因为python几乎可以处理你能想到的所有设计思想,而且python入门容易,后面的知识积累会越写越舒畅,比shell脚本、php等使用范围更广泛。
我真的写不了代码怎么办?
那就找人付费定制了,类似我这个,一般只需要设置一次,后面只要路劲正确,都不会有故障。
本篇为第二篇自动发布文章。