记一次图床上传工具开发打包经历 说起图床,常用 markdown 写博客的同学应该不陌生。文章中的图片路径肯定不能指向本地文件,那样文章发布以后图片会因为找不到文件而失效。如果你非要说使用了本地文件图片也未失效,可能是你的编辑器比较高级,已经自动帮你上传了。如果你是第一次听说图床,可以认为图床就是网络相册,会保管你上传的所有图片,并生成一个 URL 地址,可以直接引用或下载。
如果你急于使用这个工具,可以直接安装使用。
安装好之后在终端输入 pysmms 图片路径
即可上传。上传完成后会自动复制到剪贴板。
为什么开发 先说明一下,这个图床工具基于 SM.MS API 接口开发,具体文档见此链接 。这个图床非常好用,已经用了很长时间,而且每个免费用户都有 5G 的免费额度,对于我来说是够用了,当然如果付费使用功能会更高级一些。
回到标题,为什么开发?因为写文章的时候,经常要上传图片,之前偶尔传图都是在 SM.MS 网页,但是越来越觉得这样效率太低,每次写文章的时候都要把网站打开,随时准备上传图片。本来想看一下 SM.MS 官方有没有 APP 可以拿来用,发现只有安卓和 iOS,并没有 Mac 版,还有一些第三方图床工具需要付费(个人觉得不值)。既然官方提供了 API 接口,何不利用一下。
夭折了两个版本 在 pysmms 之前已经有两个版本的图床工具了,但是因为各种原因夭折了。
最开始打算做一个有用户界面的工具,类似:
或者这样:
本来想着用 Electron 写一个跨平台工具,如果写好之后多个平台可以使用,奈何 index.html
文件写好了,Electron 却迟迟因为网络原因下载失败,不想浪费时间,所以放弃了这个想法。
第二个图使用 pyqt5 构建的界面,可能是因为太菜的原因,虽然已经支持简单的传图功能,但界面和功能的完善性还是让我不太满意。所以最终还是想着去 GitHub 上参考一下。
n0vad3v/smv2 在 GitHub 上找到了 n0vad3v/smv2 ,非常符合我的想法,不仅支持传图,而且还支持历史记录查询,优雅的使用 Authorization。
1 2 3 4 5 6 7 ➜ smv2 poster36.jpg Upload without Token. ┌SM.MS Upload Status───────────────────────────────────────────────┐ │ Image URL │ https://i.loli.net/2019/02/18/Q123f2TWhtnk1FR.jpg │ ├──────────────┼───────────────────────────────────────────────────┤ │ Deletion URL │ https://sm.ms/delete/8Ymbq218218XlPIDg4ReE2rcTi │ └──────────────┴───────────────────────────────────────────────────┘
可以看出 pysmms 和 smv2 的界面是非常类似的,因为借鉴了 smv2 库。
但是 smv2 用起来还是有些不顺手,例如图片上传之后需要手动复制,不支持多个 Authorization 填写,不支持基于 IP 的历史记录查询等。所以就萌生了参考 smv2,自己也写个类似的脚本的想法。顺便学习一下这么优雅的表格是如何生成的,写好的脚本如何打包上传到 pypi。
开发 smv2 用到了 requests
和 terminaltables
这两个第三方库。第一个用来请求接口,第二个用来生成格式化表格。requests
很常用就不介绍了。
terminaltables 使用 terminaltables 让表格在终端中显示变得更加容易。
官方提供了简单的用法示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from terminaltables import AsciiTable table_data = [ ['Heading1' , 'Heading2' ], ['row1 column1' , 'row1 column2' ], ['row2 column1' , 'row2 column2' ], ['row3 column1' , 'row3 column2' ] ] table = AsciiTable(table_data)print table.table +--------------+--------------+ | Heading1 | Heading2 | +--------------+--------------+ | row1 column1 | row1 column2 | | row2 column1 | row2 column2 | | row3 column1 | row3 column2 | +--------------+--------------+
支持 Windows 10, Windows XP, and OS X。
完整文档点此链接。
Pyperclip 在 pysmms 中,只是在成功获取图片链接的时候会使用 Pyperclip,这样上传完成图片之后可以继续回到写作中,不需要鼠标选定图片链接再拷贝。
Pyperclip 的目的是提供一个跨平台的 Python 模块,用于将文本复制和粘贴到剪贴板。使用非常简单,以至于没有文档。如果你的脚本里用到了复制粘贴,可以试试。
1 2 3 4 >>> import pyperclip >>> pyperclip.copy('Hello world!' ) >>> pyperclip.paste()'Hello world!'
打包发布 脚本写好之后就是打包发布了。
需要在文件夹建立 setup.py 文件,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import setuptoolswith open ("README.md" , "r" ) as f: long_description = f.read() setuptools.setup( name="pysmms" , version="0.0.5" , author="Jianxun" , author_email="i@lijianxun.top" , description="The CLI Tool for SM.MS, based on API v2." , long_description=long_description, long_description_content_type="text/markdown" , url="https://github.com/alpha87/pysmms" , packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3" , "License :: OSI Approved :: GNU General Public License v3 (GPLv3)" , "Operating System :: OS Independent" , ], install_requires=[ "requests" , "pyperclip" , "terminaltables" ], entry_points={ 'console_scripts' : [ 'pysmms=pysmms.pysmms:app' , ], } )
文件整体还是很好理解的,按照自己脚本的信息填写就可以。
注册 pypi 需要在 pypi 注册账号,然后在用户根目录下创建 .pypirc
文件,写入以下内容:
1 2 3 4 5 6 7 [distutils] index-servers=pypi [pypi] repository=https://upload.pypi.org/legacy/ username=xxx password=xxx
填入自己的用户名和密码。
打包 1 python3 setup.py sdist bdist_wheel
上传 首先需要安装 twine,pip install twine
,安装完成后执行以下命令上传到 pypi。
上传成功后就可以在 pypi 网站上看到自己上传的工具了,也就可以使用 pip 下载安装了。