吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4209|回复: 25
收起左侧

[Python 原创] Alist网盘遍历文件并调用Aria2的API进行批量下载并按目录结构保存

  [复制链接]
禁之零零 发表于 2023-2-16 11:50
本帖最后由 禁之零零 于 2023-2-27 16:03 编辑

[Python] 纯文本查看 复制代码
import requests
from urllib import parse
import json
from Aria2_RPC import Aria2Download
import time


class AlistDownload:
    def __init__(self, url):
        self.headers = {
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
            "Content-Type": "application/json;charset=UTF-8",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9"
        }

        parseresult = parse.urlparse(url)
        scheme = parseresult.scheme
        netloc = parseresult.netloc
        path = parse.unquote(parseresult.path)

        self.host = f"{scheme}://{netloc}"
        self.aria2 = Aria2Download()
        self.get_list(path)
        print("遍历完成")

    def post(self, url, data) -> (bool, dict):
        req_json = {}
        error_number = 0
        while True:
            status_code = 0
            try:
                req = requests.post(url=url, data=json.dumps(data), headers=self.headers, timeout=15)
                status_code = req.status_code
                req_json = req.json()
                req.close()
            except:
                pass

            if status_code == 200:
                break
            elif error_number > 2:
                break
            else:
                error_number += 1
                time.sleep(1)

        if status_code == 200:
            return True, req_json
        else:
            return False, req_json

    def get_list(self, path):
        url = self.host + "/api/fs/list"
        data = {"path": path, "password": "", "page": 1, "per_page": 0, "refresh": False}
        file_list = []
        error_number = 0
        while True:
            req_type, req_json = self.post(url=url, data=data)
            if req_type is False:
                return
            elif req_json.get("code") == 200:
                break
            elif error_number > 2:
                break
            else:
                print(req_json)
                error_number += 1
                time.sleep(2)
        if req_json.get("data") is None:
            return
        content = req_json.get("data")["content"]
        if content is None:
            return
        for file_info in content:
            if file_info["is_dir"] is True:
                file_download_url = path + "/" + file_info["name"]
                print("dir", file_download_url)
                file_list.append({"is_dir": True, "path": file_download_url})
            else:
                file_download_url = self.host + "/d" + path + "/" + file_info["name"]
                print("file", file_download_url)
                sign = file_info.get("sign")
                if sign is not None:
                    file_download_url = file_download_url + "?sign=" + sign
                file_list.append(
                    {"is_dir": False, "url": file_download_url, "path": path, "file": file_info["name"]})

        for file in file_list:
            if file["is_dir"] is True:
                self.get_list(file["path"])
            else:
                # D:\download 文件下载的存储地址
                self.aria2.addUri(file["url"], r"D:\download" + file["path"], file["file"])
                pass


if __name__ == '__main__':
    AlistDownload(
        "http://此处填入Alist网盘的地址")



Aria2的API详见这里:基于Aria2的API接口进行批量下载源码

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
helian147 + 1 + 1 热心回复!
fatcats + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wubit 发表于 2023-2-25 08:58
又有新问题了.只能下载一部分文件.报错以后就直接退出了.没有错误处理的代码.
dir /01小雅/教育/60T的知识仓库/✍🏻️教育楼【30.07T】/🖋️ 高中专区【2.28TB】/【高中竞赛资料】- new!(新增)【12.64GB】/高中生物竞赛【4.05GB】
dir /01小雅/教育/60T的知识仓库/✍🏻️教育楼【30.07T】/🖋️ 高中专区【2.28TB】/【高中竞赛资料】- new!(新增)【12.64GB】/高中化学竞赛【2.03GB】
dir /01小雅/教育/60T的知识仓库/✍🏻️教育楼【30.07T】/🖋️ 高中专区【2.28TB】/【高中竞赛资料】- new!(新增)【12.64GB】/高中竞赛联赛考前辅导【342.75MB】
Traceback (most recent call last):
  File "D:\天翼云盘同步盘\new\alist.py", line 78, in <module>
    AlistDownload("http://wubit.cn:5244/01%E5%B0%8F%E9%9B%85/%E6%95%99%E8%82%B2/60T%E7%9A%84%E7%9F%A5%E8%AF%86%E4%BB%93%E5%BA%93/%E2%9C%8D%F0%9F%8F%BB%EF%B8%8F%E6%95%99%E8%82%B2%E6%A5%BC%E3%80%9030.07T%E3%80%91/%F0%9F%96%8B%EF%B8%8F%20%E9%AB%98%E4%B8%AD%E4%B8%93%E5%8C%BA%E3%80%902.28TB%E3%80%91")
  File "D:\天翼云盘同步盘\new\alist.py", line 32, in __init__
    self.get_list(path)
  File "D:\天翼云盘同步盘\new\alist.py", line 70, in get_list
    self.get_list(file["path"])
  File "D:\天翼云盘同步盘\new\alist.py", line 70, in get_list
    self.get_list(file["path"])
  File "D:\天翼云盘同步盘\new\alist.py", line 45, in get_list
    content = req_json.get("data")["content"]
TypeError: 'NoneType' object is not subscriptable
 楼主| 禁之零零 发表于 2023-2-23 15:41
wubit 发表于 2023-2-23 14:57
已经应用.下载列表里面都有文件了.也下载了东西.但是里面只有报错
{"code":401,"message":"expire missing ...

看了下是新版的Alist下载文件的GET请求中带有一sign参数,我之前要下载的那个Alist应该是个旧版本不需要这个,只需要在49~50行这两行代码中加入代码即可解决:
[Python] 纯文本查看 复制代码
                        sign = file_info.get("sign")
                        if sign is not None:
                            file_download_url = file_download_url + "?sign=" + sign
ysjd22 发表于 2023-2-16 19:54
hetiwz 发表于 2023-2-18 15:35
感谢~非常棒
lzj1995 发表于 2023-2-18 18:46
大佬能不能写一下脚本可以批量提取出 alist对应文件名和下载直连,最好可以生成一个表格
 楼主| 禁之零零 发表于 2023-2-20 10:12
lzj1995 发表于 2023-2-18 18:46
大佬能不能写一下脚本可以批量提取出 alist对应文件名和下载直连,最好可以生成一个表格

改一下61行的代码,把file["url"]和file["file"]保存在表格中就能实现你的要求了
心伤的天堂 发表于 2023-2-20 10:52
请教一下,这个模块怎么安装呢
ModuleNotFoundError: No module named 'Aria2_RPC'

我找了一下,没找到
 楼主| 禁之零零 发表于 2023-2-20 13:57
心伤的天堂 发表于 2023-2-20 10:52
请教一下,这个模块怎么安装呢
ModuleNotFoundError: No module named 'Aria2_RPC'

你没有仔细看到帖子的末尾,这个模块在宁外一个帖子中给予Aria2的API接口进行批量下载源码
心伤的天堂 发表于 2023-2-20 18:32
禁之零零 发表于 2023-2-20 13:57
你没有仔细看到帖子的末尾,这个模块在宁外一个帖子中给予Aria2的API接口进行批量下载源码

懂了 懂了 感谢分享
wubit 发表于 2023-2-23 14:43
下载回来是一个接口报错的1K文件
 楼主| 禁之零零 发表于 2023-2-23 14:47
wubit 发表于 2023-2-23 14:43
下载回来是一个接口报错的1K文件

看帖子的末尾,有说明引用的外部模块Aria2_PRC在哪
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-23 22:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表