如何使用 Python 中的大型 API 按共享 URL 列出大型公共文件夹的内容



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

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

有人能告诉我怎么做吗?

从公用文件夹的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)

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

(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"]

正在从共享文件夹下载文件

这不是你问题的一部分,但我只想补充一个简短的总结,也许其他人会觉得这很有帮助。

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

data = [{ 'a': 'g', 'g': 1, 'n': node['h'] }]

然后基本上复制mega.py库的_download_file函数,用从decrypt_node_key(...)获得的密钥替换file_key

最新更新