markdown中本地和线上图片自动传图床并替换链接

我根据网上现有的两个Python脚本(《markdown文件中图片到图床的转换》、hxzqlh/qiniu-markdown-pics)以及七牛官方的Python SDK,优化改编了一个新的Python 3脚本,能够自动将markdown中的本地和线上图片(如微信公众号中的图片)批量上传到图床七牛的Bucket,并自动替换markdown文件中的链接。

写作作用流程

在markdown软件(如Typora)中专心进行写作,随意插入本地及网络图片,不需要中断下来传个图。

本地图片可以是电脑中任意位置的文件(使用绝对路径),也可以MD同名文件夹下的图片(使用相对路径)。插入的网络图片也不用担心出现“此图片来自微信公众平台,未经允许不可引用”之类问题,因为脚本处理之后会直接转到到个人的七牛空间。插入网络图片如果是自己的七牛空间里面的图片,脚本会自动忽略,避免重复上传。

插完图之后也可以随时修改,不用担心图片管理混乱的问题(上传的图床的图片不方便管理)。

写作完成,浏览修改,运行

python 脚本路径 MD文件路径 [是否图片压缩]
  • 0 - 不需要压缩
  • 1 - 需要压缩,注意tiniPNGkey

上传之后的七牛中的图片名称为上传日期-MD文件名/image序号.png or jpg,方便后期管理和备份

发表markdown文件到网络,删除备份的MD.bak和清理本地图片。

markdown中本地和线上图片自动传图床并替换链接_第1张图片
mark

需要用到的工具

环境

这是一个Python 3 脚本,在Microsoft Windows 10 (Home Insider Preview China 10.0.17025)、Anaconda 4.3.27、python 3.6.2、PyCharm 2017.2.4 环境调试完成。

运行条件:

import re
import os
import sys
import time
import math
import imghdr
import shutil
import random
import string
import tinify
import urllib
import sqlite3
import operator
from hashlib import md5
from qiniu import Auth, put_file, etag, BucketManager
from datetime import date
import validators

只看了入门书《A Byte of Python》中文版,就能使用上述工具,遇到问题直接Google,中文检索结果就能解决问题。

实现

代码上传到GitHub,此处应该有个流程图。代码中都有详细的注释。

markdown中本地和线上图片自动传图床并替换链接_第2张图片
流程图

点击看大图

脚本配置

存储

网上都说七牛图床好,目录是10G空间+10G流量,图片大小适当控制应该够我用了。等到我不够用的时候,也许我有经济实力购买更多空间和流量了。

先注册七牛个人账号,获取AccessKey/SecretKey、空间名称(bucket name)和域名(domain)

填入python 脚本中

ak = ' '
sk = ' '
domain = ' ' # 上传域名
bucket = '' # 空间名称

图片压缩

调用tinypng来压缩,压缩配置直接照搬《markdown文件中图片到图床的转换》的。七牛的SDK也能提供压缩,后期有空再研究一个两个官方文档,改进一下脚本。

tinify.key = '' # 设置tinipng的key

在非Windows系统运行,还要把脚本中对应的路径的/改为\,已在脚本对应位置注释。

编程感想

由于只看了《A Byte of Python》,只能算是一个初步的Python User。而且不具备系统的Python基础知识,利用google搜索来慢慢调试是非常浪费时间的。这个脚本的编写和调试就用了几个晚上的时间。还花费了一些时间来搜索有没有现有的轮子。

《markdown文件中图片到图床的转换》的脚本修改了一下就能运行,但是这个脚本比较激进,没有备份MD文件就直接覆盖了。hxzqlh/qiniu-markdown-pics的是python 2 脚本,而且我调试时总是出现os.remove无法运行,不知道是在哪里被占用了,只能把os.remove给注释掉,最后再手动删除Temp下面的缓存文件。另外,它是把网络图片下载下来,用的是tempfile.mkstemp方法,这个文件也是要手动删除的。在阅读七牛官方SDK文档时发现它可以直接获取url,不用下载,于是决定还是自己写一个上传函数。

本来想直接有命令行中运行的,但发现安装了Anaconda之后就没办法把模块安装到原版的Python 中,pip install之后的模块都安装在conda中,不过这样也好,在conda中还能自动更新。

markdown图床现有轮子集锦

markdown传图的各种姿势

轮子 描述(教程链接) 批量处理 上传本地图片 转存网络图片 多人维护 安全性
CodeFalling/hexo-asset-image hexo g之后html中图像链接变为绝对路径,插件有时有bug。与hexo qiniu插件合用时需要修改后者 push到GitHub之后MD中的图片链接仍可预览 × 用的人还算多
微信公众号图床 管理方便,微信压缩和CDN 去除了照片信息,更安全。但数据在腾讯手上
新浪图床上传脚本 不需要发布微博,图片只要上传就会存在于图床中 × × × 图床不稳定,链接没保障
hexo-qiniu-sync qiniu官方传图插件,需要学习一下如何配置。教程2 ×
批量替换网络图片的py2脚本 os.remove运行出错。需要手动删除缓存文件。本文已改进 × ×
qiniu-image-tool AutoHotkey和qshell实现,一键上传图片或截图至七牛云,获取图片的markdown引用至剪贴板,并自动粘贴到当前编辑器。经常出错 × ×
MWeb for Mac
批量替换本地图片的py3脚本 如正文所述 ×
laobie/WriteMarkdownLazilypy2 自动化替换 Markdown 中的本地图片引用,使用LeadCloud × ×
上传图片到七牛的py2脚本 × ×
markdown图片实用工具 利用Python和AutoHotKey实现 × ×
极简图床 全球CDN加速, 支持外链、不限流量的免费图床 × ×
MPic-图床神器 完成度非常高的插图小软件,支持压缩 × × 软件未开源
GitHub上的更多开源工具

原文发表于:

markdown中本地和线上图片自动传图床并替换链接

你可能感兴趣的:(markdown中本地和线上图片自动传图床并替换链接)