python 開發一款圖片壓縮工具(四):上傳圖床

和牛發表於2020-04-29

上一篇使用了 pngquant 圖片壓縮工具進行壓縮,並通過 click 命令列工具構建了 picom 包。這篇的主要功能是實現圖片上傳。

圖片上傳功能的實現

通過 pngquant 壓縮圖片後,得到一個 -fs8.png 為字尾的圖片。想要把圖片上傳到雲端,只需要把這個檔案通過 API 傳送給圖片儲存服務商就可以了。

先實現 sm.ms 網站的圖片上傳。官方提供了 API 文件,照著文件傳入引數就可以搞定,so easy.

image.png
image.png

上傳介面的引數說明:

  1. content-type 為 multipart/form-data ;
  2. Authorization 為可選項,當不需要使用者管理時,可以不填;
  3. 傳入檔案的引數名為 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 種情況:

  1. 當圖片已經上傳過一次,會通過圖片的 hash 值判斷出重複。響應中的 code 為 image_repeated, 可以通過 images 取得之前已存在的圖片地址。
{
 "code""image_repeated",
 "images""https:..."
}
  1. 當圖片是第一次上傳,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, 對應的上傳圖片類:

image.png
image.png

為命令列新增 --upload 可選引數

現在我可以選擇是否把圖片上傳到網上,如果需要上傳,就新增 --upload 引數;如果不需要上傳,就不傳這個命令列引數:

picom elephant.png -f --upload

增加 --upload 可選引數只需要在 cli 函式上多加一個 option, 然後新增上傳程式碼就可以了:

image.png
image.png

最後得到的執行結果:

image.png
image.png

通過 yaml 記錄以及上傳過的圖片地址

上面上傳的圖片地址是在命令列顯示的,如果一次性使用還好,但是如果需要重複使用就需要把圖片的 URL 儲存起來。

sm.ms 的賬號功能可以管理已經上傳的圖片。所以如果有 sm.ms 的賬號,就不需要這個儲存的功能。 但是如果不想去註冊賬號,有一個委曲求全的辦法,就是在當前資料夾建立一個名為 uploaded_img.yaml 的檔案,把已經上傳的圖片地址儲存起來。

可以通過新建一個選項 --record 來選擇是否記錄在本地。python 可以通過 pyyaml 庫操作 yaml 檔案,儲存上傳的圖片資料。 也可以通過 json 格式儲存,大致的格式是這樣的:

{
 "upload":[
  {
   "name""elephant.png",
   "url" : "http://img-server/ofos.png"
  }
 ]
}

因為這個功能不是特別重要,甚至可以說雞肋,就不貼程式碼了。

總結

picom-upload
picom-upload

上傳圖片功能非常簡單,只需要使用 requests 庫的基礎操作就可以完成各個圖床服務商的上傳操作。如果覺得 requests 庫的操作比較慢,可以採用 aiohttp 進行非同步傳輸。 這個工具暫且不考慮加快傳輸速度,因為現在的圖床服務很多都是小本經營,沒什麼盈利能力,為了能提供長久服務,還是儘量少的給別人壓力。

相關文章