Python实现上传图床脚本
15/Jan 2019
SM.MS 是由 V2EX大佬 @Showfom 自建的,无外链限制,无流量限制的公共图床,而且带有很简洁的API文档。在写markdown文档的时候,插入图片确实是一件我觉得挺麻烦的事情,所以,自己就简单实现了这样一个简单的小脚本,目的是在上传图片到图床时候,直接返回图片服务器地址,然后我们把地址复制到markdown的图片语法的地址栏上就可以在别处访问了。

python是我很喜欢的一门语言,尤其是日常遇到一些问题,一些小脚本能提供自己很大的帮助(重点是很爽啊hhh)
思路综述
首先这个脚本主要的目的就是通过SM.MS提供的API接口,把本地图片上传到公共图床,直接返回图片服务器地址。
所以,我们接下来思考怎样可以实现这样的功能:
- SM.MS(一下简述为SM) 提供的接口,应该怎样调用。
- 在python中,使用requests模块可以实现简单请求,但是现在上传的是图片内容,应该如何设置。
- 怎样获取返回的地址。
这就是最基础的想法了(所以我说这就是一个简单小脚本2333333)在上面的基础上,假设想要更加完备,更加像一个工具的话,需要增加些判断内容:
- 判断图片是否存在
- 使用命令行参数
- 完善错误提醒,并且安全退出脚本程序。
- 拓展:自定义上传图片尺寸
我们主要看上面几点。
SM.MS API接口
根据文档,我们可以很清晰看到上传至图床的设置十分简单。主要需要以下几个设置:
| name | descp | remark |
|---|---|---|
| 请求方式 | POST | |
| 请求URL | https://sm.ms/api/upload | |
| 主要参数名称 | smfile | 类型:File |
也有请求示例:
![smms_upload_demo]()
这里的重点就是看Content-Type请求头设置Content-Type: multipart/form-data;
使用postman来测试上传接口

可以在浏览器中打开返回数据中的url,就可以看到刚刚上传的图片了。

使用Requests模块库完成请求操作
Requests模块库使用十分简单,而且文档十分友好(笑。

这是一个很简单的requests请求,其中,使用requests.get方法访问目标网页,直接打印结果,会返回一个状态码200,可以打印r.text来获取页面内容。这里不再啰唆了23333
但是我们这里需要的是通过POST请求,上传图片啊!对于这样的需求我们查看文档,上面我们知道官方示例中请求头有一个设置是:Content-Type: multipart/form-data;,故我们在requesets中也是找寻相关文件内容上传的文档。
根据文档,我们可以显式地设置文件名,文件类型和请求头:
files = {'smfile': open(path, 'rb')}
上述代码,我们设置请求参数名为smfile,文件名为path,
完善:命令行参数与文件存在判断
命令行参数sys.argv
文件存在判断os.path.exists
python json字符串处理
添加alisa至zsh,全局使用脚本
这步挺简单的,个人使用的是zsh,就是添加一行 alias 到 .zshrc ,
alias graphbed='python3 /Users/taozz/Dropbox/projectCode/tools/graph_bed_use_smms.py'
以后,在终端输入 graphed [ photo_url ] 即可使用该脚本上传图片至图床,并把图片url返回打印,复制使用即可。
拓展
http请求头相关
总结
上述内容,只是很简单地进行一个脚本编写思路的记录,
- 为什么要写这个脚本(目标与适用范围)
- 用什么写(文档准备)
- 怎么写(基础实现的编写与每一步的测试)
- 如何完善(方便使用与基本判断)
对我而言,就是一个知识回顾总结的过程。在其中回顾学习了一些常见操作,如sys.argv, os, json.loads等。
这是我写的第一个关于python的文章,确实很简单,在我眼中python就是这样一门语言,“想做什么,去做什么”,对于我个人,喜欢这门语言,但是目前的情况,我的水平还不足够担当这门语言的工作,所以写点小脚本自己玩玩呗!coding is funny, especially with python.