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和清理本地图片。




需要用到的工具

环境

这是一个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,此处应该有个流程图。代码中都有详细的注释。

input pathis mdimgs=re->len(imgs)>0for img in imgsis online imagevalidated urlalready in my qiniuignoreupload qiniureplace url to mdreplace mdimg existsis imageimg.orl existsselect url from sqlimg url existzip imageabsolute img pathoutis folderfiles=os.listdir(path)for file in filesyesnoyesnoyesnoyesnoyesnoyesnoyesnoyesnoyes




脚本配置

存储

网上都说七牛图床好,目录是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传图的各种姿势(知乎不支持表格,点击这里看表格)

原文发表于:markdown中本地和线上图片自动传图床并替换链接

发布于 2017-11-20

文章被以下专栏收录