You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python获取带解密密钥的MEGA公开文件夹总大小?

如何通过Python获取带解密密钥的MEGA公开文件夹总大小?

我完全懂你遇到的困扰——mega.py这个库确实只对公开文件链接做了支持,完全没处理文件夹链接的解析逻辑,所以直接用get_public_url_info会报错。不过别担心,我们可以绕开这个限制,手动解析文件夹链接并调用MEGA的底层API来获取内容,最后计算总大小。

解决思路

  1. 手动解析公开文件夹链接:从https://mega.nz/folder/[folder_id]#[decryption_key]格式的链接里,提取出文件夹ID和对应的解密密钥
  2. 匿名登录MEGA:公开文件夹不需要账号权限,用匿名登录就能访问
  3. 调用MEGA API获取文件夹内容:通过MEGA的官方API端点获取文件夹内的所有文件和子文件夹
  4. 递归遍历并累加大小:遍历所有文件节点累加大小,遇到子文件夹就递归处理,最后得到总大小

完整实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:38:00