# QuarkPan - 夸克网盘 Python 客户端

[![Python](https://img.shields.io/badge/Python-3.8+-blue.svg)](https://www.python.org)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![PyPi](https://img.shields.io/pypi/v/quarkpan.svg)](https://pypi.python.org/pypi/quarkpan) 

一个功能完整的夸克网盘 Python API 客户端和命令行工具，支持文件管理、上传下载、分享转存等核心功能。提供简洁的 Python API 接口和强大的命令行工具，满足自动化脚本和日常使用需求。

发送 `WCF` 进入社区交流，获取更多资源：
<center>

![公众号搜索【漩智】加入社区](QrCode.jpg)
</center>

## ✨ 主要功能

### 🔐 登录认证
- **API 二维码登录**: 通过官方 API 获取二维码，手机扫码安全登录
- **手动 Cookie 登录**: 支持手动输入 Cookie 的备用登录方式  
- **自动登录状态检查**: 智能检测登录状态，避免重复认证
- **安全 Cookie 管理**: 加密存储登录凭证，支持自动刷新

### 📁 文件管理
- **文件夹浏览**: 递归浏览文件夹，支持分页和路径导航
- **文件搜索**: 全盘关键词搜索，支持文件名和内容匹配
- **文件操作**: 创建、删除、重命名、移动文件和文件夹
- **批量操作**: 支持批量选择和处理多个文件
- **存储信息**: 实时查看网盘容量使用情况

### 📤 上传下载  
- **文件上传**: 支持单文件和文件夹上传，自动处理大文件分片
- **下载链接**: 获取文件直接下载地址，支持外部下载工具
- **进度显示**: 实时显示上传下载进度和速度
- **断点续传**: 支持大文件的断点续传功能

### 🔗 分享功能
- **创建分享**: 为文件 / 文件夹创建分享链接，支持密码和有效期设置
- **分享管理**: 查看、编辑、删除自己的分享记录
- **分享转存**: 将他人分享的资源一键转存到自己网盘
- **链接解析**: 智能识别和解析各种格式的分享链接

### 🖥️ 命令行工具
- **交互式界面**: 提供类似文件管理器的交互式命令行界面  
- **丰富命令集**: 涵盖所有网盘操作的完整命令集合
- **美观输出**: 使用 Rich 库提供彩色和格式化的终端输出
- **批量脚本**: 支持批量操作脚本和自动化任务

## 🚀 快速开始

### 安装
#### 方法一：直接安装
```sh
pip install quarkpan
```

#### 方法二：从源码安装
```bash
# 克隆项目
git clone https://github.com/lich0821/QuarkPan.git
cd QuarkPan

# 安装依赖
pip install -r requirements.txt

# 开发模式安装（可选）
pip install -e .
```

#### 方法三：直接使用
```bash
# 克隆后直接运行
git clone https://github.com/lich0821/QuarkPan.git
cd QuarkPan
pip install -r requirements.txt

# 三种运行方式任选其一：
# 1. 使用 Python 模块方式
python -m quark_client.cli --help

# 2. 直接运行 CLI 脚本
python cli.py --help

# 3. 安装后使用命令行工具（需要先运行 pip install -e .）
# quarkpan --help
```

### 快速体验

#### 1. 首次登录
```bash
# 启动交互式命令行工具（推荐新手使用）
python -m quark_client.cli interactive
# 或者
python cli.py interactive

# 直接进行二维码登录
python -m quark_client.cli auth login
# 或者
python cli.py auth login
```

#### 2. Python API 快速上手
```python
from quark_client import QuarkClient

# 创建客户端（首次使用会自动引导登录）
with QuarkClient() as client:
    # 检查登录状态
    if not client.is_logged_in():
        client.login()  # 自动打开二维码登录

    # 获取根目录文件列表
    files = client.list_files()
    print(f"找到 {len(files['data']['list'])} 个文件")

    # 搜索文件
    results = client.search_files("重要文档")

    # 获取存储信息
    storage = client.get_storage_info()
    print(f"已使用: {storage['data']['used'] / (1024**3):.2f} GB")
```

## 📖 详细使用说明

### Python API 使用

#### 基础文件操作
```python
from quark_client import QuarkClient

with QuarkClient() as client:
    # 文件列表获取
    files = client.list_files(folder_id="0", page=1, size=50)

    # 创建文件夹
    result = client.files.create_folder("新文件夹", parent_id="0")

    # 删除文件（支持批量）
    result = client.files.delete_files(["file_id_1", "file_id_2"])

    # 重命名文件
    result = client.files.rename_file("file_id", "新名称")

    # 移动文件（支持批量）
    result = client.files.move_files(["file_id"], "target_folder_id")

    # 搜索文件
    results = client.search_files("关键词", size=20)
```

#### 上传下载操作
```python
# 上传文件
result = client.upload.upload_file("本地文件.txt", parent_folder_id="0")

# 获取下载链接  
download_info = client.download.get_download_url("file_id")
download_url = download_info['download_url']

# 获取存储信息
storage = client.get_storage_info()
total_gb = storage['data']['total'] / (1024**3)
used_gb = storage['data']['used'] / (1024**3)
```

#### 分享管理
```python
# 创建分享链接
share = client.shares.create_share(
    file_ids=["file_id_1", "file_id_2"],
    title="我的分享",
    expire_days=7,
    password="1234"
)

# 获取我的分享列表
my_shares = client.shares.get_my_shares(page=1, size=20)

# 转存他人分享的文件
result = client.shares.save_shared_files(
    share_url="https://pan.quark.cn/s/abc123",
    password="1234",
    target_folder_id="0"
)

# 解析分享链接
share_id, password = client.shares.parse_share_url(
    "https://pan.quark.cn/s/abc123 密码: 1234"
)
```

### 命令行使用

> **说明**: 以下所有命令都提供两种运行方式：
> - `python -m quark_client.cli <command>` （模块方式）
> - `python cli.py <command>` （脚本方式）  
> - `quarkpan <command>` （安装后，需要先运行 `pip install -e .`）

#### 交互式模式（推荐新用户）
```bash  
# 启动交互式界面
python -m quark_client.cli interactive
# 或
python cli.py interactive

# 交互式界面提供类似文件管理器的体验：
# - 使用方向键浏览文件和文件夹
# - 按 Enter 进入文件夹或执行操作
# - 按 Tab 查看可用操作
# - 按 q 退出当前界面
```

#### 认证管理
```bash
# API 二维码登录（推荐）
python -m quark_client.cli auth login

# 手动 Cookie 登录
python -m quark_client.cli auth login --method simple

# 查看登录状态
python -m quark_client.cli auth status

# 登出账户
python -m quark_client.cli auth logout
```

#### 基础文件操作  
```bash
# 查看当前目录文件列表
python -m quark_client.cli ls

# 查看指定文件夹（使用文件夹 ID）
python -m quark_client.cli ls --folder-id FOLDER_ID

# 进入文件夹（切换当前工作目录）
python -m quark_client.cli cd 文件夹名称

# 返回上级目录
python -m quark_client.cli cd ..

# 创建文件夹
python -m quark_client.cli mkdir "新文件夹"

# 重命名文件/文件夹  
python -m quark_client.cli rename FILE_ID "新名称"

# 删除文件/文件夹
python -m quark_client.cli rm FILE_ID

# 移动文件到指定文件夹
python -m quark_client.cli mv FILE_ID FOLDER_ID

# 查看文件详细信息
python -m quark_client.cli info FILE_ID
```

#### 搜索功能
```bash
# 全盘搜索文件
python -m quark_client.cli search "关键词"

# 限制搜索结果数量
python -m quark_client.cli search "关键词" --limit 10

# 搜索特定文件类型
python -m quark_client.cli search "报告" --file-type pdf
```

#### 上传下载
```bash
# 上传文件到当前文件夹
python -m quark_client.cli upload "本地文件.txt"

# 上传到指定文件夹
python -m quark_client.cli upload "本地文件.txt" --folder-id FOLDER_ID

# 获取文件下载链接
python -m quark_client.cli download get FILE_ID

# 下载文件到本地
python -m quark_client.cli download FILE_ID --output "本地路径.txt"
```

#### 分享管理
```bash
# 创建文件分享
python -m quark_client.cli share create FILE_ID --title "分享标题" --password 1234

# 查看我的分享列表
python -m quark_client.cli share list

# 转存他人分享
python -m quark_client.cli share save "https://pan.quark.cn/s/abc123" --password 1234
```

## 🔐 登录认证详解

### API 二维码登录（推荐）

```bash
python -m quark_client.cli auth login
# 或
python cli.py auth login
```

**工作流程：**
1. 程序调用夸克官方 API 获取登录 token
2. 生成二维码并保存到 `config/qr_code.png`  
3. 在终端显示 ASCII 二维码
4. 使用夸克 APP 扫码确认登录
5. 自动获取并保存登录 Cookie
6. 验证登录状态并保存用户信息

**优点：**
- 安全可靠，使用官方 API
- 无需手动操作浏览器
- 自动化程度高

### 手动 Cookie 登录

```bash  
python -m quark_client.cli auth login --method simple
# 或
python cli.py auth login --method simple
```

**使用场景：**
- API 登录失败时的备用方案
- 已有有效 Cookie 需要快速导入
- 批量部署或脚本化场景

**操作步骤：**
1. 程序提供详细的 Cookie 获取指引
2. 用户手动从浏览器复制 Cookie
3. 粘贴到程序提示界面
4. 程序验证并保存 Cookie

### 登录状态管理

```bash
# 检查当前登录状态
python -m quark_client.cli auth status

# 查看用户信息
python -m quark_client.cli auth info  

# 刷新登录状态
python -m quark_client.cli auth refresh

# 退出登录
python -m quark_client.cli auth logout
```

**Cookie 安全说明：**
- Cookie 文件存储在 `config/cookies.json`
- 支持基础加密存储（可选）
- 自动检测 Cookie 过期并提醒重新登录
- 支持多账户 Cookie 管理（计划功能）

## 📚 API 使用说明

### 文件管理

```python
# 获取文件列表
files = client.list_files(folder_id="0", page=1, size=50)

# 创建文件夹
result = client.create_folder("新文件夹", parent_id="0")

# 删除文件
result = client.delete_files(["file_id_1", "file_id_2"])

# 重命名文件
result = client.rename_file("file_id", "新名称")

# 搜索文件
results = client.search_files("关键词")

# 上传文件
result = client.upload_file("本地文件.txt", parent_folder_id="0")

# 获取下载链接
download_url = client.get_download_url("file_id")
```

### 分享管理

```python
# 创建分享链接
share = client.create_share(
    file_ids=["file_id_1", "file_id_2"],
    title="我的分享",
    expire_days=7,
    password="1234"
)

# 解析分享链接
share_id, password = client.parse_share_url(
    "https://pan.quark.cn/s/abc123 密码: 1234"
)

# 转存分享文件
result = client.save_shared_files(
    share_url="https://pan.quark.cn/s/abc123",
    target_folder_id="0"
)

# 获取我的分享列表
shares = client.get_my_shares()
```

## 📁 项目结构

```
QuarkPan/
├── quark_client/             # 主要代码包
│   ├── __init__.py           # 包入口和导出定义
│   ├── client.py             # 主客户端类
│   ├── config.py             # 配置管理
│   ├── exceptions.py         # 异常定义
│   ├── auth/                 # 认证模块
│   │   ├── __init__.py  
│   │   ├── login.py         # 统一登录管理
│   │   ├── api_login.py     # API 二维码登录
│   │   └── simple_login.py  # 手动 Cookie 登录
│   ├── core/                # 核心 API 客户端
│   │   ├── __init__.py  
│   │   └── api_client.py    # HTTP 客户端和 API 封装
│   ├── services/            # 业务服务层
│   │   ├── __init__.py  
│   │   ├── file_service.py        # 文件管理服务
│   │   ├── file_upload_service.py # 文件上传服务
│   │   ├── file_download_service.py # 文件下载服务
│   │   ├── share_service.py       # 分享管理服务
│   │   └── name_resolver.py       # 文件名解析器
│   ├── cli/                 # 命令行界面
│   │   ├── __init__.py  
│   │   ├── __main__.py      # 模块入口 (python -m quark_client.cli)
│   │   ├── main.py          # CLI 主程序
│   │   ├── interactive.py   # 交互式界面
│   │   ├── utils.py         # CLI 工具函数
│   │   └── commands/        # 命令模块
│   │       ├── __init__.py
│   │       ├── auth.py            # 认证命令
│   │       ├── basic_fileops.py   # 基础文件操作
│   │       ├── download.py        # 下载命令
│   │       ├── move_commands.py   # 移动操作命令
│   │       ├── search.py          # 搜索命令
│   │       └── share_commands.py  # 分享命令
│   └── utils/               # 工具模块
│       ├── __init__.py  
│       ├── logger.py        # 日志工具
│       └── qr_code.py       # 二维码工具
├── examples/                # 使用示例
│   ├── basic_usage.py       # 基础功能演示
│   ├── file_operations_demo.py # 文件操作演示
│   ├── file_browser_demo.py # 文件浏览器演示
│   └── share_save_demo.py   # 分享转存演示
├── config/                  # 配置文件目录
│   ├── cookies.json         # 登录 Cookie 存储
│   ├── login_result.json    # 登录结果缓存
│   ├── qr_code.png          # 二维码图片
│   └── user_info.json       # 用户信息缓存
├── cli.py                   # CLI 直接入口脚本
├── setup.py                 # 安装配置
├── requirements.txt         # 依赖列表
├── LICENSE                  # 开源协议
└── README.md                # 项目说明
```

## 🧪 运行示例

项目提供了多个示例文件，帮助你快速了解各种功能的使用方法：

### 基础使用示例
```bash  
# 演示基本功能：登录、获取文件列表、搜索、存储信息
python examples/basic_usage.py
```

**功能演示：**
- ✅ 自动登录认证
- 📁 获取根目录文件列表（显示前 5 个）
- 💾 查看存储容量信息  
- 🔍 全盘文件搜索演示
- 🔗 获取个人分享列表

### 文件操作演示  
```bash
# 完整的文件管理操作流程演示
python examples/file_operations_demo.py
```

**功能演示：**
- 📂 浏览和列出文件夹内容
- ➕ 创建测试文件夹和子文件夹
- ✏️ 重命名文件和文件夹
- 📦 移动文件到不同文件夹
- 🗑️ 删除文件和清理测试数据
- 🔍 多关键词搜索演示

### 文件浏览器演示
```bash
# 交互式文件浏览器体验
python examples/file_browser_demo.py  
```

**功能演示：**
- 🖥️ 类似系统文件管理器的界面
- ⬆️⬇️ 方向键导航文件列表
- 📁 双击进入文件夹
- 📋 查看文件详细信息
- 🔄 实时刷新文件列表

### 分享转存演示
```bash
# 分享链接创建和转存功能
python examples/share_save_demo.py
```

**功能演示：**
- 🔗 创建文件分享链接（带密码和有效期）
- 📋 管理个人分享列表  
- 💾 转存他人分享的资源
- 🔍 分享链接格式解析
- 📊 分享文件详情查看

### 组合使用示例

你也可以组合使用多个示例来体验完整工作流：

```bash
# 完整体验流程
python examples/basic_usage.py          # 1. 首先体验基础功能
python examples/file_operations_demo.py # 2. 然后体验文件操作
python examples/share_save_demo.py      # 3. 最后体验分享功能
```

**注意事项：**
- 🔑 首次运行需要完成登录认证
- ⚠️ 某些操作会创建测试数据，程序会自动清理
- 📱 需要手机安装夸克 APP 用于扫码登录
- 🌐 需要稳定的网络连接

## 📦 依赖说明

### 核心依赖
- **httpx** (>=0.24.0): 现代化 HTTP 客户端，支持异步请求
- **pydantic** (>=2.0.0): 数据验证和类型注解
- **typer** (>=0.9.0): 现代化命令行界面框架
- **rich** (>=13.0.0): 美化终端输出和交互

### 二维码支持  
- **qrcode** (>=7.4.0): 二维码生成和终端 ASCII 显示

### 用户体验
- **tqdm** (>=4.65.0): 进度条显示

### 开发和测试
- **pytest** (>=7.0.0): 测试框架
- **pytest-asyncio** (>=0.21.0): 异步测试支持

### 依赖安装
```bash
# 安装所有依赖
pip install -r requirements.txt

# 仅安装核心依赖（最小化安装）  
pip install httpx typer rich pydantic

# 开发环境安装（包含测试工具）
pip install -r requirements.txt pytest pytest-asyncio
```

### 系统要求
- **Python**: 3.8 或更高版本
- **操作系统**: Windows/macOS/Linux
- **内存**: 建议 512MB 以上可用内存
- **网络**: 需要稳定的互联网连接
- **终端**: 支持 UTF-8 编码的终端（推荐）

## ⚠️ 注意事项与免责声明

### 使用须知
1. **首次使用**: 需要通过扫码或手动方式完成登录认证
2. **配置文件**: 登录信息保存在 `config/cookies.json`，请妥善保管
3. **网络环境**: 建议在稳定的网络环境下使用，避免上传 / 下载中断
4. **账号安全**: 请使用官方夸克 APP 进行扫码登录，确保账号安全
5. **功能限制**: 部分功能受夸克网盘官方 API 限制，可能会有调用频率限制

### 技术限制
- **大文件处理**: 超大文件的上传下载可能需要较长时间
- **并发限制**: 为避免触发反爬限制，默认限制并发请求数量
- **API 变更**: 夸克网盘官方 API 可能随时变更，导致部分功能暂时不可用
- **登录有效期**: Cookie 有效期有限，过期后需要重新登录

### 免责声明
1. **仅供学习**: 本项目仅用于学习和个人使用，不得用于商业用途
2. **使用风险**: 用户使用本工具所产生的任何风险和责任由用户自行承担
3. **服务条款**: 使用时请遵守夸克网盘的官方服务条款和用户协议
4. **数据安全**: 请勿使用本工具处理敏感或重要数据，作者不承担数据损失责任
5. **法律合规**: 用户应确保使用行为符合当地法律法规要求

### 故障排除
- **登录失败**: 尝试清除 `config/cookies.json` 后重新登录
- **API 错误**: 检查网络连接，或等待片刻后重试
- **二维码不显示**: 检查终端是否支持图片显示，或查看 `config/qr_code.png`
- **上传 / 下载中断**: 检查文件路径和网络连接状态
- **命令行乱码**: 确保终端支持 UTF-8 编码

### 获取帮助
- **GitHub Issues**: [提交问题报告](https://github.com/lich0821/QuarkPan/issues)
- **示例代码**: 参考 `examples/` 目录下的示例文件
- **微信群**: 发送 `WCF` 进群交流
<center>

![公众号搜索【漩智】加入社区](QrCode.jpg)
</center>

### 贡献指南
欢迎提交 Issue 和 Pull Request！在贡献代码前，请：
1. 阅读项目的代码风格规范
2. 确保新功能有对应的测试用例
3. 更新相关文档和示例代码
4. 遵循 MIT 开源协议

## 📄 许可协议

本项目采用 [MIT License](LICENSE) 开源协议。

---
⭐ 如果这个项目对你有帮助，请给个 Star 支持一下！
