用python批量解压带密码的压缩包
更新时间:2021年6月1日 00:00 点击:2097
项目地址:
https://github.com/Mario-Hero/toolUnRar
环境需求
- Windows系统
- Python 3
- 对于解压RAR文件,需要安装WinRAR
- 对于解压7z/zip等其他7-Zip支持解压的文件,需要安装7-Zip
用法 Usage
直接拖入文件夹或压缩文件即可批量解压缩包含密码的压缩文件。如果拖入的是文件夹,则会把该文件夹下的压缩文件解压缩,但不进入下一级目录。通过设置PASSWD来设置字典,通过设置DELETEIT来设置解压后是否删除被成功解压的压缩文件。本脚本会通过文件的后缀识别该文件是否为压缩文件。
你可以把WinRAR目录下的Unrar.exe和7-Zip目录下的7z.exe直接复制到这个toolUnRar.py文件的相同目录下,这样就可以携带使用了。
参数 Parameters
- PASSWD = ["hello","123456"] :你的密码本,该脚本会从这个数组中不断试验密码来解压缩,直到成功为止。
- DELETEIT :一个危险的参数。为真时,该脚本会直接删除成功解压的压缩文件。为假则不会删除。
- LOC_WINRAR = "C:\Program Files\WinRAR\" 你的WinRAR安装位置。就算这个变量的设置的不对,该程序也会在可能的位置来寻找对应的程序。
- LOC_7Z:7-Zip的安装位置。
- SAVE_MODE = True:如果该脚本无法通过后缀判断这是不是压缩文件,则不对该文件进行操作。
完整代码
#!/usr/bin/python3 # -*- coding: UTF-8 -*- # Created by Mario Chen, 04.04.2021, Shenzhen # My Github site: https://github.com/Mario-Hero import sys import os import subprocess # you can change it >>>>> PASSWD = ["123456","hello"] # the possible passwords DELETEIT = False # DANGER!! If it is True,will delete rar file after extraction LOC_WINRAR = "C:\\Program Files\\WinRAR\\" # location of WinRAR LOC_7Z = "C:\\Program Files\\7-Zip\\" # location of 7-Zip SAVE_MODE = True # if the suffix of file doesn't look like a compressed file, then do nothing with it. # <<<<< you can change it PROGRAM_RAR = "UnRAR.exe" # the program we use PROGRAM_7Z = "7z.exe" # the program we use LOC_S_WINRAR = ["C:\\Program Files\\WinRAR\\","C:\\Program Files (x86)\\WinRAR\\","./",""] # some possible locations of WinRAR LOC_S_7Z = ["C:\\Program Files\\7-Zip\\","C:\\Program Files (x86)\\7-Zip\\","./",""] # some possible locations of 7-Zip RAR_FILE = ["rar","zip","7z","tar","gz","xz","bzip2","gzip","wim","arj","cab","chm","cpio","cramfs","deb","dmg","fat","hfs","iso","lzh","lzma","mbr","msi","nsis","ntfs","rpm","squashfs","udf","vhd","xar","z"] NOT_RAR_FILE = ["jpg","exe","png","mkv","mp4","mp3","avi","mov","jpeg","wav","gif","mpeg","webp","txt","doc","docx","ppt","pptx","xls","xlsx","html","wps","torrent","swf","bmp","crdownload","xltd","downloading"] ENABLE_RAR = False # initial state only ENABLE_7Z = False # initial state only # for guessing >>> GUESS_FLAG_INIT = ["密码", "码", "password", "Password"] #0 GUESS_FLAG_START_1 = [":", ":"] #1 GUESS_FLAG_START_2 = ["是", "为", "is", "are"," "] #1 GUESS_FLAG_END = ["\n"," "] #2 GUESS_FLAG_DIVIDE = ["或是", "或", " or "] #3 # <<< for guessing def guessWDComment(comment): guess_flag = 0 guess_wd: list[str] = [] guess_ps = 0 cutIn = 0 cutOut = 0 while True: if guess_flag == 0: guess_newPs = len(comment) guess_len = 0 for initStr in GUESS_FLAG_INIT: ps_temp = comment.find(initStr, guess_ps) if ps_temp == -1: continue else: if ps_temp<guess_newPs: guess_newPs = ps_temp guess_len = len(initStr) if guess_newPs == len(comment): if not guess_wd: cutIn = 0 cutOut = len(comment) guess_flag = 3 else: break else: guess_ps = guess_newPs + guess_len guess_flag = 1 elif guess_flag == 1: found_temp = False found_temp_2 = False guess_newPs = len(comment) for startStr in GUESS_FLAG_START_1: ps_temp = comment.find(startStr, guess_ps, guess_ps + 20) if ps_temp == -1: continue else: if ps_temp < guess_newPs: found_temp = True guess_newPs = ps_temp + len(startStr) guess_flag = 2 if found_temp: guess_ps = guess_newPs cutIn = guess_ps continue else: guess_newPs = len(comment) for startStr in GUESS_FLAG_START_2: ps_temp = comment.find(startStr, guess_ps, guess_ps + 20) if ps_temp == -1: continue else: if ps_temp < guess_newPs: found_temp_2 = True guess_newPs = ps_temp + len(startStr) guess_flag = 2 if found_temp_2: guess_ps = guess_newPs cutIn = guess_ps guess_flag = 2 elif guess_flag == 2: guess_newPs = len(comment) for endStr in GUESS_FLAG_END: ps_temp = comment.find(endStr, guess_ps) if ps_temp == -1: continue else: if ps_temp < guess_newPs: guess_newPs = ps_temp guess_ps = guess_newPs guess_flag = 3 cutOut = guess_ps elif guess_flag == 3: found_cut_temp = False for divideStr in GUESS_FLAG_DIVIDE: if comment.find(divideStr, cutIn, cutOut) != -1: found_cut_temp = True for wd in comment[cutIn:cutOut].split(divideStr): guess_wd.append(wd.strip()) break if not found_cut_temp: guess_wd.append(comment[cutIn:cutOut].strip()) guess_flag = 0 else: guess_flag = 0 return guess_wd def isCompressedFile(file): file = file.lower() for rar in RAR_FILE: if file.endswith("." + rar): return True for media in NOT_RAR_FILE: if file.endswith("." + media): return False return not SAVE_MODE def utfIsNumber(uchar): return uchar >= u'\u0030' and uchar<=u'\u0039' def winRarDo(folder, file, wd): extractStr = " x -y -p" + wd + " \"" + folder + "\\" + file + "\" \"" + folder + "\\\"" extM = subprocess.call("@\""+LOC_WINRAR+PROGRAM_RAR+"\""+extractStr,shell=True) if extM == 1: # not rar file return 2 elif extM == 11: # wrong password return 1 elif extM != 0: # error return 1 else: return 0 def z7Do(folder, file, wd): extractStr = " x -y -p" + wd + " \"" + folder + "\\" + file + "\" -o\"" + folder + "\\\"" extM = subprocess.call("@\""+LOC_7Z+PROGRAM_7Z+"\""+extractStr,shell=True) if extM !=0: # error return 1 else: return 0 def unrarFile(folder, file): successThisFile = False fileNameEncrypted = True if not folder: cutPos = file.rindex("\\") folder = file[:cutPos] file = file[cutPos+1:] #print(folder) #print(file) if ENABLE_RAR and file.endswith(".rar"): winRarReturn = winRarDo(folder, file, PASSWD[0]) #print(winRarReturn) if winRarReturn == 0: #successThisFile = True return True elif winRarReturn == 2: pass else: getCommentStr = " l -p0 -z" + " \"" + folder + "\\" + file + "\"" commentNumber = subprocess.call("@\""+LOC_WINRAR+PROGRAM_RAR+"\""+getCommentStr,shell=True) #commentNumber = 1 if commentNumber == 0: commentM = subprocess.getstatusoutput("@\""+LOC_WINRAR+PROGRAM_RAR+"\""+getCommentStr) if commentM[0] == 0: fileNameEncrypted = False comment = commentM[1][(commentM[1].index("\n\n")+2):commentM[1].index(folder)] comment = comment[0:comment.rindex("\n\n")] #print(comment) if comment: wdArray = guessWDComment(comment) print("Possible passwords:", wdArray) for wd in wdArray: winRarReturn = winRarDo(folder, file, wd) if winRarReturn == 1: continue elif winRarReturn == 0: successThisFile = True break elif winRarReturn == 2: break else: break if successThisFile: return True for index in range(1,len(PASSWD)): winRarReturn = winRarDo(folder, file, PASSWD[index]) if winRarReturn == 1: continue elif winRarReturn == 0: successThisFile = True PASSWD[0],PASSWD[index]=PASSWD[index],PASSWD[0] break elif winRarReturn == 2: break else: break if not successThisFile: if ENABLE_7Z: for index in range(len(PASSWD)): z7Return = z7Do(folder, file, PASSWD[index]) if z7Return == 1: continue else: successThisFile = True PASSWD[0],PASSWD[index]=PASSWD[index],PASSWD[0] break if not successThisFile: print("Failed:"+file) return successThisFile def unrar(folder): if os.path.isdir(folder): print(folder) file_list = os.listdir(folder) for file in file_list: if os.path.isdir(folder + "/" + file): #print(folder +"/"+ file) #unrar(folder +"/"+file) pass else: if isCompressedFile(file): if unrarFile(folder, file): if DELETEIT: os.remove(folder + "/" + file) else: if isCompressedFile(folder): if unrarFile("", folder): if DELETEIT: os.remove(folder) if __name__ == '__main__': if len(sys.argv) <= 1: sys.exit(1) testRar = os.popen("\""+LOC_WINRAR+PROGRAM_RAR+"\"").read() if not testRar: for loc in LOC_S_WINRAR: testRar = os.popen("\""+loc+PROGRAM_RAR+"\"").read() if testRar: LOC_WINRAR = loc ENABLE_RAR = True break else: ENABLE_RAR = True test7z = os.popen("\""+LOC_7Z+PROGRAM_7Z+"\"").read() if not test7z: for loc in LOC_S_7Z: test7z = os.popen("\""+loc+PROGRAM_7Z+"\"").read() if test7z: LOC_7Z = loc ENABLE_7Z = True break else: ENABLE_7Z = True if (not ENABLE_RAR) and (not ENABLE_7Z): print("Cannot find winRAR and 7-zip") sys.exit(1) while len(PASSWD) < 2: PASSWD.append("0") for folder in sys.argv[1:]: #print(folder) unrar(folder) print("Finish.") #subprocess.call("pause",shell=True) sys.exit(0)
以上就是用python批量解压带密码的压缩包的详细内容,更多关于python批量解压压缩包的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
iPhone输错密码导致手机锁定怎么办 iPhone输错密码手机锁定解决方法
如果反复输错屏幕密码,手机就会进入锁定模式,也就是永久停用状态,只能抹掉数据以解除锁定状态和清除锁屏密码...2022-09-14Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 存储过程在数据库的应用中我们用到的非常的多了,下面我们来看一篇关于PHP操作MSSQL存储过程修改用户密码的例子,具体的如下所示。 mssql2008 存储过程 下面可以直接...2016-11-25
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 最近一直在做通行证项目,里面的注册模块中输入密码需要显示密码强度(低中高)。今天就把做的效果给大家分享下,代码没有网上搜索的那么复杂,能够满足一般的需求。 html 代码如下: 复制代码 代码如下: <!DOCTYPE HTML> <htm...2014-06-07
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
- 那么今天我就用JavaScript代码来实现这个效果吧,那么首先介绍一下整个的思路,首先我们先将确定输入密码的位数,我的需求是5位,那么就用一个div标签包住5个input标签...2016-01-02
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05