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