使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径
使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径
通过metaweblog API 发布博文的时候,由于markdown中的图片路径是本地路径,将导致发布的文章图片不能正确查看。两种通用的办法是: 1 将图片发布到专用的图片服务器,然后将链接替换; 2 将图片发布到博客平台,然后将链接替换。
这篇小文件探讨的是第二种方式。
1 查找markdown 文件中的图片
使用正则表达式进行查找
def matchMarkdownLinks(post):
return re.compile('!\\[.*?\\]\\((.*?)\\)').findall(post)
2 判断链接是否是本地链接
使用正则表达式判断是否是本地链接,如果已经是网络链接,就不用进行上传操作了
def isNetLink(link):
return re.match('((http(s?))|(ftp))://.*', link)
3 判断本地图片格式,进行必要的转码
判断图片的压缩格式,如果有必要,转换成gif格式(支持透明背景)
from PIL import Image
def replace_img_url(path, pictype):
(name, suffix) = os.path.splitext(os.path.basename(path))
if not pictype in ["gif","jpg"]:
img = Image.open(path)
localfile = "%s.gif"%(name)
img.save(localfile, 'gif')
with open(localfile, 'rb') as f:
url = client.newMediaObject({
"bits": f.read(),
"name": os.path.basename(localfile),
"type": "image/gif"
})
os.remove(localfile) #remove local temp file
return url
else:
with open(path, 'rb') as f:
url = client.newMediaObject({
"bits": f.read(),
"name": os.path.basename(path),
"type": "image/" + suffix
})
return url
其中的client就是上篇文章中写的metaweblog 客户端。 转换图片时,使用了PIL图片库
4 整体流程
首先使用正则获取所有链接,判断链接是否是本地链接
然后判断本地链接文件是否存在,使用 imghdr 模块猜测图片格式
最后上传本地图片,替换链接地址
import imghdr
def fixMarkdownLink(md_file):
with open(md_file, 'r', encoding="utf-8") as f:
post = f.read()
matchs = matchMarkdownLinks(post)
print(matchs)
if matchs and len(matchs) > 0:
for link in matchs:
if not isNetLink(link):
localPath = link
if not os.path.exists(localPath) or not os.path.isfile(localPath):
sep = os.path.sep if (md_file.find(os.path.sep) >= 0) else ("\\" if (md_file.find("\\") >= 0) else "/")
localPath = md_file[:md_file.rfind(sep)+1] + localPath
if os.path.exists(localPath) and os.path.isfile(localPath):
imgtype = imghdr.what(localPath)
if imgtype:
file_url = replace_img_url(localPath, imgtype)
if file_url and file_url["url"]:
post = post.replace(link, file_url["url"]) # 替换md文件中的地址
return post
未完待续,下篇继续探讨修改本地markdown文件后的自动更新方案
使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径的更多相关文章
- 使用metaweblog API实现通用博客发布 之 API测试
使用metaweblog API实现通用博客发布 之 API测试 使用博客比较少,一则是文笔有限,怕写出的东西狗屁不通,有碍观瞻, 二则是懒,很讨厌要登录到网站上写东西,也没有那么多时间(借口).个人 ...
- 使用metaweblog API实现通用博客发布 之 版本控制
使用metaweblog API实现通用博客发布 之 版本控制 接上一篇本地图片自动上传以及替换路径,继续解决使用API发布博客的版本控制问题. 当本地文档修订更新以后,如何发现版本更新,并自动发布到 ...
- 使用Office-Word的博客发布功能(测试博文)
本人打算在博客园开博,但平时收集和整理资料都在OneNote中,又不想在写博客时还要进行复制粘贴操作,于是就想到了Microsoft Office自带的博客发布功能.在此做了一下测试,发布了此博文. ...
- BlogPublishTool - 博客发布工具
BlogPublishTool - 博客发布工具 这是一个发布博客的工具.本博客使用本工具发布. 本工具源码已上传至github:https://github.com/ChildishChange/B ...
- 修改vscode caipeiyu.writeCnblog ,简化博客发布
修改vscode caipeiyu.writeCnblog ,简化博客发布 1. 安装caipeiyu.writeCnblog vscode的博客园文章发布插件WriteCnblog : https: ...
- longblogV1.0——我的静态博客发布系统
longblogV1.0——我的静态博客发布系统 环境依赖: python3-markdown 作者:IT小小龙个人主页:http://long_python.gitcafe.com/电子邮箱:lon ...
- Mac端博客发布工具推荐
引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...
- 基于.NET Core开发的个人博客发布至CentOS小计
早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...
- 多平台博客发布工具OpenWrite的使用
1 介绍 OpenWrite官网 OpenWrite是一款便捷的多平台博客发布工具,可以在OpenWrite编写markdown文档,然后发布到其他博客平台,目前已经支持CSDN.SegmentFau ...
随机推荐
- 项目中redisTemplate设置的key,redis客户端上查询不到的问题
再项目使用了redis储存key,测试需要在客户端删除对应的key,发现查询不到对应的key redis客户端: 发现redisTemplate实际存进去的key会多了几个字符 原因:程序中对key没 ...
- 【笔记】使用scikit-learn解决回归问题
使用sklearn解决回归问题 依然是加载数据 import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- Java调用Zookeeper
watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性. Zookeeper所有的读操作getData(), getChildren()和 ...
- Spring Boot 项目集成Redis
目录 集成方式 使用Jedis 使用spring-data-redis Redis的安装 绑定配置 获取Redis客户端 Redis工具的编写 使用 集成方式 使用Jedis Jedis是Redis官 ...
- java线程池 面试题(精简)
什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...
- 【springboot】事务处理
转自: https://blog.csdn.net/cp026la/article/details/86496788 扯淡: 复杂的业务逻辑中一个请求可能需要多次操作数据库,要保证一个Service ...
- js之DOM入门(慕课网学习笔记)
DOM简介 获得元素 document.getElementById('') 1.通过id获得元素内容 document.getElementsByTagName('') 2.通过标签获得元素内容 d ...
- JDBC中的元数据
在我编写JDBC代码的时候:出现很多的重复的代码,有没有什么办法让我们能够编写出更加通用的JDBC代码呢?使用元数据,元数据能够让我们编写出更加通用的JDBC代码.什么是元数据呢?(三种元数据)1)连 ...
- 用vue的抽象组件来做一个防止img标签url为空或url地址出错的验证
看了网上文章学习了下vue的抽象组件,感觉就跟react的高阶组件一样的使用场景,只是更加面向vue的底层编程 ,网上介绍的抽象组件一般有2种用法,1 用来加防抖和节流 2 用来控制按钮是否允许点击做 ...
- http请求包含哪几个部分(请求行、请求头、请求体)
http协议报文 1.请求报文(请求行/请求头/请求数据/空行) 请求行 求方法字段.URL字段和HTTP协议版本 例如:GET ...