83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
![]() |
#!/usr/bin/env python
|
|||
|
# -*- coding: utf- -*-
|
|||
|
|
|||
|
import argparse
|
|||
|
from webdav3.client import Client
|
|||
|
import os
|
|||
|
import time
|
|||
|
|
|||
|
count=0
|
|||
|
|
|||
|
def walk(client, current_path="/", output_file=None, replaceroot=None):
|
|||
|
items=client.list(current_path)
|
|||
|
for item in items[1:]:
|
|||
|
full_path = f"{current_path}/{item}".replace("//", "/")
|
|||
|
try:
|
|||
|
is_dir = client.is_dir(full_path)
|
|||
|
except:
|
|||
|
continue
|
|||
|
if is_dir: # 判断是否为目录
|
|||
|
#global count
|
|||
|
#count=count+1
|
|||
|
#if count%4==0:
|
|||
|
# time.sleep(1)
|
|||
|
try:
|
|||
|
walk(client, full_path, output_file, replaceroot)
|
|||
|
except:
|
|||
|
pass
|
|||
|
else:
|
|||
|
size = client.info(full_path).get('size', 0)
|
|||
|
if replaceroot!=None:
|
|||
|
if replaceroot=="":
|
|||
|
full_path=os.path.join("/",*full_path.split("/")[2:])
|
|||
|
else:
|
|||
|
full_path=os.path.join("/",replaceroot,*full_path.split("/")[2:])
|
|||
|
print(f"{full_path}\t{size}")
|
|||
|
if output_file != None:
|
|||
|
output_file.write(f"{full_path}\t{size}\n")
|
|||
|
|
|||
|
|
|||
|
from urllib.parse import urlparse
|
|||
|
|
|||
|
def extract_url_components(url):
|
|||
|
"""分解 URL 为 schema(协议)、hostname(主机地址)、path(路径)"""
|
|||
|
parsed = urlparse(url)
|
|||
|
|
|||
|
# 提取核心组件
|
|||
|
schema = parsed.scheme or "http" # 默认协议处理
|
|||
|
hostname = f"{parsed.hostname}:{parsed.port}" # 自动过滤端口和认证信息
|
|||
|
path = parsed.path.rstrip('/') or '/' # 路径标准化
|
|||
|
|
|||
|
return schema, hostname, path
|
|||
|
|
|||
|
|
|||
|
def main():
|
|||
|
parser = argparse.ArgumentParser(description='快速遍历WebDAV目录')
|
|||
|
parser.add_argument('--url', type=str, required=True, help='WebDAV URL')
|
|||
|
parser.add_argument('--username', type=str, required=True, help='WebDAV username')
|
|||
|
parser.add_argument('--password', type=str, required=True, help='WebDAV password')
|
|||
|
parser.add_argument('--output', type=str, required=True, help='outputfile')
|
|||
|
parser.add_argument('--replaceroot', type=str, default=None, required=False, help='替换根目录名称')
|
|||
|
args = parser.parse_args()
|
|||
|
|
|||
|
schema, hostname, path = extract_url_components(args.url)
|
|||
|
print(schema,hostname,path)
|
|||
|
|
|||
|
options = {
|
|||
|
'webdav_hostname': schema+"://"+hostname,
|
|||
|
'webdav_root': '/',
|
|||
|
'webdav_login': args.username,
|
|||
|
'webdav_password': args.password,
|
|||
|
'disable_check': True, # 跳过 SSL 证书验证:ml-citation{ref="6" data="citationList"}
|
|||
|
'disable_head': True, # 跳过 SSL 证书验证:ml-citation{ref="6" data="citationList"}
|
|||
|
}
|
|||
|
client = Client(options)
|
|||
|
|
|||
|
print("WebDAV URL:", args.url)
|
|||
|
output_file = open(args.output, mode="a", encoding="utf-8")
|
|||
|
walk(client, path, output_file,args.replaceroot)
|
|||
|
output_file.close()
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
main()
|