使用automator上傳圖片到騰訊雲

背景

前段時間折騰了一下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建立的服務
  • 調用預先編寫好的腳本進行上傳
  • 上傳後將url寫入剪貼板
  • 在markdown編輯器中直接粘貼享用

實現步驟

打開automator,選擇新建服務:shell

而後在「實用工具」中,找到「拷貝至剪切板」拖拽到右側工做流程,這樣,當咱們選中圖片的時候,就會將圖片的本地路徑設置到剪貼板中:api

咱們須要在這個建立服務的過程當中進行實際測試,所以能夠將「得到指定的訪達(finder)項目」這個使用工具添加到右側的工做流中,放在頂部,並添加幾張圖片做爲測試用(後面須要再刪除的),以下圖:bash

而後點擊右上角的運行按鈕,運行完成後,查看本身的剪貼板內容,就會發現剪貼板內容正是圖片的路徑。markdown

如今圖片路徑有了,再添加一個shell腳本的工做流,在腳本里面獲取剪貼板裏面的圖片路徑,而後進行上傳,再將上傳後的騰訊雲的圖片地址設置進剪貼板裏,就好了。hexo

將「運行shell腳本」這個工做流添加到右邊,做爲第三個工做流,而且選擇python做爲默認shell,以下圖:app

上圖中的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就算完成了。不足之處就是隻能對磁盤上的圖片文件進行操做。沒法對截圖進行操做。其實理論上只要能獲取剪貼板的內容,截圖上傳也是能夠實現的。

參考:

相關文章
相關標籤/搜索