【Python开个脑洞】如何做一个运营人员都爱不释手的解压缩小工具

此前接单做了一个批量解压缩小工具后脑洞大开,打算给运营小姐姐们做一个小工具,解放一下她们时间,同时享受一下小姐姐们的崇拜的眼神......好吧,话不多说,咱们直接开始:

使用场景与需求分析

解释一下使用场景:公司为了数据安全,给所有下载的数据压缩包设置了一个6位数字密码,密码使用短信发送到下载人指定手机上。如果一次下载单个文件,那解压缩很简单,但是如果下载的文件数量较多,一个一个压缩包与密码短信进行配对那就有点让人烦躁了。

因此,小工具要实现的需求就是:能够批量的将压缩包与密码短信文本进行自动匹配,将匹配到的压缩包进行解压缩;同时,要实现一个交互界面,并打包成可执行文件。

分步实现

有了需求,那么就是一步一步实现它:

要打包成exe可执行文件,可以使用pyinstaller进行打包,若要打包文件最小,需要创建一个虚拟环境,安装最少的第三方包,因此,使用pycharm进行虚拟环境创建,并安装需要使用到的包。

图片

 

pycharm创建虚拟环境

安装需要使用到的包:pyinstaller、pyzipper(zipfile不支持我司的压缩包格式解压)

扫描二维码关注公众号,回复: 13486765 查看本文章

图片

 

安装需要的包

实现交互界面,使用了tkinter

图片

 

思路解析:很基础的页面,不过记得哪个大佬说过,先实现核心的功能,其他的(美化)以后再说。此外,代码中已经把后续写的一些代码贴上了,在实际编写过程中实际上是先预留空位,后续代码实现后补充的。

有了界面,要实现功能

3.1先实现单个文件解压缩的功能

思路解析:上面的代码都有注释就不一一解释了,需要提一下的是,单独建了一个py文件存放这个代码,以便调试以及后续更新功能。

3.2再实现批量解压缩文件的功能

思路解析:这部分代码主要实现读取出所有zip文件,解析短信密码文本,并且进行匹配解压的过程,考虑到方便使用者,因此将文件与密码的匹配设计为多对多的方式,即目录下可能存在相同文件名的压缩包(同名文件可能在子文件夹中),密码文本可能存在重复或多条短信密码均为相同文件名的情形。

此外,解析密码文本是,需要用到正则表达式,找出文本中的文件名与密码的键值对,我使用的是“r'任务名为(.*?) 的压缩包,解压密码为(\d),'”,具体情形需要具体修改。

打包成exe

5.1 打开cmd,进入到虚拟环境的路径中:我的是"D:/work/pythonproject/venv/scripts/activate.bat"

5.2 在cmd中,进入到存放py文件的路径,运行pyinstaller命令,我的是“pyinstaller -Fw unzip_file.py”(命令就不具体解释了,详见pyinstaller的教程)

打包结束后,目录下会出现一个dist目录,里面就是打包好的exe文件了,测试运行了一下,一切正常。

只有11M特别说明:

如果在代码中使用os模块,则在后续打包成exe文件时,会被杀毒软件识别为病毒,所以,一开始就要避免使用os模块。(此前版本代码中使用os.walk进行文件遍历,就踩坑了,还好使用的地方不多,都改成pathlib了)

加个彩蛋

前面那些只是正常的解压缩步骤,适用的场景很小,不能体现咱的水平,咱得憋个大招:搞个暴力破解压缩包密码的功能,要是没收到密码短信或者误删短信了,还是能够解压缩文件,这才牛^_^(后来想了想,似乎这个功能也没什么软用,但就是要折腾,脑洞继续开)。

暴力破解功能实现

暴力破解只针对单个文件,那么直接在前面单个解压文件的程序中增加这个功能即可,由于密码为6位数字,一共有100万种组合,因此单线程肯定是不行的,要上多线程。此外,试验密码的顺序对于破解密码的消耗时间是有巨大影响的,因此,提供一些密码的排序方式供选择“正序、倒序、1优先、2优先等等”,以及一个“随机”方式,如果选择的方式恰好命中了正确密码的范围,那么将大大节约破解时间(有点买彩票的感觉^_^),上代码:

图片

 

暴力破解测试截图破解功能的界面

 由于不想直接体现在程序界面中,因此,破解功能的界面写了一个新的交互界面,代码如下:

图片

 

破解窗口的测试截图将破解功能加入原界面中(隐藏界面)

给压缩包加密码本身是为了数据保密,而暴力破解密码,某种角度看,似乎有点不合适,因此,直接放在界面中不太合适,咱搞个隐藏界面,必须输入密码口令才能打开,至于口令就用“上上下下左右左右BABA”(致敬一下经典,嘿嘿)。

以下代码在原交互界面上增加

图片

 

将装饰器放置在需要装饰的函数前

完成上述步骤后,再次使用pyinstaller进行打包即可。

成品展示

图片

 

破解测试

图片

 

破解程序的测试结果最终总结

之所以开这么一个脑洞,其实主要是设计了一个场景,为了锻炼一下综合的应用能力,把学到的分项知识进行一次融合。

整个过程中用到的模块有:

pyinstaller,打包exe

tkinter,交互界面

pathlib,路径与文件

theater,多线程

queue,多线程通信

itertools.product,求多个可迭代对象的笛卡尔积

random.shuffle,随机打散

在实现过程中,按自己理解进行了分项的拆解实现,以便后续进行功能的迭代;同时,应用了装饰器,在不改变原代码的情况下,增加功能等等。通过这样的过程,加深对各个功能的理解。

 好吧,这次的脑洞先开到这里了,等有时间了咱继续开脑洞。

猜你喜欢

转载自blog.csdn.net/l947282038/article/details/121678323