我如何使用python中的mega api通过共享url列出大型公共文件夹的内容

th3*_*lus 5 python python-3.6

我想使用它在 python 中的共享链接迭代公共文件夹内容,并使用 mega api 提取它的信息,唯一可用的方法是获取仅在特定帐户中可用的文件列表

 def get_files_in_node(self, target):
    """
    Get all files in a given target, e.g. 4=trash
    """
    if type(target) == int:
        # convert special nodes (e.g. trash)
        node_id = self.get_node_by_type(target)
    else:
        node_id = [target]

    files = self._api_request({'a': 'f', 'c': 1})
    files_dict = {}
    shared_keys = {}
    self._init_shared_keys(files, shared_keys)
    for file in files['f']:
        processed_file = self._process_file(file, shared_keys)
        if processed_file['a'] and processed_file['p'] == node_id[0]:
            files_dict[file['h']] = processed_file
    return files_dict
Run Code Online (Sandbox Code Playgroud)

谁能告诉我怎么做?

Blu*_*ick 5

从公用文件夹的 URL 检索节点列表

这是我用来获取 Mega 公共文件夹中文件列表的代码。它使用与mega.py库中的解密相关的函数。

from mega.crypto import base64_to_a32, base64_url_decode, decrypt_attr, decrypt_key

def get_nodes_in_shared_folder(root_folder: str) -> dict:
    data = [{"a": "f", "c": 1, "ca": 1, "r": 1}]
    response = requests.post(
        "https://g.api.mega.co.nz/cs",
        params={'id': 0,  # self.sequence_num
                'n': root_folder},
        data=json.dumps(data)
    )
    json_resp = response.json()
    return json_resp[0]["f"]

def parse_folder_url(url: str) -> Tuple[str, str]:
    "Returns (public_handle, key) if valid. If not returns None."
    REGEXP1 = re.compile(r"mega.[^/]+/folder/([0-z-_]+)#([0-z-_]+)(?:/folder/([0-z-_]+))*")
    REGEXP2 = re.compile(r"mega.[^/]+/#F!([0-z-_]+)[!#]([0-z-_]+)(?:/folder/([0-z-_]+))*")
    m = re.search(REGEXP1, url)
    if not m:
        m = re.search(REGEXP2, url)
    if not m:
        print("Not a valid URL")
        return None
    root_folder = m.group(1)
    key = m.group(2)
    # You may want to use m.groups()[-1]
    # to get the id of the subfolder
    return (root_folder, key)

def decrypt_node_key(key_str: str, shared_key: str) -> Tuple[int, ...]:
    encrypted_key = base64_to_a32(key_str.split(":")[1])
    return decrypt_key(encrypted_key, shared_key)
Run Code Online (Sandbox Code Playgroud)

用于获取公共共享文件夹中的文件及其元数据的列表的示例代码。

(root_folder, shared_enc_key) = parse_folder_url("<insert url here>")
shared_key = base64_to_a32(shared_enc_key)
nodes = get_nodes_in_shared_folder(root_folder)
for node in nodes:
    key = decrypt_node_key(node["k"], shared_key)
    if node["t"] == 0: # Is a file
        k = (key[0] ^ key[4], key[1] ^ key[5], key[2] ^ key[6], key[3] ^ key[7])
    elif node["t"] == 1: # Is a folder
        k = key
    attrs = decrypt_attr(base64_url_decode(node["a"]), k)
    file_name = attrs["n"]
    file_id = node["h"]
Run Code Online (Sandbox Code Playgroud)

从共享文件夹下载文件

这不是您问题的一部分,但我只是添加一个简短的摘要,也许其他人会发现它有帮助。

要下载,您需要使用与上面相同的参数发出 POST 请求,但数据更改为:

data = [{ 'a': 'g', 'g': 1, 'n': node['h'] }]
Run Code Online (Sandbox Code Playgroud)

然后基本上复制 mega.py 库的_download_file函数,替换file_key为您从decrypt_node_key(...).