上一篇使用了 pngquant 圖片壓縮工具進行壓縮,並經過 click 命令行工具構建了 picom 包。這篇的主要功能是實現圖片上傳。python
經過 pngquant 壓縮圖片後,獲得一個 -fs8.png
爲後綴的圖片。想要把圖片上傳到雲端,只須要把這個文件經過 API 發送給圖片存儲服務商就能夠了。web
先實現 sm.ms 網站的圖片上傳。官方提供了 API 文檔,照着文檔傳入參數就能夠搞定,so easy.json
上傳接口的參數說明:api
對應的 python 代碼:session
api_addr = 'https://sm.ms/api/v2/upload'
files = {
"smfile": open(file, 'rb')
}
res = requests.post(url, files=files)
文件上傳完畢之後,須要經過 API 的響應結果獲得圖片的 URL。 sm.ms 的響應結果包含 2 種狀況:異步
{
"code": "image_repeated",
"images": "https:..."
}
{
"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, 而後添加上傳代碼就能夠了:post
最後獲得的運行結果:
上面上傳的圖片地址是在命令行顯示的,若是一次性使用還好,可是若是須要重複使用就須要把圖片的 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 進行異步傳輸。 這個工具暫且不考慮加快傳輸速度,由於如今的圖牀服務不少都是小本經營,沒什麼盈利能力,爲了能提供長久服務,仍是儘可能少的給別人壓力。