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
Mvz%)=_e$>n0pzWBK>z>%
literal 0
HcmV?d00001
diff --git a/utils/__pycache__/scanThread.cpython-310.pyc b/utils/__pycache__/scanThread.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..481c18057829c788e2e1828d8769a9732927526b
GIT binary patch
literal 4963
zcmZ`-TaO$^6|Snj&UI%mv3Fz3Y>;9yB3Zy80gUB1zC|H;WwQY*!-m$Rt7o@&=UUwx
zXNR5;u@T7&5_v>Xq?yM&@CU+Q;1|>@5+XeD1_BZDo$8t0Sv&4gpE`Z2y1FjsJKw44
zRVqb>>vwevmt<1`#j^;X;M
zcnz=PH~dbaQQ+(~CT;0_$fOf_M^>XK`4+3YU!qsGSr^*A+e~-$!rcQE-H*Gn_aGrd
z-O}E@H+NOkl)BhI9Hd+EPPf_C?!7w)Y4l!5Z_i&eTDp?oLPU&4*btEw*+;zLpmgbn
zuX|*JRWy9EqPFl6YjMe?_|V7LENOqp8YSsS7iC#`(nnd51zAK{l_gn5xgaaDin1mb
zWDVt_T$D>Fmp)=PYb;}a%euG~HoN%@LSe?13(~FWom_;HvXp1+NQ}jVah5?3EJ@N%
zog;?Ql?*+K%{S|wc9MgBq?CvEv>yaeYQ3*|JF3~)zR`}F-8+Z(qj0yGZXcv^
zJK0W-=d#g1R0Z@?#+~>ORqojZ3Yewf+V@vTM-pT!(n=
zx|vE{m}y}i@i2OHa*I1r8nohe6i{uDr0OY}X%)ifMeg&Oxocv0es0!}y>w~`Xm98?
ztNjNk!&g(b$HyY$6RxU8w@AN_^*2wpsd+{6kx1Ftp{JYd?e%SIWR2{RlR0==9l55h
zn^~DV5hHI{%+MPBTA4TDKVTzqpAEjr;mMr61#NIHgJp}|$8K*KE7?s95Sxlz0$we8
ziMIO`2i!QJbC3Mh-IwP%g(2^*C%OI^$mE6=e}8Kpp3
z$!J$fnaIjnCG#?W;v!zy>N4u#s-~UCDF_L_25N&V6D#S4p(58_dr*%twbaAnazVvy?Wv@+LFyfUFpZ68QqQDDBREe
zBv*Z^F~;J%^!d34K|4-Td@5FR8hMv4hdrgDFb&B66h(FIlN$88(Ns$x^d5D-(#-iV
z#P8vq36{>|pvvHL)K!A-GvJ$j1zE~SC
zW`0(d_Qc`{CW8w$OP3Dc=YR!g!&@(0lwL+jl{ri={g}i*gADB@a
z$MrT(u@kuw#mi+{CfdOr4CU>G5jW9o8sjigJ`tE2qUa}L02;`HyKMrtqL8G{l0ZfU
z%GP4zyNZI!=RB`7q-OZ6c!iuP>~;EAiJubUQsgRVrBHaVOfb>dVPZoL;q{WR`%wbNH|H=Ti$)?PhF!YteTE*d46s0z?@uxAP|-XF|Ye@$)*HnNtD3?
zLbwFXheZR>BJ>)!Kd55Y%H01zd}aT`c7|u4uyY}0ZL^C~nPYl}8_%HNm{d7$@VSvMY^0nk5}kmFcDI$QKYFpW_OHz0qgNpR?QZG|H8ypf682p5Mwp5
z;tXk{8rq!AYS0!DD^|yAAjn1OQmhzk;myLnP+uIcYh|{sgRNs4^EQ!qUd5&uEDfvM
z^4H%VJ-7Wr9m=JV<}ZASJz^k_Sk<4-Vf0gKP0+{#zHvhtwbQ1y52Gfq)aiA>2FGYq
zKcu!lB5|3-k4aFV$U*iBX%sxPP$11tGYxmO1z;fQ@3(=N^TCN@1;IN}tEZws;)K+W
zyU_{m)HUkpRfzghPJ1VaB9>8?NSwe*q*8mS49u8)C}!B&>6yffk}ATSx+&(axd
z^Ud3NOn36ddmBBdUy*o=M1#cXiR#72cH8s#zws;
zM4+@5QXGLUiHQkkxddo1b_a|pd+Sj`-k!LL(JGjN+$wQwj;cB2{HDe`{3Xx_rfy{Be0XaQ8Sv&=CX4a^#)
z{8W=q)p@tsKA*26EhcR?nU!i{)D8Y+!9lZ~*C>LVSsg`3
zU)3gYjl>=aiUH<714X1~a)UftnME~GltP8NPof8*E7N}{!l>O2g1Na;E^Bz(`~%|R
zDLD_}MJ-nB`
sv~e%JfxxQhAEkU^^cmC3+(69on*_qYk}t|t;s^7O$SSKLAy~2g58i^8GXMYp
literal 0
HcmV?d00001
diff --git a/utils/__pycache__/selectVersion.cpython-310.pyc b/utils/__pycache__/selectVersion.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a89a81d73a86de4ea76db3a66a0a24560dbf218b
GIT binary patch
literal 2819
zcmb_e&2J>d6|buPn4a<2yK7Kv5{M>|2nD5uj)%ozG^o|;s+n!O
z-94`ES?`Q`5RzB9<&awr9PA4ce+K_XU6GKuaYl;B?^WB2?VKXft*UzU_3G98_`S*(
z7h4S9*WZ4hyt=^HH`KZOdFZ@{QtYFWO!AcV>z4Pq?Tfy!teBw6^^6wiScMO{EBH(*bjf+S|7x@RJt?P`AA2H
zgUwV$*~96cil0Q~U{WS&F(_23;__o0ndI5pcxsyQ6BQqXVBQ3mB0$yRtK8+T&~0>L
zloy{5%0;pF{X2+~?ekMnI+Cy8*7~i|t!dKlKgFDt-l<>fqvFzih0R66=1wK!~
zJhm4M6WMKOlF+zTJ-&Jd{S;>5IM)YQPj@tKK317=iKTJVJd$1Ch@muoeU@1up5b}N
z*Q%JLWnWBUeFKcGqU#Et$;`|41Y&(@*DcHxFQdB2Z}JuopvnM$t5)eRF%gs7Tzn)j
z+0Ux<-ymiy(lM*=z~BoU&PYC;UWkwr6+Gz0W-2A+hE&@0cI6uDd;3*;OOx
zR8KnxYTC*2vNOylnOvJK?BmtzQCrVUu$ktCvPh@pah!|lG%e6xlaj;q=q*}Xe
z8o-xBm6g{u+1enmiu1$q-P_nw5QjI}tTR$2#ig~!+D4kkQCi#uak1D!VK=aGtsB^6
zJRM~t*e+F>zDWb_ex78;OA3l_KN`ceD5?VjN(%%HOb|okk<|+ebcQFIu>cTh}#I)
zv7=S#&t2Jo5BUIJ??lY~%GZx7Uj{JsBfGy*`Pf_20cM);xdw2eK{x`AXnXME5wqUa
z+MYEx*9SJ64Q4BYdwDz|M<@n+Y7_aVL*ZM@{xLwJyBC$w;6t+YU?++XqLC^F9|6{}
zyk7iaa+s9BkYTR(l1%2u#hu$>Arg^M)IBW?VAy@*I+k~4gta!EY1(aIlVI1
z>RR_)j+6gOj#{e6dpkd?5M8G)#&JKuErE-7ZufmqljHGhrO1cnaRk}RS}TJ(#r4~y
z#9s7N?I8cp79LJ7w7foRUsf}qwgE>TM@7*mg3?nRLKHEYQj~RG3sm|Jbtx+KZ%}mu
zYw!(2}A912Z4438#JN&y~*
zdV}Pmta_=UjIG~AMWrCz3Rqj%k?xZI3(Zp2uGRD_qAa?2#W+n$6Ce|$7EN$IAq!4f
wrbYBd(v%KrT@oZ%o|jIxg4hQ`uu%(qm)>?3An0j8|EdT?5Cn_C;_~8u0s5ZFKL7v#
literal 0
HcmV?d00001
diff --git a/utils/selectVersion.py b/utils/selectVersion.py
index 96236907a..cc1dde214 100644
--- a/utils/selectVersion.py
+++ b/utils/selectVersion.py
@@ -7,10 +7,15 @@
working_dir = os.path.split(os.path.realpath(__file__))[0]
def check_dir(file_path):
- list_ = os.listdir(file_path)
- if 'All Users' in list_ or 'Applet' in list_ or 'WMPF' in list_:
- return 0
- else:
+ if not os.path.exists(file_path):
+ return 1
+ try:
+ list_ = os.listdir(file_path)
+ if 'All Users' in list_ or 'Applet' in list_ or 'WMPF' in list_:
+ return 0
+ else:
+ return 1
+ except:
return 1
@@ -43,15 +48,98 @@ def read_registry_value(key_path, value_name):
def get_dir_name(filepath):
dirlist = []
names = []
- list_ = os.listdir(filepath)
- # 换用lambda 表达式更安全,remove函数如果不存在对象会抛出异常
- list_ = [element for element in list_ if element != 'All Users' and element != 'Applet' and element != 'WMPF']
- for i in range(0, len(list_)):
- file_path = os.path.join(filepath, list_[i])
- if os.path.isdir(file_path):
- dirlist.append(file_path)
- names.append(list_[i])
- return (dirlist, names)
+ if not os.path.exists(filepath):
+ return ([], [])
+ try:
+ list_ = os.listdir(filepath)
+ list_ = [element for element in list_ if element != 'All Users' and element != 'Applet' and element != 'WMPF']
+ for i in range(0, len(list_)):
+ file_path = os.path.join(filepath, list_[i])
+ if os.path.isdir(file_path):
+ dirlist.append(file_path)
+ names.append(list_[i])
+ return (dirlist, names)
+ except:
+ return ([], [])
+
+def find_all_wechat_paths():
+ """
+ 智能扫描所有可能的微信数据目录位置
+ 返回所有找到的有效路径列表
+ """
+ user = getpass.getuser()
+ found_paths = []
+
+ common_paths = [
+ f'C:\\Users\\{user}\\Documents\\WeChat Files',
+ f'C:\\Users\\{user}\\OneDrive\\Documents\\WeChat Files',
+ f'D:\\Documents\\WeChat Files',
+ f'E:\\Documents\\WeChat Files',
+ f'F:\\Documents\\WeChat Files',
+ f'C:\\Users\\{user}\\AppData\\Local\\Packages\\TencentWeChatLimited.forWindows10_sdtnhv12zgd7a\\LocalCache\\Roaming\\Tencent\\WeChatAppStore\\WeChatAppStore Files',
+ f'C:\\Users\\{user}\\AppData\\Local\\Packages\\TencentWeChatLimited.WeChatUWP_sdtnhv12zgd7a\\LocalCache\\Roaming\\Tencent\\WeChatAppStore\\WeChatAppStore Files',
+ ]
+
+ for drive in ['C', 'D', 'E', 'F', 'G']:
+ common_paths.append(f'{drive}:\\WeChat Files')
+ common_paths.append(f'{drive}:\\WeChat\\WeChat Files')
+ common_paths.append(f'{drive}:\\Program Files\\Tencent\\WeChat\\WeChat Files')
+ common_paths.append(f'{drive}:\\Program Files (x86)\\Tencent\\WeChat\\WeChat Files')
+ common_paths.append(f'{drive}:\\Users\\{user}\\WeChat Files')
+ common_paths.append(f'{drive}:\\Users\\{user}\\Tencent Files\\WeChat Files')
+
+ for path in common_paths:
+ if check_dir(path) == 0:
+ if path not in found_paths:
+ found_paths.append(path)
+
+ registry_key_paths = [
+ r"software\tencent\wechat",
+ r"Software\Tencent\WeChat",
+ r"SOFTWARE\Tencent\WeChat",
+ ]
+
+ for key_path in registry_key_paths:
+ value_names = ["FileSavePath", "InstallPath"]
+ for value_name in value_names:
+ value = read_registry_value(key_path, value_name)
+ if value:
+ if value == 'MyDocument:':
+ doc_path = f'C:\\Users\\{user}\\Documents\\WeChat Files'
+ if check_dir(doc_path) == 0 and doc_path not in found_paths:
+ found_paths.append(doc_path)
+ elif os.path.isdir(value):
+ wechat_path = os.path.join(value, 'WeChat Files')
+ if check_dir(wechat_path) == 0 and wechat_path not in found_paths:
+ found_paths.append(wechat_path)
+ if check_dir(value) == 0 and value not in found_paths:
+ found_paths.append(value)
+
+ try:
+ for key_path in registry_key_paths:
+ try:
+ key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path)
+ i = 0
+ while True:
+ try:
+ subkey_name = winreg.EnumKey(key, i)
+ if 'WeChat' in subkey_name or 'Wechat' in subkey_name or 'wechat' in subkey_name:
+ subkey_path = f"{key_path}\\{subkey_name}"
+ value = read_registry_value(subkey_path, "FileSavePath")
+ if value and os.path.isdir(value):
+ wechat_path = os.path.join(value, 'WeChat Files')
+ if check_dir(wechat_path) == 0 and wechat_path not in found_paths:
+ found_paths.append(wechat_path)
+ i += 1
+ except OSError:
+ break
+ winreg.CloseKey(key)
+ except:
+ pass
+ except:
+ pass
+
+ return found_paths
class selectVersion:
@@ -66,11 +154,9 @@ def getAllPath(self):
if os.path.exists(dic[key]):
return get_dir_name(dic[key])
- # 注册表路径和字段名
registry_key_path = r"software\tencent\wechat"
value_name = "FileSavePath"
- # 读取字段值
value = read_registry_value(registry_key_path, value_name)
if value and value != 'MyDocument:' and os.path.isdir(value):
@@ -79,4 +165,3 @@ def getAllPath(self):
return get_dir_name(fpath)
else:
return ([], [])
-