python 开发一款图片压缩工具(四):上传图床

上一篇使用了 pngquant 图片压缩工具进行压缩,并经过 click 命令行工具构建了 picom 包。这篇的主要功能是实现图片上传。python

图片上传功能的实现

经过 pngquant 压缩图片后,获得一个 -fs8.png 为后缀的图片。想要把图片上传到云端,只须要把这个文件经过 API 发送给图片存储服务商就能够了。web

先实现 sm.ms 网站的图片上传。官方提供了 API 文档,照着文档传入参数就能够搞定,so easy.json

image.png
image.png

上传接口的参数说明:api

  1. content-type 为 multipart/form-data ;
  2. Authorization 为可选项,当不须要用户管理时,能够不填;
  3. 传入文件的参数名为 smfile。

对应的 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 种状况:异步

  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, 而后添加上传代码就能够了:post

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 进行异步传输。 这个工具暂且不考虑加快传输速度,由于如今的图床服务不少都是小本经营,没什么盈利能力,为了能提供长久服务,仍是尽可能少的给别人压力。

相关文章
相关标签/搜索