為什麼會有這樣的需求?
筆者經常用markdown寫一些東西,圖片是文章中必不可少的。一般情況下,都是先是將畫好的圖儲存到本地的某個地方,然後手動將圖片上傳到OSS(如七牛雲),最後拷貝外鏈地址加到文章中。 另一種場景是加水印。原創不易,有時候會發生第一天晚上寫好的部落格文章,第二天就出現在某公眾號號,並且申請了原創保護。這個時候如果圖片上有個特殊水印,原封不動地拷貝文章就有出處可尋。雖然不能完全解決這種侵權的行為,但是也提高了抄襲者的成本。
具體實現
至於具體實現,我當時考慮了幾個問題:
- 檔案下載了之後,能不能立即將該資料夾的變化輸出;
- 將下載後的檔案能夠加上預置好的水印(這個OSS肯定能夠提供);
- 根據輸出的新增檔名(圖片名),將該檔案上傳到OSS;
- 返回圖片檔案的外鏈地址。
涉及到的工具:
- 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
。
在上圖中,還可以看出筆者繫結了域名http://image.blueskykong.com
,這個可以自行選擇,如果不繫結,可以使用測試域名。繫結域名之後,記得將該域名設為外鏈預設域名。
這裡之所以這樣做,是為了後面指令碼返回最後的外鏈地址(我定義的規則為:拼接外鏈預設域名 + 檔名)。
然後,設定水印樣式,筆者在圖片的右下角新增了文字水印公眾號:aoho求索
。當然還可以對圖片進行其他樣式設定,如縮放圖片,設定長寬等,讀者根據需要自定。設定好之後,如下圖所示:
我們需要的其實是,最後生成的處理介面,這會用在我們的上傳指令碼中。
指令碼編寫
上面的步驟中,我們先是記錄了特定檔案的新增圖片名記錄,其次是設定好我們的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。祕鑰在個人中心可以找到:
測試
啟動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