上一篇使用了 pngquant 圖片壓縮工具進行壓縮,並通過 click 命令列工具構建了 picom 包。這篇的主要功能是實現圖片上傳。
圖片上傳功能的實現
通過 pngquant 壓縮圖片後,得到一個 -fs8.png
為字尾的圖片。想要把圖片上傳到雲端,只需要把這個檔案通過 API 傳送給圖片儲存服務商就可以了。
先實現 sm.ms 網站的圖片上傳。官方提供了 API 文件,照著文件傳入引數就可以搞定,so easy.
上傳介面的引數說明:
content-type 為 multipart/form-data ; Authorization 為可選項,當不需要使用者管理時,可以不填; 傳入檔案的引數名為 smfile。
對應的 python 程式碼:
api_addr = 'https://sm.ms/api/v2/upload'
files = {
"smfile": open(file, 'rb')
}
res = requests.post(url, files=files)
獲取上傳的圖片地址
檔案上傳完畢以後,需要通過 API 的響應結果得到圖片的 URL。 sm.ms 的響應結果包含 2 種情況:
當圖片已經上傳過一次,會通過圖片的 hash 值判斷出重複。響應中的 code 為 image_repeated, 可以通過 images 取得之前已存在的圖片地址。
{
"code": "image_repeated",
"images": "https:..."
}
當圖片是第一次上傳,code 為 success, 可以通過 data 中的 url 獲取圖片地址。
{
"code": "success",
"data": {
"url": "https:..."
}
}
所以在上傳的函式中新增判斷,獲取圖片 url:
resp = res.json()
code = resp.get('code')
if code == 'image_repeated':
url = resp["images"]
return url
elif code == 'success':
return resp["data"]["url"]
因為有時候並不是上傳單張圖片,而是要上傳整個資料夾下面的圖片,一次性需要處理多張圖片的上傳操作,所以可以共用一個 session, 對應的上傳圖片類:
為命令列新增 --upload
可選引數
現在我可以選擇是否把圖片上傳到網上,如果需要上傳,就新增 --upload
引數;如果不需要上傳,就不傳這個命令列引數:
picom elephant.png -f --upload
增加 --upload
可選引數只需要在 cli 函式上多加一個 option, 然後新增上傳程式碼就可以了:
最後得到的執行結果:
通過 yaml 記錄以及上傳過的圖片地址
上面上傳的圖片地址是在命令列顯示的,如果一次性使用還好,但是如果需要重複使用就需要把圖片的 URL 儲存起來。
sm.ms 的賬號功能可以管理已經上傳的圖片。所以如果有 sm.ms 的賬號,就不需要這個儲存的功能。 但是如果不想去註冊賬號,有一個委曲求全的辦法,就是在當前資料夾建立一個名為 uploaded_img.yaml 的檔案,把已經上傳的圖片地址儲存起來。
可以通過新建一個選項 --record
來選擇是否記錄在本地。python 可以通過 pyyaml 庫操作 yaml 檔案,儲存上傳的圖片資料。 也可以通過 json 格式儲存,大致的格式是這樣的:
{
"upload":[
{
"name": "elephant.png",
"url" : "http://img-server/ofos.png"
}
]
}
因為這個功能不是特別重要,甚至可以說雞肋,就不貼程式碼了。
總結
上傳圖片功能非常簡單,只需要使用 requests 庫的基礎操作就可以完成各個圖床服務商的上傳操作。如果覺得 requests 庫的操作比較慢,可以採用 aiohttp 進行非同步傳輸。 這個工具暫且不考慮加快傳輸速度,因為現在的圖床服務很多都是小本經營,沒什麼盈利能力,為了能提供長久服務,還是儘量少的給別人壓力。