使用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实现通用博客发布 之 本地图片自动上传以及替换路径的更多相关文章

  1. 使用metaweblog API实现通用博客发布 之 API测试

    使用metaweblog API实现通用博客发布 之 API测试 使用博客比较少,一则是文笔有限,怕写出的东西狗屁不通,有碍观瞻, 二则是懒,很讨厌要登录到网站上写东西,也没有那么多时间(借口).个人 ...

  2. 使用metaweblog API实现通用博客发布 之 版本控制

    使用metaweblog API实现通用博客发布 之 版本控制 接上一篇本地图片自动上传以及替换路径,继续解决使用API发布博客的版本控制问题. 当本地文档修订更新以后,如何发现版本更新,并自动发布到 ...

  3. 使用Office-Word的博客发布功能(测试博文)

    本人打算在博客园开博,但平时收集和整理资料都在OneNote中,又不想在写博客时还要进行复制粘贴操作,于是就想到了Microsoft Office自带的博客发布功能.在此做了一下测试,发布了此博文. ...

  4. BlogPublishTool - 博客发布工具

    BlogPublishTool - 博客发布工具 这是一个发布博客的工具.本博客使用本工具发布. 本工具源码已上传至github:https://github.com/ChildishChange/B ...

  5. 修改vscode caipeiyu.writeCnblog ,简化博客发布

    修改vscode caipeiyu.writeCnblog ,简化博客发布 1. 安装caipeiyu.writeCnblog vscode的博客园文章发布插件WriteCnblog : https: ...

  6. longblogV1.0——我的静态博客发布系统

    longblogV1.0——我的静态博客发布系统 环境依赖: python3-markdown 作者:IT小小龙个人主页:http://long_python.gitcafe.com/电子邮箱:lon ...

  7. Mac端博客发布工具推荐

    引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...

  8. 基于.NET Core开发的个人博客发布至CentOS小计

    早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...

  9. 多平台博客发布工具OpenWrite的使用

    1 介绍 OpenWrite官网 OpenWrite是一款便捷的多平台博客发布工具,可以在OpenWrite编写markdown文档,然后发布到其他博客平台,目前已经支持CSDN.SegmentFau ...

随机推荐

  1. How to name a slf4j logger

    Use logger in a non-static context: Logger logger = LoggerFactory.getLogger(this.getClass().getName( ...

  2. Qt Designer中自定义控件的使用(提升法与插件法)

    准备乱写一点Qt自定义Widget在Designer中的使用.可是又不想重复提升法(promotion)及插件法基本用法,因为Manual中Using Custom Widgets with Qt D ...

  3. linux联网、远程

    使用VMware虚拟机创建linux系统CentOS 7,连接网络以及远程Moba工具. 一.首先安装好VMware虚拟机和CentOS系统,网上很多教程,不在赘述. 二.打开VMware进行配置 1 ...

  4. Mybatis-Plus入门学习笔记(一)

    本文内容 了解Mybatis-Plus 整合Mybatis-Plus 1.了解Mybatis-plus 1.1.Mybatis-Plus介绍 MyBatis-Plus(简称 MP)是一个 MyBati ...

  5. liunx系统mysql全量备份和增量备份

    前提 ​ 在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要. ​ 但是每次都直接导出整个数据库的sql文件,显然是不现实的.对数据库的性能影响比较 ...

  6. 从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案

    内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性.增加用户停留时长的一把利器.短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以 ...

  7. WPF 饼状图,柱形图,折线图 (3 饼状图)

    网址:https://www.cnblogs.com/CSSZBB/p/12746214.html 饼状图相对来说复杂一些.因为需要计算很多坐标,线来看下这个列子. 圆首先想到Ellipse.但是El ...

  8. c++与c#混合编程

    C#写界面比较方便,而C++则擅长写算法,所以将两者结合起来将会加快程序的开发速度,并保证程序的质量.但C#与C++的混合编程有很多细节问题需要注意,下面简要列举一些并指出相应的解决办法. 1. 将本 ...

  9. C# 中await前后执行线程的问题

     悬赏园豆:20 [已解决问题] 浏览: 1763次 解决于 2018-08-15 22:43  今天有点疑惑就写了个测试的代码,发现控制台和Winform中不一样 比如: 控制台: ...Main( ...

  10. C++ template模板编程

    模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者公式.当使用一个vector这样的泛型类型,我们提供足够的信息,就可以将蓝图转换成特定的类或者函数. 假设我们编写一个函数来比较两个 ...