mac下使用指令碼為圖片加水印、上傳圖床

aoho發表於2018-06-13

為什麼會有這樣的需求?

筆者經常用markdown寫一些東西,圖片是文章中必不可少的。一般情況下,都是先是將畫好的圖儲存到本地的某個地方,然後手動將圖片上傳到OSS(如七牛雲),最後拷貝外鏈地址加到文章中。 另一種場景是加水印。原創不易,有時候會發生第一天晚上寫好的部落格文章,第二天就出現在某公眾號號,並且申請了原創保護。這個時候如果圖片上有個特殊水印,原封不動地拷貝文章就有出處可尋。雖然不能完全解決這種侵權的行為,但是也提高了抄襲者的成本。

具體實現

至於具體實現,我當時考慮了幾個問題:

  1. 檔案下載了之後,能不能立即將該資料夾的變化輸出;
  2. 將下載後的檔案能夠加上預置好的水印(這個OSS肯定能夠提供);
  3. 根據輸出的新增檔名(圖片名),將該檔案上傳到OSS;
  4. 返回圖片檔案的外鏈地址。

涉及到的工具:

  • OS: macOS
  • 圖床:七牛雲
  • 檔案監控工具:fswatch

筆者整理了使用的七牛雲的儲存SDK,主要是上傳&預轉持續化,將圖片加水印上傳到對應的bucket中。這僅是一個小工具,目前已經能滿足筆者的需求。

檔案監控工具:fswatch

Linux下面可以使用inotify-tools來進行資料夾、檔案變更的檢測。

fswatch是一個使用Mac OS X FSEvents API的同步工具,同時也可以使用在BSD 與Debian作業系統。

使用Homebrew進行安裝:

brew install fswatch
複製程式碼

監控/User/usr/Downloads資料夾:

fswatch /User/usr/Downloads
複製程式碼

當/User/usr/Downloads檔案內容變化時,輸出變動的檔案列表。如:

/Users/user/Downloads/PlatformTransactionManager.jpg
複製程式碼

當然fswatch還有其他用法,這裡不展開。

七牛雲建立bucket以及樣式

首先需要註冊七牛雲的賬號,點選註冊通道註冊(筆者這裡不是專門打廣告,沒有收取任何廣告費。。)。

其次,建立一個bucket。如下圖,筆者命名為bl-bucket

mac下使用指令碼為圖片加水印、上傳圖床

在上圖中,還可以看出筆者繫結了域名http://image.blueskykong.com,這個可以自行選擇,如果不繫結,可以使用測試域名。繫結域名之後,記得將該域名設為外鏈預設域名。

mac下使用指令碼為圖片加水印、上傳圖床

這裡之所以這樣做,是為了後面指令碼返回最後的外鏈地址(我定義的規則為:拼接外鏈預設域名 + 檔名)。

然後,設定水印樣式,筆者在圖片的右下角新增了文字水印公眾號:aoho求索。當然還可以對圖片進行其他樣式設定,如縮放圖片,設定長寬等,讀者根據需要自定。設定好之後,如下圖所示:

mac下使用指令碼為圖片加水印、上傳圖床

我們需要的其實是,最後生成的處理介面,這會用在我們的上傳指令碼中。

指令碼編寫

上面的步驟中,我們先是記錄了特定檔案的新增圖片名記錄,其次是設定好我們的bucket、外鏈域名以及水印樣式。下面我們進行編碼。

啟動fswatch後,輸出變動檔案記錄到指定的檔案,之後主要分為三步:

  • 我們的指令碼基於Python,安裝七牛雲的Python SDK,具體參考官網Python SDK
  • 讀取指定檔案記錄的變化的值,這裡筆者指定讀取最後一行(變動其實是主動的,所以只需要最後一行的記錄即為新增的圖片檔案)
  • 將該檔案進行上傳,用到的是七牛雲的上傳&預轉持續化
# -*- coding: utf-8 -*-
# flake8: noqa

from qiniu import Auth, put_file, etag, urlsafe_base64_encode
import qiniu.config
from qiniu import BucketManager
from optparse import OptionParser
# 水印上傳函式
def watermark_add(filename):
	#要上傳的空間
	bucket_name = 'bl-bucket'

	#上傳到七牛後儲存的檔名
	arr = filename.split("/")
	
	key = arr[len(arr)-1]
	# 設定圖片縮略引數
	fops = 'imageView2/0/q/75|watermark/2/text/5YWs5LyX5Y-377yaYW9ob-axgue0og==/font/5b6u6L2v6ZuF6buR/fontsize/400/fill/IzAwMDAwMA==/dissolve/50/gravity/SouthEast/dx/10/dy/10'

	# 通過新增'|saveas'引數,指定處理後的檔案儲存的bucket和key,不指定預設儲存在當前空間,bucket_saved為目標bucket,key_saved為目標key
	encode_str = bucket_name + ":" + key

	saveas_key = urlsafe_base64_encode(encode_str)

	fops = fops+'|saveas/'+saveas_key

	access_key = 'xxx'
	secret_key = 'xxx'

	#構建鑑權物件
	q = Auth(access_key, secret_key)

	#生成上傳 Token,可以指定過期時間等
	# 在上傳策略中指定fobs和pipeline
	policy={
	  'persistentOps':fops
	 }

	token = q.upload_token(bucket_name, key, 3600, policy)

	#要上傳檔案的本地路徑
	localfile = filename

	ret, info = put_file(token, key, localfile)
	print("http://image.blueskykong.com/" + key)
	assert ret['key'] == key
	assert ret['hash'] == etag(localfile)
	pass

# 直接上傳函式
def upload_pic(filename):
	....#較為簡單,此處省略

# 獲取變化的檔名
def get_upload_name(fname):
  with open(fname, 'r') as f:  #開啟檔案
    lines = f.readlines() #讀取所有行
    first_line = lines[0] #取第一行
    last_line = lines[-1] #取最後一行
    return last_line

fname='nohup.out'
if __name__ == '__main__':
  l = get_upload_name(fname)
  l=l.replace("\n", "")
#  print (l)
  watermark_add(l)
#  print (upload_pic(l))
複製程式碼

如上的指令碼即可,讀者需要自行設定access_key、secret_key、fname(fswatch輸出的檔名)、bucket_name。祕鑰在個人中心可以找到:

mac下使用指令碼為圖片加水印、上傳圖床

測試

啟動fswatch監聽/Users/user/Documents/pic/,並輸出記錄到nohup.out檔案中。

nohup fswatch /Users/user/Documents/pic/ &
複製程式碼

fswatch會在後臺程式持續監聽。筆者還寫了個bash命令,指令碼可以寫得很簡單,如下:

#! /bin/bash
echo "uploading pic..."
echo "url is : "
python upload.py
exit 0
複製程式碼

每次上傳圖片後,執行該命令直接得到到如下的輸出:

uploading pic...
url is :
http://image.blueskykong.com/secret-qiniu.jpg
複製程式碼

這是在本地截圖儲存之後,執行指令碼的輸出內容。http://image.blueskykong.com/secret-qiniu.jpg即為我們上傳圖片的外鏈地址。

總結

一個小工具的分享,適合在mac下用markdown寫作的小夥伴,減輕一些繁瑣的操作。目前來說,能滿足筆者的需求,也沒啥高階的地方。如果大家有改進或者更好的工具,記得留言分享。當然,如果有不清楚的地方,可以參考git專案https://github.com/keets2012/Sync-Pic.git。

七牛雲註冊地址: https://portal.qiniu.com/signup?code=3lffq8tzqxc9e

訂閱最新文章,歡迎關注我的公眾號

微信公眾號

參考

OS X使用fswatch+rsync自動檢測資料夾改動並同步

相關文章