使用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. 关于Ajax异步提交登录及增删改查小项目制作-登录

    一.登录的完成 先导包jquery和MySql //异步提交 <script type="text/javascript" src="js/jquery-1.8.2 ...

  2. Java社区——个人项目开发笔记(二)

    1.B\S架构通信原理 浏览器,服务器之间产生通信,浏览器访问服务器,服务器返回一个HTML,浏览器会对HTML进行解析,并渲染相关的内容. 在解析过程中,会发现HTML里引用了css文件,js文件, ...

  3. WPF三维立体效果3D

    并不是真的3D,类似游戏的2.5D. 先上效果图. 变形一下也可以 起先我是想,把这种绘图啊啥的,都做成控件,给别人直接用就行了.但是做的过程中发现. 要做简单易用的控件,实在是花时间.  而且花的时 ...

  4. 十:JavaWeb中的监听器(一)

    2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...

  5. (强制)要求覆写equals必须覆写hashCode(原理分析)

    hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等.众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快.对象通过调用Obje ...

  6. Java静态内部类——重点是精妙的demo

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/cd18333612683/article/details/79129503什么是内部类大部分时候,类 ...

  7. 初识cookie

    package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...

  8. linux高级监控atop的使用

    一.centos安装 sudo yum -y install epel-release.noarch sudo yum -y install atop sudo systemctl enable at ...

  9. Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理

    前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...

  10. Tomcat 端口配置及原理详解

    1. tomcat 文件配置详细说明 tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口配置路径为tomcat\ c ...