markdown贴图自动化处理.
自动化处理剪贴板图片,上传到图床,粘贴url到剪贴板.
更新
1
2
3
419.04.11 初版
19.04.13 因win下GDK装不上,更换库,支持linux/win
19.04.13 加上错误处理,只打印,防止脚本中止
19.04.30 修正错误
- 思路参考:
http://weishu.me/2015/10/16/simplify-the-img-upload-in-markdown/
https://github.com/wuchangfeng/markdown-helper
导语
- 写2-3-4树+红黑树时,贴图比前面几篇多了好多,一张一张上传到图床,简直要了命.
- 自动化才是王道,只能抽出时间写了这个小脚本,舒服多了.
- 代码在 sm-markdown
- 在 win10 上面,尝试 GDK 实在是各种问题,只能换用
- upimage.py linux.
- upimage2.py win/mac
- 如果没有别的变动,应该暂时是最终版本了.
方案
需求
- 截图到剪贴板即自行上传到图床.url直接复制到剪贴板,做到真正一步到位.
- 不留临时文件.
主要支持linux, win附带不要改动太大.- 兼容 linux/win,这一点非常难…到现在还没找到合适的…
开始找到了markdown-helper,作者思路很好,但拖动到.py文件,还是有些麻烦.但这个可以在 linux/win 下通用.
之后历经搜索简化markdown写作中的贴图流程,但 linux 下没法用…
动手自己写吧.
库
- py的库对linux下剪贴板支持有点差,pyperclip只支持文本,而其他的要安装额外的软件,通过py进入终端使用.
虽然比较笨重,还是上了 gtk ,gtk原本就是 GUI 的开发,其剪贴板功能绝对够用了,还附带跨平台,虽然 win 下安装比较笨重,何止笨重啊,安装完各种问题,有这时间,我 GUI 都写好了.- 这次借用的是 PIL 的 ImageGrab 模块, PIL 年久失修,需要安装对应 python3 的版本 Pillow.
GTK(linux)
- GTK 安装
- GTK 剪贴板API
pillow(win/mac)
pip install pillow
- 暂时用不到其他的功能,故略.
其他模块借用之 .md 的代码.
程序
暂时没有使用剪贴板变动通知,要同时支持linux/win通知很难找,目前是1s轮寻.
图床还是SM.MS
粘贴到剪贴板的还是图片的 url,除markdown外,其他场景下使用,就没有转换成 Markdown 的图片格式.
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82#!/usr/bin/python3
import requests
import json
from glob import glob
import time
import os
from PIL import ImageGrab
import pyperclip
params = {'format': 'json', 'ssl': True}
prefix = 'https://sm.ms/api'
image_name = "tmp.jpg"
# 上传图片
def api_upload(image):
'''upload an image file'''
files = {'smfile': open(image, 'rb')}
resp = requests.post('{}/upload'.format(prefix),
files=files,
params=params)
return resp.text
# 上传图片
def upload(filename):
images = glob(filename)
if not images:
print('%s not image' % (filename))
for image in images:
# upload an image
resp = json.loads(api_upload(image))
# 返回上传图片的url
if resp['code'] == 'error':
# 打印错误信息
print('uploda error msg:%s' % (resp['msg'].lower()))
return None
else:
# print('%s upload success' % (filename))
return resp['data']['url']
# 剪贴板获取图片
def get_image_Clipboard():
image = ImageGrab.grabclipboard()
if image:
image.save(image_name, 'JPEG')
return True
else:
return False
# url复制到剪贴板
def set_url_Clipboard(url):
if isinstance(url, str):
pyperclip.copy(url)
else:
print('url type error')
# 删除临时文件
def del_flie(fliename):
os.remove(fliename)
if __name__ == "__main__":
while True:
if is_image_exsit(image_name) or get_image_Clipboard():
try:
url = upload(image_name)
set_url_Clipboard(url)
print(url)
del_flie(image_name)
except BaseException as e:
print('upimage falid')
finally:
pass
time.sleep(1)