上一篇使用了 pngquant 图片压缩工具进行压缩, 并通过 click 命令行工具构建了 picom 包. 这篇的主要功能是实现图片上传.
图片上传功能的实现
通过 pngquant 压缩图片后, 得到一个 -fs8.PNG 为后缀的图片. 想要把图片上传到云端, 只需要把这个文件通过 API 发送给图片存储服务商就可以了.
先实现 sm.ms 网站的图片上传. 官方提供了 API 文档 https://doc.sm.ms/ , 照着文档传入参数就可以搞定, so easy.
image.PNG
上传接口的参数说明:
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, 对应的上传图片类:
image.PNG
为命令行添加 --upload 可选参数
现在我可以选择是否把图片上传到网上, 如果需要上传, 就添加 --upload 参数; 如果不需要上传, 就不传这个命令行参数:
picom elephant.PNG -f --upload
增加 --upload 可选参数只需要在 cli 函数上多加一个 option, 然后添加上传代码就可以了:
image.PNG
最后得到的运行结果:
image.PNG
通过 YAML 记录以及上传过的图片地址
上面上传的图片地址是在命令行显示的, 如果一次性使用还好, 但是如果需要重复使用就需要把图片的 URL 保存起来.
sm.ms 的账号功能可以管理已经上传的图片. 所以如果有 sm.ms 的账号, 就不需要这个保存的功能. 但是如果不想去注册账号, 有一个委曲求全的办法, 就是在当前文件夹创建一个名为 uploaded_img.YAML 的文件, 把已经上传的图片地址保存起来.
可以通过新建一个选项 --record 来选择是否记录在本地. python 可以通过 https://pyyaml.org/wiki/PyYAMLDocumentation 库操作 YAML 文件, 存储上传的图片数据. 也可以通过 JSON 格式保存, 大致的格式是这样的:
- {
- "upload":[
- {
- "name": "elephant.png",
- "url" : "http://img-server/ofos.png"
- }
- ]
- }
因为这个功能不是特别重要, 甚至可以说鸡肋, 就不贴代码了.
总结
picom-upload
上传图片功能非常简单, 只需要使用 requests 库的基础操作就可以完成各个图床服务商的上传操作. 如果觉得 requests 库的操作比较慢, 可以采用 aiohttp 进行异步传输. 这个工具暂且不考虑加快传输速度, 因为现在的图床服务很多都是小本经营, 没什么盈利能力, 为了能提供长久服务, 还是尽量少的给别人压力.
来源: https://www.cnblogs.com/heniu/p/12805550.html