Python對接PicGo實現(xiàn)圖片自動加水印并上傳操作示例
1. 天下苦搬運黨久矣
對于我這樣經(jīng)常需要寫點文章的技術(shù)自媒體來說,很經(jīng)常早上我才在公眾號首發(fā)了原創(chuàng)文章,中午就有人同步到了知乎、今日頭條等外部平臺,并且拿到了該篇文章在這些平臺的首發(fā)。

平臺的首發(fā)很重要,以微信的公眾號平臺來說,一篇文章能否在公眾號標原創(chuàng),就是通過檢測是否在公眾號平臺上首發(fā),如果公眾號的文章庫里沒有搜索到與你文章相似度較高的文章,那么你就可以標原創(chuàng)了。
為了解決了首發(fā)的問題,我付費使用了 OpenWrite 這個平臺,每個月 20 塊錢的費用,一鍵就可以分發(fā)各大平臺,非常的省心~
首發(fā)固然重要,但有時候也沒那么重要。
因為有專門的培訓機構(gòu)(這里就不點名,避免給他們反向營銷)就是拿你的文章去給自己的帳號堆干貨,吸引關(guān)注,他們才不在乎原創(chuàng)不原創(chuàng),只要文章能發(fā)布就行了。
這種人在知乎這種沒有原創(chuàng)檢測機制的平臺,可以活得很好。
之前有一無良培訓機構(gòu)在知乎上生產(chǎn)了10幾個號,批量搬運我以及一些朋友的原創(chuàng)文章。那時候,我每天都可以舉報好多。

漸漸地,我累了,自己寫了幾百篇的文章,如果一篇一篇去檢查,那我這一天基本啥事都做不了,違權(quán)成本實在太高了。
考慮到我的文章都有非常多的圖片,為了讓這些人在白嫖我文章的同時,也能給我?guī)睃c收益(當然人家是不可能付費的,但至少能給我的公眾號打打廣告也是非常奈斯的)。
于是我就想啊,是不是可以自己寫個工具,給自己的每張配圖上都加上自己的水印,看他們還盜不盜。。
2. 目前的圖床管理工具
在開始講如何利用 Python 來實現(xiàn)我的需求之前 ,我有必要介紹下我的圖床管理工具。
我在寫文章的時候,主要用到三款工具:
Typora :Markdown 文案的編輯Snipaste:非常好用的截圖工具PicGo:非常人性的圖床管理工具

其中今天的要參與的主角是 PicGo

它對當下主流的圖床平臺都提供了很好的支持

當我使用了 Snipaste 截圖后,再按住快捷鍵(⌘ ⇧ P),就可以立即將你的圖床上傳至指定圖床,并且將上傳后的鏈接以 markdown 的圖片格式復制到剪切板中,你可以直接粘貼使用。
3. 方案的設想
由于這一整工具,我已經(jīng)使用了三年,各種操作都非常的熟悉,對他們我已經(jīng)產(chǎn)生了極度的依賴,因此現(xiàn)在我想要實現(xiàn)自動加水印的功能,也一定是建立在這套工具的基礎(chǔ)上完成的。
Snipaste 和 PicGo 本身都不支持自定義水印,也不提供第三方插件的開發(fā)入口。
Snipaste 和 PicGo 之所以能夠在一起工作,是因為有了剪切板這個橋梁,因此想要實現(xiàn)自己的需求,只能從剪切板上尋找突破口。
多余的廢話就不多說了,我直接說下我的方案:
在 Snipaste 將圖像放入剪切板后由我敲入自定義的熱鍵去觸發(fā) Python 腳本去從剪切板中讀取圖像然后使用 PIL 去給該圖像加水印,重新放入剪切板中接著利用 Python 腳本去自動化觸發(fā) PicGo 的快捷鍵PicGo 被激活后,就能將帶有水印的圖片上傳到圖床
為了讓你對這個方案,有一個直觀的理解,我特地畫了一張流程圖,其中虛線就是我得自己實現(xiàn)的功能。

4. 代碼完整解析
4.1 定義熱鍵并監(jiān)聽鍵盤
在 Python 中有一個 pynput 庫,利用它可以來監(jiān)聽系統(tǒng)的鍵盤。
在它的官方文檔中,很快找到了一個可以自定義熱鍵組合的方案。
from pynput import keyboard
def on_activate():
print('Global hotkey activated!')
def for_canonical(f):
return lambda k: f(l.canonical(k))
hotkey = keyboard.HotKey(
keyboard.HotKey.parse('<ctrl>+<alt>+h'),
on_activate)
with keyboard.Listener(
on_press=for_canonical(hotkey.press),
on_release=for_canonical(hotkey.release)) as l:
l.join()
但是很遺憾的是,這個功能目前來看是有 BUG 的,我在 Mac 上親測是沒有效的,而在 github 的 issue 中也有人在 2020 年8月反應過問題, 沒想到到現(xiàn)在還沒有解決

雖然它本身提供的組合鍵監(jiān)聽模式無法使用,但普通的監(jiān)聽模式還是可以使用的,只要有這個做為基礎(chǔ),那我自己造輪子也不難實現(xiàn)組合熱鍵的功能。
第一步:先定義好你的熱鍵
upload_pic_set = {
keyboard.Key.ctrl.value.vk,
keyboard.Key.cmd.value.vk,
keyboard.Key.alt.value.vk,
keyboard.KeyCode(35).vk
}
第二步:監(jiān)聽所有的鍵盤動作
with keyboard.Listener( on_press=on_press, on_release=on_release) as listener: listener.join()
只要有一個鍵處于 press 的狀態(tài),就往列表中存放這個鍵
key_list = []
def on_press(key):
if isinstance(key, keyboard.KeyCode):
key_list.append(key.vk)
elif isinstance(key, keyboard.Key):
key_list.append(key.value.vk)
if set(key_list) == upload_pic_set:
image = get_image_from_clipboard()
new_image = make_watermark(image)
put_image_to_clip(new_image)
upload_image_via_picgo()
notify_to_mac("成功添加水印并上傳到圖床")
但是一旦有鍵釋放了,就要清空這個列表
def on_release(key): key_list.clear()
每一次按下鍵都會檢查,key_list 是否等于 定義好的快捷鍵,如果剛好是相等,就可以開始圖片的處理邏輯了。
if set(key_list) == upload_pic_set: pass
4.2 從內(nèi)存中讀取圖像
PIL 有一個 ImageGrab 模塊,在這個模塊中有一個 grabclipboard 函數(shù),它實現(xiàn)了從剪切板中讀取圖像的功能,不過讀取的 rgb 格式,由于我們后面加水印時,必須使用 rgba 格式才可以,因此再用 convert 轉(zhuǎn)一下。
from PIL import ImageGrab
img_rgb = ImageGrab.grabclipboard()
image = img_rgb.convert("RGBA")
4.3 添加水印生成新圖像
以下是添加水印的代碼,其實可能要注意的一點就是如果你的文字里包含中文,那么選擇字體時一定要是中文字體,否則會出現(xiàn)方塊字
def make_watermark(image):
txt = Image.new('RGBA', image.size, (0, 0, 0, 0))
fnt = ImageFont.truetype("/System/Library/Fonts/STHeiti Medium.ttc", 20)
draw = ImageDraw.Draw(txt)
draw.text(((txt.size[0]-300)//2, txt.size[1]-40), "微信公眾號: Python編程時光", font=fnt, fill=(240, 49, 48, 255))
draw.text(((txt.size[0]-300)//2, txt.size[1]-70), "未經(jīng)授權(quán)請勿轉(zhuǎn)載", font=fnt, fill=(240, 49, 48, 255))
out = Image.alpha_composite(image, txt)
return out
4.4 將新圖像重新放入剪切板
內(nèi)置的 io 模塊支持在內(nèi)存中讀寫 bytes,只要PIL 的 image 對象在 save 的時候保存保存在 BytesIO 對象中,然后通過 pasteboard 模塊從 BytesIO 對象中載入數(shù)據(jù),就可以實現(xiàn)往剪切板中放入圖像的功能。
def put_image_to_clip(image): img_byte_arr = io.BytesIO() pb = pasteboard.Pasteboard() image.save(img_byte_arr, format='PNG') img_byte_arr = img_byte_arr.getvalue() pb.set_contents(img_byte_arr, pasteboard.PNG)
pasteboard 載入的圖像只支持 PNG 格式,因此在保存時,一定要指定 PNG。
此外 pasteboard 還支持更多格式的數(shù)據(jù),比如 PDF,音頻數(shù)據(jù),HTML、顏色數(shù)據(jù)等等
更多格式可查看:https://developer.apple.com/documentation/appkit/nspasteboardtypestring
4.5 模擬觸發(fā) PicGo
正常情況下,我們是通過快捷鍵來觸發(fā) PicGo 去從剪切板中上傳圖像的,因此想要在程序中激活 PicGo,也只需要在 Python 腳本中模擬鍵盤動作即可。
具體的代碼如下:
from pykeyboard import PyKeyboard def upload_image_via_picgo(): k = PyKeyboard() k.press_keys(['Command', 'shift', 'p'])
4.6 通知 Mac 通知臺
上面整個過程都是腳本在后臺默默運行的,如果沒有任何通知,作為用戶,很難知道我們的圖片是否處理好,是否上傳成功,因此建議加一個通知的函數(shù)。
import os
def notify_to_mac(message):
os.system("osascript -e 'display notification \"{}\"\'".format(message))
不過其實 PicGo 上傳完圖片后,本身就會通知,所以這個通知并不是必要的,看個人需求啦~
5. 其他設置工作
5.1 設置程序權(quán)限
如果你在使用如上腳本時,發(fā)現(xiàn)有的鍵無法捕捉,那一定是系統(tǒng)沒有給予權(quán)限,需要你手動開啟。

5.2 設置開機自啟
在這里添加一個開機啟動項,而這個 init.sh 是一個 Shell 腳本。

這個腳本的內(nèi)容如下,注意最后那個 & 一定不能省略。

6. 運行效果
代碼全部解析完了,是不是很想看這個程序運行后,可以實現(xiàn)怎樣的效果呢?
我錄制了個 GIF 動態(tài)圖,你可以瞧一瞧,真的太方便了。

7. 寫在最后
對于有和我一樣寫博客習慣的朋友來說,我相信這篇文章的思路一定會有幫助,另外,即使你沒有防搬運的需求,代碼的實現(xiàn)依然值得學習,比如
如何監(jiān)聽鍵盤并定義程序的熱鍵?
如何從剪切板中讀取圖像?
如何給圖像添加水???
如何將圖像再放入到剪切板?
如何模擬鍵盤來激活程序?
在編碼的時候,也遇到了不少的坑,有的第三方庫并不適用于 Mac,有的有 BUG 至今也還沒修復,有的甚至要閱讀源碼才能知道如何使用,經(jīng)過多輪的調(diào)試和搜索,最終才完成這個腳本。
以上就是Python對接PicGo實現(xiàn)圖片自動加水印并上傳操作示例的詳細內(nèi)容,更多關(guān)于Python對接PicGo圖片自動加水印并上傳的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信