Python 基于OpenList接口下载夸克网盘资源

背景

OpenList ------ “网盘聚合器”
近日,一个名为OpenList的开源网盘聚合神器,正成为越来越多网盘管理爱好者的新选择。它源于曾经广受欢迎的Alist项目,却在该项目走向商业化后,OpenList项目应运更生,由社区自发“接棒”继续前行

本篇文章介绍小编搜集来的一些夸克网盘资源,基于OpenList 批量下载到本地

资源小编也在这里分享一下:

小编环境

import sys

print('python 版本:',sys.version.split('|')[0])
#python 版本: 3.11.11

搭建OpenList

小编这里是在一台空闲的linux服务器安装

  1. 安装 OpenList 文档:https://doc.oplist.org/guide/installation/script
curl -fsSL https://res.oplist.org/script/v4.sh > install-openlist-v4.sh && sudo bash install-openlist-v4.sh
  1. 添加夸克存储文档:https://doc.oplist.org/guide/drivers/quark,需要通过浏览器获取 Cookie,小编这里的挂载路径为 /kuake,后续在下载网盘中的文件时,需要提供该路径,配置时开启Web代理,WebDAV策略:本地代理
配置

下载夸克资源完整代码

"""
===========================
@Time : 2026/1/3 19:41
@File : openlist
@Software: PyCharm
@Platform: Win10
@Author : 数据人阿多
===========================
"""

import time
import requests
import json
import pandas as pd
from pathlib import Path

class OpenList:
    def __init__(self,username,password,ip,port):
        self.username = username
        self.password = password
        self.ip = ip
        self.port = port
        self._login()

    def _login(self):
        url = f'http://{self.ip}:{self.port}/api/auth/login'
        payload = json.dumps({
            "username": self.username,
            "password": self.password,
            # "otp_code": otp_code
        })
        headers = {
            'Content-Type': 'application/json'
        }

        response = requests.request("POST", url, headers=headers, data=payload)

        self.token=response.json()['data']['token']

    def path_files(self,path,pages):
        api_url = f'http://{self.ip}:{self.port}/api/fs/list'

        pages_content_files = []
        pages_content_dirs = []
        for page in range(1,pages+1):
            page_content=self.path_every_page(page, api_url, path)

            if page_content:
                for page_detail in page_content:
                    if page_detail['is_dir']:
                        pages_content_dirs.append(page_detail)
                    else:
                        pages_content_files.append(page_detail)

            else:
                print(f"获取路径 {path} 数据完成!")
                break

        return pd.DataFrame(pages_content_files),pd.DataFrame(pages_content_dirs)

    def path_every_page(self, page, api_url, path, per_page=100):
        payload = json.dumps({
            "path": path,
            "password": "",
            "refresh": False,
            "page": page,
            "per_page": per_page
        })
        headers = {
            'Authorization': self.token,
            'Content-Type': 'application/json'
        }
        print(f"开始获取 {path} ,第{page:02}页数据")
        response = requests.request("POST", api_url, headers=headers, data=payload)

        return response.json()['data']['content']

    def download_file(self, url, filename, local_path, retry=3):
        for attempt in range(retry + 1):  # 尝试次数 = 重试次数 + 1
            try:
                response = requests.get(url, stream=True, timeout=30)
                # 检查请求是否成功
                if response.status_code == 200:
                    total_size = int(response.headers.get('content-length', 0))
                    downloaded = 0

                    with open(local_path / filename, 'wb') as f:
                        for chunk in response.iter_content(chunk_size=8192):
                            if chunk:
                                f.write(chunk)
                                downloaded += len(chunk)
                                # 可选:显示下载进度
                                if total_size > 0:
                                    percent = (downloaded / total_size) * 100
                                    print(f"\r下载进度: {percent:.1f}%", end='')

                    print(f"\n下载成功: {filename}")
                    return True

                elif response.status_code == 404:
                    print(f"文件不存在: {url}")
                    return False  # 404错误不需要重试

                else:
                    print(f"下载失败,状态码: {response.status_code}")

            except requests.exceptions.RequestException as e:
                print(f"请求异常: {e}")

            # 如果不是最后一次尝试,等待后重试
            if attempt < retry:
                wait_time = 2 ** attempt  # 指数退避:1, 2, 4秒...
                print(f"等待 {wait_time} 秒后重试... (剩余尝试: {retry - attempt})")
                time.sleep(wait_time)

        print(f"达到最大重试次数,下载失败: {filename}")
        return False

    def download_path_files(self, path, local_path, pages=10):

        path_files, path_dirs = self.path_files(path,pages)
        total_path_files=len(path_files)
        total_path_dirs=len(path_dirs)
        print(f"目录 {path} 下共有{total_path_files}个文件, 有{total_path_dirs}个目录")

        if total_path_files:
            print(f"开始下载目录 {path} 下的文件")
            for row in path_files.iterrows():
                # print(row)
                filename = row[1]['name']
                sign = row[1]['sign']
                url = f'http://{self.ip}:{self.port}/p{path}/{filename}?sign={sign}'

                print(f"开始下载[{row[0]+1}/{total_path_files}]:{filename}")
                self.download_file(url, filename, local_path)

        if total_path_dirs:
            for row_dir in path_dirs.iterrows():
                path_dir = path + '/' + row_dir[1]['name']


                local_path_subdir = local_path / row_dir[1]['name']
                if not local_path_subdir.exists():
                    local_path_subdir.mkdir()

                print(f"\n开始获取目录内容:{path_dir} ")
                self.download_path_files(path_dir, local_path_subdir)



if __name__ == '__main__':
    openlist = OpenList('admin','1234566','1.1.1.1','1024')
    # 获取当前路径
    current_path = Path.cwd()
    cloud_path = '/kuake/来自:分享/凯叔讲故事-历史集'
    path = current_path / 'ks'

    if not path.exists():
        path.mkdir()

    openlist.download_path_files(cloud_path, path)

提供linux服务器的ip、端口、用户名、密码,以及想下载的文件夹,运行后就可以下载到本地

API文档:https://fox.oplist.org/

工具与内容

在数字化生活中,我们常常面对两类选择:一个是“用什么工具”,另一个是“如何对待内容”

今天向大家介绍的 OpenList,正是众多网盘管理工具中的一个。市面上同类工具不少,你可以根据偏好自由选用,但 OpenList 背后那份 坚持开源、保持透明 的精神,尤其值得欣赏——这不仅关乎技术,更关乎一种共享、共建的社区态度。

工具本质是桥梁,最终的价值仍沉淀于内容。小编始终鼓励,在条件允许的情况下,通过付费订阅等方式支持原创作者。正是这些支持,才能让创作得以延续,让高质量的内容不断涌现。

当然,小编也观察到,有些本应开放的资源,在流转中被人为加上了不必要的门槛;看一部剧、听一首歌,往往需要跨过层层会员壁垒。当资源被过度封装,能够帮助我们更便捷、更自由地管理个人数字资产的工具,便显出了它的意义。

好的工具,应当让人更靠近内容本身,而不是更远
选择什么样的工具,其实也在表达我们如何看待内容、尊重创作以及守护自己本就应有的数字便利。

如果你也认同这样的理念,不妨尝试一下 OpenList,或者只是单纯思考一下:我们手中的工具,是否真的让我们离想看的世界更近了一点?

历史相关文章


以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容