0%

Alfred Workflow —— 上传剪贴板的图片到七牛

前言

虽然MWeb可以方便上传本地图片到图床,但是操作还是比较麻烦,如果能够截图之后就直接上传图床,并且返回Markdown格式的链接,岂不是更方便。

思路

  1. 获取剪贴板内容,判断是否是图片
  2. 如果是图片,保存到本地缓存,拿到路径
  3. 使用七牛SDK上传图片,返回图片地址

代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

import datetime
import os
import sys
import atexit
import imghdr
from subprocess import call
from os.path import expanduser, exists, basename, getsize

from qiniu import Auth, put_file, etag

# 获取剪贴板里的图片,并且保存到 本地 tmp 文件夹
def capture():
try:
call(['/usr/local/bin/pngpaste', '-v'], stderr=open('/dev/null', 'w'))
except OSError:
print('please preinstall pngpaste use `brew install pngpaste` before use this script')
sys.exit()

file_name = datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S.png')
file_path = os.path.join('/tmp', file_name)
atexit.register(lambda x: os.remove(x) if os.path.exists(x) else None, file_path)
save = call(['/usr/local/bin/pngpaste', file_path])
if save == 1:
sys.exit()
return file_path, file_name


if sys.argv.__len__() == 1:
file_path, file_name = capture()

else:
# 任意字符代表捕获粘贴板
file_path = expanduser(sys.argv[-1])
if not exists(file_path):
file_path, file_name = capture()
else:
if imghdr.what(file_path) not in ['jpeg', 'jpg', 'png']:
sys.exit('file type error')
file_name = basename(file_path)


#需要填写你的 Access Key 和 Secret Key
access_key = ''
secret_key = ''

#域名前缀
qiniu_URL = ''

#构建鉴权对象
q = Auth(access_key, secret_key)

#要上传的空间
bucket_name = ''

#上传到七牛后保存的文件名
key = file_name

#生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, key, 3600)

#要上传文件的本地路径
localfile = file_path

#上传文件到七牛
info = put_file(token, key, localfile)

if info:
print qiniu_URL + file_name
else:
print '上传失败!'

代码说明

需要安装 pngpaste,可以使用 homebrew 安装: brew install pngpaste

代码存在的问题

仅能识别截图,不能上传file。

添加到 Alfred

新建一个Workflow,设置快捷键,然后把代码拷贝到 Run Script,第三个是获取打印的结果。

获取到 Python 打印的 字符串到剪贴板

演示