1

使用automator上传图片到腾讯云

 2 years ago
source link: https://popwalker.github.io/article/38b3f2da/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用automator上传图片到腾讯云

发表于

2018-05-08

|

更新于 2018-05-09

| 评论数:

| 阅读次数:

前段时间折腾了一下hexo博客,部署了Github Pages,设置了自己的域名转发,添加了https,仿佛万事具备,只差写博客了。然而发现博客配图还是个问题,因为markdown添加图片的时候,我想使用cdn,而不是本地图片。

于是考察了一些可以作为图床的云服务商,比如七牛sm.ms腾讯云 。对比之后发现七牛不支持https,sm.ms完全免费,但功能似乎比较少,腾讯云的话有免费的几十G空间(具体多少我忘了)还提供https。嗯就用腾讯云吧。

图床选好了,那么上传图床的工具呢?都说iPic是个图床神器,最近还支持了腾讯云,不过需要付费。我需要的是一个免费版的,找了半天也没发现支持腾讯云的图床工具。作为一名coder,这怎么能忍?依稀记得好友的博客中有写使用automator上传图片到sm.ms,于是我借鉴(copy)了一下,就有了本文。不同之处在于我这里使用的是腾讯云的python sdk进行上传。

使用automator上传图片的思路:

  • 点击本地图片,右键选择automator创建的服务
  • 调用预先编写好的脚本进行上传
  • 上传后将url写入剪贴板
  • 在markdown编辑器中直接粘贴享用

打开automator,选择新建服务:

然后在“实用工具”中,找到“拷贝至剪切板”拖拽到右侧工作流程,这样,当我们选中图片的时候,就会将图片的本地路径设置到剪贴板中:

我们需要在这个创建服务的过程中进行实际测试,因此可以将“获得指定的访达(finder)项目”这个使用工具添加到右侧的工作流中,放在顶部,并添加几张图片作为测试用(后面需要再删除的),如下图:

然后点击右上角的运行按钮,运行完成后,查看自己的剪贴板内容,就会发现剪贴板内容正是图片的路径。

现在图片路径有了,再添加一个shell脚本的工作流,在脚本里面获取剪贴板里面的图片路径,然后进行上传,再将上传后的腾讯云的图片地址设置进剪贴板里,就行了。

将“运行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 += '![](' + 'https://' + bucket + '.cos.' + region + '.myqcloud.com/' + file_name + ")\n"

# 将url设置到剪贴板中
setClipboardData(uploaded_url)


main()

代码量不多,其中上传函数upload的实现是使用的官方sdk.如何安装sdk,以及更多使用方式,请参考官方文档

tips: 这里运行的过程中不但可以单步调试,还可以查看程序输出,以便进行测试:

到这里上传功能已经实现了,如果再加一个上传完成后给个提示就更好了。

将“显示通知”这个工作流添加到右侧工作区,设置通知内容,然后执行,就会看到通知提示

至此,功能已经实现,现在把第一个工作流“获取指定的finder项目”删除。保存这个服务,并取一个名字:

然后随便找一个图片,右键呼出菜单,就会看到我们刚创建的服务,不出意外,就可以正常使用了:

如果下次再想对这个服务进行编辑的话,该去哪里找呢?其实这些自定义的服务是放在~/Library/Services路径下的:

> ls ~/Library/Services
上传至腾讯云.workflow

到这里,这个上传图片的automator就算完成了。不足之处就是只能对磁盘上的图片文件进行操作。无法对截图进行操作。其实理论上只要能获取剪贴板的内容,截图上传也是可以实现的。

请作者吃个鸡腿吧!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK