使用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 ...
随机推荐
- Python语言系列-04-高阶函数
闭包 #!/usr/bin/env python3 # author:Alnk(李成果) # 什么是闭包 # 1,闭包存在于函数中 # 2,闭包就是内层函数对外层函数(非全局变量)的引用 # 3,最内 ...
- NOIP 模拟 $30\; \rm 毛二琛$
题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...
- java实现随机字母数字验证码
生成随街验证码 VerifyCode 工具类 package com.meeno.common.cerifycode; import javax.imageio.ImageIO; import jav ...
- SQL中的聚合函数运用
参考网址: https://zhuanlan.zhihu.com/p/245115561 聚合函数是什么 聚合函数是对一组值执行计算,并返回单个值的函数.常与 SELECT 语句的 GROUP BY ...
- 从0开始搭建一个IoC容器(C#版)
网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...
- Socket编程 Tcp和粘包
大多数程序员都要接触网络编程,Web开发天天和http打交道.稍微底层一点的程序员,就是TCP/UDP . 对程序员来说,Tcp/udp的核心是Socket编程. 我的浅薄的观点---------理解 ...
- [C#]c#中数据的同步加锁机制 的几种方法
一,锁定机制最简单的做法就是使用锁定关键字Lock.Lock关键字英文中就是锁的意思,顾名思义就是为操作加上一把锁.它的语法如下: lock(lockObj){//加锁的代码段,一般是操作共同资源的代 ...
- 处理URLs
问题 你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs. 方法 在你解析文档时确保有指定base URI,然后 使用 abs: 属性前缀来取得包含base URI ...
- 【java虚拟机】内存溢出解决思路
转自:https://blog.csdn.net/u013521220/article/details/79523633 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知 ...
- CrackMe-CFF Crackme #3
转载自:OllyDbg入门教程 我们先来运行一下这个 crackme(用 PEiD 检测显示是 Delphi 编的),界面如图: 这个 crackme 已经把用户名和注册码都输好了,省得我们动手^_^ ...