@@ -69,18 +69,6 @@ def _post(self, url, data, **kwargs):
69
69
except (ConnectionError , requests .RequestException ):
70
70
return None
71
71
72
- @staticmethod
73
- def _is_file_url (share_url ) -> bool :
74
- """判断是否为文件的分享链接"""
75
- pat = 'https?://www.lanzous.com/i[a-z0-9]{6,}/?'
76
- return True if re .fullmatch (pat , share_url ) else False
77
-
78
- @staticmethod
79
- def _is_folder_url (share_url ) -> bool :
80
- """判断是否为文件夹的分享链接"""
81
- pat = 'https?://www.lanzous.com/b[a-z0-9]{7,}/?'
82
- return True if re .fullmatch (pat , share_url ) else False
83
-
84
72
@staticmethod
85
73
def _remove_notes (html ) -> str :
86
74
"""删除网页的注释"""
@@ -117,6 +105,18 @@ def _get_right_name(self, filename):
117
105
ftype = filename .split ('.' )[- 1 ] # 正确的文件后缀
118
106
return filename , ftype .lower ()
119
107
108
+ @staticmethod
109
+ def is_file_url (share_url ) -> bool :
110
+ """判断是否为文件的分享链接"""
111
+ pat = 'https?://www.lanzous.com/i[a-z0-9]{6,}/?'
112
+ return True if re .fullmatch (pat , share_url ) else False
113
+
114
+ @staticmethod
115
+ def is_folder_url (share_url ) -> bool :
116
+ """判断是否为文件夹的分享链接"""
117
+ pat = 'https?://www.lanzous.com/b[a-z0-9]{7,}/?'
118
+ return True if re .fullmatch (pat , share_url ) else False
119
+
120
120
def set_rar_tool (self , bin_path ) -> int :
121
121
"""设置解压工具路径"""
122
122
if os .path .isfile (bin_path ):
@@ -356,19 +356,20 @@ def get_full_path(self, folder_id=-1) -> dict:
356
356
html = self ._get (self ._mydisk_url , params = {'item' : 'files' , 'action' : 'index' , 'folder_id' : folder_id })
357
357
if not html :
358
358
return path_list
359
- path = re .findall (r'» .+folder_id=([0-9]+)">.+ (.+?)</a>' , html .text )
360
- for i in path :
361
- path_list [i [1 ]] = int (i [0 ])
359
+ html = LanZouCloud ._remove_notes (html .text )
360
+ path = re .findall (r'» .+?folder_id=(\d+)">.+? (.+?)</a>' , html )
361
+ for fid , name in path :
362
+ path_list [name ] = int (fid )
362
363
# 获取当前文件夹名称
363
364
if folder_id != - 1 :
364
- current_folder = re .findall (r'»& nbsp;.+ (.+) < font' , html . text )[ 0 ] .replace ('&' , '&' )
365
+ current_folder = re .search (r'align="(top|absmiddle)" />& nbsp;(.+?)\s<(span| font) ' , html ). group ( 2 ) .replace ('&' , '&' )
365
366
path_list [current_folder ] = folder_id
366
367
return path_list
367
368
368
369
def get_file_info_by_url (self , share_url , pwd = '' ):
369
370
"""获取直链"""
370
- no_result = {'name' : '' , 'size' : '' , 'type' : '' , 'time' : '' , 'desc' : '' , 'durl' : '' }
371
- if not self ._is_file_url (share_url ): # 非文件链接返回错误
371
+ no_result = {'name' : '' , 'size' : '' , 'type' : '' , 'time' : '' , 'desc' : '' , 'pwd' : '' , 'url' : '' , ' durl' : '' }
372
+ if not self .is_file_url (share_url ): # 非文件链接返回错误
372
373
return {'code' : LanZouCloud .URL_INVALID , ** no_result }
373
374
374
375
first_page = self ._get (share_url ) # 文件分享页面(第一页)
@@ -422,15 +423,15 @@ def get_file_info_by_url(self, share_url, pwd=''):
422
423
return {'code' : LanZouCloud .NETWORK_ERROR , ** no_result }
423
424
else :
424
425
link_info = link_info .json ()
425
- # link_info['inf'] = f_name # 无提取码时 inf 字段为 0,有提取码时该字段为文件名
426
426
427
427
# 这里开始获取文件直链
428
428
if link_info ['zt' ] == 1 :
429
429
fake_url = link_info ['dom' ] + '/file/' + link_info ['url' ] # 假直连,存在流量异常检测
430
430
direct_url = self ._get (fake_url , allow_redirects = False ).headers ['Location' ] # 重定向后的真直链
431
431
f_name , ftype = self ._get_right_name (f_name )
432
432
return {'code' : LanZouCloud .SUCCESS , 'name' : f_name , 'size' : f_size , 'type' : ftype ,
433
- 'time' : LanZouCloud ._time_format (f_time ), 'desc' : f_desc , 'durl' : direct_url }
433
+ 'time' : LanZouCloud ._time_format (f_time ), 'desc' : f_desc , 'pwd' : pwd ,
434
+ 'url' : share_url , 'durl' : direct_url }
434
435
else :
435
436
return {'code' : LanZouCloud .PASSWORD_ERROR , ** no_result }
436
437
@@ -502,6 +503,8 @@ def mkdir(self, parent_id, folder_name, desc='') -> int:
502
503
folder_list = self .get_dir_id_list (parent_id )
503
504
if folder_name in folder_list .keys (): # 如果文件夹已经存在,直接返回 id
504
505
return folder_list .get (folder_name )
506
+ if folder_name in self .get_folder_id_list ().keys (): # 防止文件夹名重复导致其它功能混乱
507
+ return self .mkdir (parent_id , folder_name + '_' , desc )
505
508
post_data = {"task" : 2 , "parent_id" : parent_id or - 1 , "folder_name" : folder_name ,
506
509
"folder_description" : desc }
507
510
result = self ._post (self ._doupload_url , post_data ) # 创建文件夹
@@ -548,10 +551,12 @@ def set_desc(self, fid, desc, is_file=True) -> int:
548
551
def get_folder_id_list (self ) -> dict :
549
552
"""获取全部文件夹 name-id 列表,用于移动文件至新的文件夹"""
550
553
# 这里 file_id 可以为任意值,不会对结果产生影响
551
- result = self ._post (self ._doupload_url , data = {"task" : 19 , "file_id" : - 1 })
552
- if not result or result .json ()['zt' ] != 1 : # 获取失败或者网络异常
553
- return {}
554
- return {i ['folder_name' ]: int (i ['folder_id' ]) for i in result .json ()['info' ]}
554
+ result = {'LanZouCloud' : - 1 }
555
+ resp = self ._post (self ._doupload_url , data = {"task" : 19 , "file_id" : - 1 })
556
+ if not resp or resp .json ()['zt' ] != 1 : # 获取失败或者网络异常
557
+ return result
558
+ folder_id_list = {i ['folder_name' ]: int (i ['folder_id' ]) for i in resp .json ()['info' ]}
559
+ return {** result , ** folder_id_list }
555
560
556
561
def move_file (self , file_id , folder_id = - 1 ) -> int :
557
562
"""移动文件到指定文件夹"""
@@ -685,7 +690,7 @@ def upload_file(self, file_path, folder_id=-1, call_back=None) -> dict:
685
690
# 现在上传真正的文件并保存上传结果
686
691
code = self ._upload_a_file ('./tmp/' + f , dir_id , call_back )
687
692
if code != LanZouCloud .SUCCESS : # 记录上传失败的文件
688
- result ['status ' ] = LanZouCloud .FAILED
693
+ result ['code ' ] = LanZouCloud .FAILED
689
694
result ['failed' ].append (f )
690
695
rmtree ('./tmp' )
691
696
return result
@@ -704,13 +709,13 @@ def upload_dir(self, dir_path, folder_id=-1, call_back=None) -> dict:
704
709
continue # 跳过子文件夹
705
710
up_failed = self .upload_file (dir_path + os .sep + file , dir_id , call_back )['failed' ]
706
711
if up_failed : # 上传失败的文件列表
707
- result ['status ' ] = LanZouCloud .FAILED
712
+ result ['code ' ] = LanZouCloud .FAILED
708
713
result ['failed' ] += up_failed
709
714
return result
710
715
711
716
def down_file_by_url (self , share_url , pwd = '' , save_path = '.' , call_back = None ) -> int :
712
717
"""通过分享链接下载文件(需提取码)"""
713
- if not self ._is_file_url (share_url ):
718
+ if not self .is_file_url (share_url ):
714
719
return LanZouCloud .URL_INVALID
715
720
if not os .path .exists (save_path ):
716
721
os .makedirs (save_path )
@@ -766,7 +771,7 @@ def _unzip(self, file_list, save_path) -> int:
766
771
def get_folder_info_by_url (self , share_url , dir_pwd = '' ) -> dict :
767
772
"""获取文件夹里所有文件的信息"""
768
773
no_result = {'folder' : {}, 'files' : []}
769
- if LanZouCloud ._is_file_url (share_url ):
774
+ if LanZouCloud .is_file_url (share_url ):
770
775
return {'code' : LanZouCloud .URL_INVALID , ** no_result }
771
776
try :
772
777
html = requests .get (share_url , headers = self ._headers ).text
@@ -828,7 +833,7 @@ def get_folder_info_by_url(self, share_url, dir_pwd='') -> dict:
828
833
folder_time = datetime .today ().strftime ('%Y-%m-%d' )
829
834
return {'code' : LanZouCloud .SUCCESS ,
830
835
'folder' : {'name' : folder_name , 'id' : folder_id , 'pwd' : dir_pwd , 'time' : folder_time ,
831
- 'desc' : folder_desc },
836
+ 'desc' : folder_desc , 'url' : share_url },
832
837
'files' : files }
833
838
834
839
def get_folder_info_by_id (self , folder_id ):
@@ -850,11 +855,11 @@ def down_dir_by_url(self, share_url, dir_pwd='', save_path='./down', call_back=N
850
855
for name , url in info :
851
856
code = self .down_file_by_url (url , '' , save_path , call_back )
852
857
if code != LanZouCloud .SUCCESS : # 有文件下载失败了
853
- result ['status ' ] = LanZouCloud .FAILED
858
+ result ['code ' ] = LanZouCloud .FAILED
854
859
result ['failed' ].append ({'name' : name , 'url' : url , 'code' : code })
855
860
856
861
# 部分文件下载失败,没必要尝试解压了
857
- if result ['status ' ] != LanZouCloud .SUCCESS :
862
+ if result ['code ' ] != LanZouCloud .SUCCESS :
858
863
return result
859
864
860
865
# 全部下载成功且文件都是分卷压缩文件 *.xxx[0-9]+.rar,则下载后需要解压
@@ -865,6 +870,7 @@ def down_dir_by_url(self, share_url, dir_pwd='', save_path='./down', call_back=N
865
870
866
871
if self ._unzip (f_name_list , save_path ) == LanZouCloud .ZIP_ERROR :
867
872
return {'code' : LanZouCloud .ZIP_ERROR , 'failed' : []} # 解压时发生错误
873
+ return result
868
874
869
875
def down_dir_by_id (self , fid , save_path = './down' , call_back = None ) -> dict :
870
876
"""登录用户通过id下载文件夹"""
@@ -876,13 +882,14 @@ def down_dir_by_id(self, fid, save_path='./down', call_back=None) -> dict:
876
882
code = self .down_file_by_id (fid , save_path , call_back )
877
883
logger .debug (f'Download file result code: { code } ' )
878
884
if code != LanZouCloud .SUCCESS :
879
- result ['status ' ] = LanZouCloud .FAILED
885
+ result ['code ' ] = LanZouCloud .FAILED
880
886
result ['failed' ].append ({'name' : name , 'id' : fid , 'code' : code })
881
- if result ['status ' ] != LanZouCloud .SUCCESS :
887
+ if result ['code ' ] != LanZouCloud .SUCCESS :
882
888
return result
883
889
f_name_list = list (file_list .keys ()) # 文件名列表
884
890
for name in f_name_list :
885
891
if not re .match (r'.*\.\w+[0-9]+\.rar' , name ):
886
892
return result
887
893
if self ._unzip (f_name_list , save_path ) == LanZouCloud .ZIP_ERROR :
888
894
return {'code' : LanZouCloud .ZIP_ERROR , 'failed' : []} # 解压时发生错误
895
+ return result
0 commit comments