如何通过Python获取带解密密钥的MEGA公开文件夹总大小?
如何通过Python获取带解密密钥的MEGA公开文件夹总大小?
我完全懂你遇到的困扰——mega.py这个库确实只对公开文件链接做了支持,完全没处理文件夹链接的解析逻辑,所以直接用get_public_url_info会报错。不过别担心,我们可以绕开这个限制,手动解析文件夹链接并调用MEGA的底层API来获取内容,最后计算总大小。
解决思路
- 手动解析公开文件夹链接:从
https://mega.nz/folder/[folder_id]#[decryption_key]格式的链接里,提取出文件夹ID和对应的解密密钥 - 匿名登录MEGA:公开文件夹不需要账号权限,用匿名登录就能访问
- 调用MEGA API获取文件夹内容:通过MEGA的官方API端点获取文件夹内的所有文件和子文件夹
- 递归遍历并累加大小:遍历所有文件节点累加大小,遇到子文件夹就递归处理,最后得到总大小
完整实现代码
from mega import Mega from mega.errors import RequestError import math def parse_public_folder_url(folder_url): """解析MEGA公开文件夹链接,返回文件夹ID和解密密钥""" if '/folder/' not in folder_url: raise ValueError("传入的链接不是有效的MEGA公开文件夹链接") url_parts = folder_url.split('#') if len(url_parts) != 2: raise ValueError("链接缺少必要的解密密钥") folder_id = url_parts[0].split('/folder/')[-1] folder_key = url_parts[1] return folder_id, folder_key def format_file_size(size_bytes): """将字节数格式化为易读的单位(B/KB/MB/GB/TB)""" if size_bytes == 0: return "0 B" size_units = ["B", "KB", "MB", "GB", "TB"] unit_index = int(math.floor(math.log(size_bytes, 1024))) unit_factor = math.pow(1024, unit_index) readable_size = round(size_bytes / unit_factor, 2) return f"{readable_size} {size_units[unit_index]}" def get_public_folder_total_size(folder_url): """计算MEGA公开文件夹的总大小,返回字节数""" # 初始化MEGA客户端并匿名登录 mega = Mega() client = mega.login() # 不带参数就是匿名登录 try: folder_id, folder_key = parse_public_folder_url(folder_url) except ValueError as e: print(f"链接解析失败: {e}") return 0 total_size = 0 def traverse_folder_nodes(folder_handle, folder_decryption_key): """递归遍历文件夹节点,累加文件大小""" nonlocal total_size try: # 调用MEGA API获取当前文件夹的所有节点 api_response = client._api_request( 'f', data={ 'a': 'f', 'c': 1, 'ca': 1, 'r': 1, 'n': folder_handle, 'k': folder_decryption_key } ) except RequestError as e: print(f"获取文件夹内容失败: {e}") return for node in api_response['f']: # 节点类型说明:0=文件,1=文件夹 if node['t'] == 0: # 是文件,直接累加大小 total_size += node['s'] elif node['t'] == 1: # 是子文件夹,递归遍历 # 子文件夹的密钥需要结合父文件夹密钥使用 sub_folder_key = f"{folder_decryption_key}/{node['k']}" traverse_folder_nodes(node['h'], sub_folder_key) # 开始遍历根文件夹 traverse_folder_nodes(folder_id, folder_key) return total_size # 测试使用示例 if __name__ == "__main__": target_folder_url = "https://mega.nz/folder/XXXXXX#YYYYYYYY" # 替换成你的文件夹链接 total_bytes = get_public_folder_total_size(target_folder_url) print(f"文件夹总大小(字节): {total_bytes}") print(f"文件夹总大小(格式化): {format_file_size(total_bytes)}")
关键细节说明
- 链接解析:我们手动拆分链接,提取文件夹ID和密钥,避开
mega.py不支持文件夹的限制 - 匿名登录:
mega.login()不带参数时会自动使用匿名会话,完全满足公开文件夹的访问需求 - API调用:使用MEGA的
f端点获取文件夹内容,这个端点是官方用于获取文件夹节点列表的接口 - 递归遍历:处理文件夹内的子文件夹,确保所有层级的文件大小都被累加
为什么之前的方法失败?
看你贴的_parse_url方法源码就知道,它只处理了/file/开头的链接和带!的旧版文件链接,完全没有判断/folder/的情况,所以直接调用会抛出"Url key missing"的错误。我们的方法相当于绕过了这个有缺陷的解析逻辑,直接和API交互。
内容来源于stack exchange
相关产品推荐
相关产品推荐

