前段时间折腾了一下hexo博客,部署了Github Pages,设置了本身的域名转发,添加了https,仿佛万事具有,只差写博客了。然而发现博客配图仍是个问题,由于markdown添加图片的时候,我想使用cdn,而不是本地图片。html
因而考察了一些能够做为图床的云服务商,好比七牛,sm.ms,腾讯云 。对比以后发现七牛不支持https,sm.ms彻底免费,但功能彷佛比较少,腾讯云的话有免费的几十G空间(具体多少我忘了)还提供https。嗯就用腾讯云吧。python
图床选好了,那么上传图床的工具呢?都说iPic是个图床神器,最近还支持了腾讯云,不过须要付费。我须要的是一个免费版的,找了半天也没发现支持腾讯云的图床工具。做为一名coder,这怎么能忍?依稀记得好友的博客中有写使用automator上传图片到sm.ms,因而我借鉴(copy)了一下,就有了本文。不一样之处在于我这里使用的是腾讯云的python sdk进行上传。git
使用automator上传图片的思路:github
打开automator,选择新建服务:shell
而后在“实用工具”中,找到“拷贝至剪切板”拖拽到右侧工做流程,这样,当咱们选中图片的时候,就会将图片的本地路径设置到剪贴板中:api
咱们须要在这个建立服务的过程当中进行实际测试,所以能够将“得到指定的访达(finder)项目”这个使用工具添加到右侧的工做流中,放在顶部,并添加几张图片做为测试用(后面须要再删除的),以下图:markdown
而后点击右上角的运行按钮,运行完成后,查看本身的剪贴板内容,就会发现剪贴板内容正是图片的路径。hexo
如今图片路径有了,再添加一个shell脚本的工做流,在脚本里面获取剪贴板里面的图片路径,而后进行上传,再将上传后的腾讯云的图片地址设置进剪贴板里,就好了。app
将“运行shell脚本”这个工做流添加到右边,做为第三个工做流,而且选择python做为默认shell,以下图:编辑器
上图中的python代码所作的事情就是上传图片,并设置剪贴板内容,code以下:
# -*- coding=utf-8 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import os import subprocess # 上传腾讯云须要的相关配置,可在这里查看:https://console.cloud.tencent.com/cam/capi secret_id = 'your_cos_secret_id' # 此处填入腾讯云的secret_id, secret_key = 'your_cos_secret_key' # 此处填入腾讯云的secret_key app_id = 'your_app_id' # 此处填入app_id region = 'your_region' # 此处填入对象存储的地区 token = '' # 使用临时秘钥须要传入 Token,默认为空,可不填 bucket_name = 'your_bucket_name' bucket = bucket_name + '-' + app_id # Bucket由bucketname-appid组成 legal_extensions = ['.jpg', '.jpeg', '.png', 'gif'] # 获取剪贴板内容 def getClipboardData(): p = subprocess.Popen(['pbpaste'], stdout=subprocess.PIPE) retcode = p.wait() data = p.stdout.read() return data # 设置剪贴板内容 def setClipboardData(data): p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE) p.stdin.write(data) p.stdin.close() retcode = p.wait() # 判断扩展名是否合法 def validate_image(path): extension = os.path.splitext(path)[1] if extension in legal_extensions: return True else: return False # 上传至腾讯云 def upload(file_name, filepath): config = CosConfig(Appid=app_id, Secret_id=secret_id, Secret_key=secret_key, Region=region, Token=token) # 获取客户端对象 client = CosS3Client(config) with open(filepath, 'rb') as fp: response = client.put_object( Bucket=bucket, Body=fp, Key=file_name, StorageClass='STANDARD', ContentType='text/html; charset=utf-8' ) # print response def main(): contents = getClipboardData().split("\n") uploaded_url = "" for path in contents: if validate_image(path): file_name = os.path.basename(path) upload(file_name, path) # 拼接成markdown的image连接格式 uploaded_url += '\n" # 将url设置到剪贴板中 setClipboardData(uploaded_url) main() 复制代码
代码量很少,其中上传函数upload
的实现是使用的官方sdk.如何安装sdk,以及更多使用方式,请参考官方文档
tips: 这里运行的过程当中不但能够单步调试,还能够查看程序输出,以便进行测试:
到这里上传功能已经实现了,若是再加一个上传完成后给个提示就更好了。
将“显示通知”这个工做流添加到右侧工做区,设置通知内容,而后执行,就会看到通知提示
至此,功能已经实现,如今把第一个工做流“获取指定的finder项目”删除。保存这个服务,并取一个名字:
而后随便找一个图片,右键呼出菜单,就会看到咱们刚建立的服务,不出意外,就能够正常使用了:
若是下次再想对这个服务进行编辑的话,该去哪里找呢?其实这些自定义的服务是放在~/Library/Services
路径下的:
> ls ~/Library/Services 上传至腾讯云.workflow 复制代码
到这里,这个上传图片的automator就算完成了。不足之处就是只能对磁盘上的图片文件进行操做。没法对截图进行操做。其实理论上只要能获取剪贴板的内容,截图上传也是能够实现的。
参考: