Skill: lilei0311/baidunetdisk (version 1.0.2)

# 百度网盘 Skill ## 简介 用于 OpenClaw 的百度网盘操作 Skill，支持完整的文件管理功能：文件列表查看、搜索、分享链接提取、转存、目录创建、文件增删改查等。 ## ⚠️ 安全警告 **重要提示**： - 本 Skill 需要您的百度网盘登录凭证（BDUSS 和 STOKEN），这些凭证具有完全访问您网盘账户的权限 - 请仅在受信任的环境中使用，不要在公共设备或共享环境中配置 - 建议创建专门的测试账号使用本 Skill，避免使用主账号 - 凭证存储在本地 `config.json` 文件中，请确保文件权限安全 - **删除操作不可恢复**，请谨慎使用 ## 功能特性 ### 查询操作（稳定） - 📁 **文件列表** - 查看网盘指定目录的文件列表 - 🔍 **文件搜索** - 在网盘中搜索文件 - 🔗 **分享提取** - 提取百度网盘分享链接的文件列表 ### 文件操作（稳定） - 💾 **一键转存** - 将分享的文件转存到自己的网盘 - 📂 **创建目录** - 在网盘中创建新目录 ### 文件管理（需要 bdstoken） - ✏️ **重命名** - 重命名文件或目录 - 🔄 **移动** - 移动文件到不同目录 - 🗑️ **删除** - 删除文件或目录（谨慎使用） ## 技术说明 ### API 实现 - **查询和转存功能**：使用百度网盘 REST API（`rest/2.0/xpan`） - **文件管理功能**：使用百度网盘 filemanager API（`/api/filemanager`） - **bdstoken**：文件管理操作需要额外的 bdstoken，Skill 会自动获取 ### 认证流程 1. 使用 BDUSS 和 STOKEN 进行身份认证 2. 自动获取 bdstoken 用于文件管理操作 3. 所有 API 调用使用 HTTPS 加密 ## 安装 ### 1. 安装依赖 ```bash pip install requests ``` ### 2. 配置 Skill 在 `config.json` 中配置百度网盘登录凭证： ```json { "bduss": "your_bduss_here", "stoken": "your_stoken_here", "default_save_path": "~/Downloads/BaiduNetdisk" } ``` **或者使用环境变量**（更安全）： ```bash export BAIDU_BDUSS="your_bduss_here" export BAIDU_STOKEN="your_stoken_here" ``` ### 3. 获取 BDUSS 和 STOKEN 1. 登录百度网盘网页版 (https://pan.baidu.com) 2. 按 F12 打开开发者工具 3. 切换到 Application/应用 标签 4. 找到 Cookies -> https://pan.baidu.com 5. 复制 `BDUSS` 和 `STOKEN` 的值 **注意**：BDUSS 和 STOKEN 是敏感信息，请妥善保管，不要泄露给他人。 ## 使用方法 ### 列出文件 ```bash # 列出根目录文件 python scripts/main.py list # 列出指定目录 python scripts/main.py list path=/我的资源 # 按文件名排序 python scripts/main.py list path=/我的资源 order=name ``` ### 搜索文件 ```bash # 搜索文件名包含"电影"的文件 python scripts/main.py search keyword=电影 # 在指定路径下搜索 python scripts/main.py search keyword=电影 path=/我的资源 ``` ### 提取分享链接 ```bash # 提取无密码的分享链接 python scripts/main.py extract share_url=https://pan.baidu.com/s/1xxxxx # 提取有密码的分享链接 python scripts/main.py extract share_url=https://pan.baidu.com/s/1xxxxx extract_code=abcd ``` ### 转存分享文件 ```bash # 转存到默认路径 python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx # 转存到指定路径 python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx save_path=/我的资源/电影 # 带提取码转存 python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx extract_code=abcd save_path=/我的资源 ``` ### 创建目录 ```bash # 创建新目录 python scripts/main.py mkdir path=/新目录名 ``` ### 文件管理 ```bash # 重命名文件/目录 python scripts/main.py rename path=/原文件名 new_name=新文件名 # 移动文件 python scripts/main.py move path=/原路径 dest=/目标路径 # 删除文件/目录（不可恢复，请谨慎使用） python scripts/main.py delete path=/要删除的路径 ``` ## 在 OpenClaw 中使用 ### 配置 Agent 使用该 Skill 在 Agent 配置中添加： ```json { "skills": ["baidunetdisk"] } ``` ### 使用示例 ```bash # 让 Agent 列出网盘文件 openclaw agent --message "查看我的百度网盘根目录有什么文件" # 搜索文件 openclaw agent --message "在我的百度网盘搜索所有PDF文件" # 转存分享链接 openclaw agent --message "把这个百度网盘分享链接转存到我的网盘: https://pan.baidu.com/s/1xxxxx 提取码: abcd" # 创建目录 openclaw agent --message "在百度网盘创建一个名为'工作文档'的目录" # 重命名文件 openclaw agent --message "把百度网盘里的'旧文件名.txt'重命名为'新文件名.txt'" # 删除文件（谨慎） openclaw agent --message "删除百度网盘里的'/测试/临时文件.txt'" ``` ## 注意事项 1. **登录状态**：BDUSS 和 STOKEN 有过期时间，如遇到权限错误请重新获取 2. **频率限制**：百度网盘 API 有访问频率限制，请合理使用 3. **隐私安全**：不要在公共场合或共享环境中使用，避免凭证泄露 4. **bdstoken**：文件管理操作（重命名/移动/删除）需要 bdstoken，Skill 会自动获取 5. **数据安全**：删除操作不可恢复，请谨慎使用 ## 故障排除 ### 错误码 -6 表示登录凭证无效或过期，请重新获取 BDUSS 和 STOKEN ### 错误码 2 参数错误或权限不足，请检查： - 文件路径是否正确 - 是否有操作该文件的权限 - bdstoken 是否成功获取 ### 错误码 9019 API 调用受限，请检查网络连接或稍后再试 ### 无法获取 bdstoken - 检查 BDUSS 和 STOKEN 是否有效 - 尝试重新登录百度网盘获取新的凭证 - 检查网络连接是否正常 ## 版本信息 - **版本**: 1.0.2 - **作者**: MaxStorm Team - **许可证**: MIT - **源码**: https://github.com/maxstorm/baidunetdisk-skill

path: README.md
content: # 百度网盘 Skill

用于 OpenClaw 的百度网盘操作 Skill，支持文件列表查看、搜索、分享链接提取和转存等功能。

## 功能特性

- 📁 **文件列表** - 查看网盘指定目录的文件列表
- 🔍 **文件搜索** - 在网盘中搜索文件
- 🔗 **分享提取** - 提取百度网盘分享链接的文件列表
- 💾 **一键转存** - 将分享的文件转存到自己的网盘
- 📊 **文件信息** - 显示文件名、大小、修改时间等详细信息

## 安装

### 1. 安装依赖

```bash
pip install requests tqdm
```

### 2. 配置 Skill

在 `config.json` 中配置百度网盘登录凭证：

```json
{
  "bduss": "your_bduss_here",
  "stoken": "your_stoken_here",
  "default_save_path": "~/Downloads/BaiduNetdisk"
}
```

### 3. 获取 BDUSS 和 STOKEN

1. 登录百度网盘网页版 (https://pan.baidu.com)
2. 按 F12 打开开发者工具
3. 切换到 Application/应用 标签
4. 找到 Cookies -> https://pan.baidu.com
5. 复制 `BDUSS` 和 `STOKEN` 的值

**注意**：BDUSS 和 STOKEN 是敏感信息，请妥善保管，不要泄露给他人。

## 使用方法

### 列出文件

```bash
# 列出根目录文件
python scripts/main.py list

# 列出指定目录
python scripts/main.py list path=/我的资源

# 按文件名排序
python scripts/main.py list path=/我的资源 order=name
```

### 搜索文件

```bash
# 搜索文件名包含"电影"的文件
python scripts/main.py search keyword=电影

# 在指定路径下搜索
python scripts/main.py search keyword=电影 path=/我的资源
```

### 提取分享链接

```bash
# 提取无密码的分享链接
python scripts/main.py extract share_url=https://pan.baidu.com/s/1xxxxx

# 提取有密码的分享链接
python scripts/main.py extract share_url=https://pan.baidu.com/s/1xxxxx extract_code=abcd
```

### 转存分享文件

```bash
# 转存到默认路径
python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx

# 转存到指定路径
python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx save_path=/我的资源/电影

# 带提取码转存
python scripts/main.py transfer share_url=https://pan.baidu.com/s/1xxxxx extract_code=abcd save_path=/我的资源
```

## 在 OpenClaw 中使用

### 配置 Agent 使用该 Skill

在 Agent 配置中添加：

```json
{
  "skills": ["baidunetdisk"]
}
```

### 使用示例

```bash
# 让 Agent 列出网盘文件
openclaw agent --message "查看我的百度网盘根目录有什么文件"

# 搜索文件
openclaw agent --message "在我的百度网盘搜索所有PDF文件"

# 转存分享链接
openclaw agent --message "把这个百度网盘分享链接转存到我的网盘: https://pan.baidu.com/s/1xxxxx 提取码: abcd"
```

## API 说明

### BaiduNetdiskAPI 类

#### list_files(path, order)
- **path**: 网盘路径，默认为根目录 "/"
- **order**: 排序方式，可选 "time"(时间)、"name"(名称)、"size"(大小)
- **返回**: 文件列表，包含文件名、路径、大小、是否为目录等信息

#### search_files(keyword, path)
- **keyword**: 搜索关键词
- **path**: 搜索路径，默认为根目录
- **返回**: 匹配的文件列表

#### extract_share(share_url, extract_code)
- **share_url**: 分享链接 URL
- **extract_code**: 提取码，可选
- **返回**: 分享中的文件列表、shareid、uk 等信息

#### transfer_share(share_url, extract_code, save_path)
- **share_url**: 分享链接 URL
- **extract_code**: 提取码，可选
- **save_path**: 保存到网盘的路径，默认为 "/我的资源"
- **返回**: 转存结果

## 注意事项

1. **登录状态**：BDUSS 和 STOKEN 有过期时间，如遇到权限错误请重新获取
2. **频率限制**：百度网盘 API 有访问频率限制，请合理使用
3. **文件大小**：转存大文件可能需要较长时间，请耐心等待
4. **隐私安全**：不要在公共场合或共享环境中使用，避免凭证泄露

## 常见问题

### Q: 提示 "缺少 BDUSS 或 STOKEN 配置"
A: 请确保 config.json 文件中正确配置了 bduss 和 stoken，或设置了环境变量 BAIDU_BDUSS 和 BAIDU_STOKEN

### Q: 提示 "API错误: -6"
A: 通常是登录凭证过期或无效，请重新获取 BDUSS 和 STOKEN

### Q: 转存失败
A: 可能是分享链接失效、提取码错误或网盘空间不足，请检查分享链接和网盘空间

## 技术说明

- 基于百度网盘开放平台 API (xpan)
- 使用 BDUSS + STOKEN 方式进行身份验证
- 支持 HTTP/HTTPS 代理（通过环境变量 HTTP_PROXY/HTTPS_PROXY 设置）

## 更新日志

### v1.0.0 (2025-02-16)
- 初始版本发布
- 支持文件列表、搜索、分享提取、转存功能

## License

MIT License

## 作者

MaxStorm Team


path: config.json
content: default_save_path: ~/Downloads/BaiduNetdisk

path: scripts/main.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
百度网盘操作 Skill
支持功能：文件列表、上传、下载、分享链接提取、转存、搜索
"""

import os
import sys
import json
import re
import requests
from urllib.parse import quote, unquote
from pathlib import Path

class BaiduNetdiskAPI:
    """百度网盘 API 封装"""
    
    BASE_URL = "https://pan.baidu.com/rest/2.0/xpan"
    
    def __init__(self, bduss: str, stoken: str):
        self.bduss = bduss
        self.stoken = stoken
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            'Accept': 'application/json, text/plain, */*',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Referer': 'https://pan.baidu.com/disk/home',
            'Connection': 'keep-alive',
            'Sec-Fetch-Dest': 'empty',
            'Sec-Fetch-Mode': 'cors',
            'Sec-Fetch-Site': 'same-origin'
        })
        
    def _get_cookies(self):
        """获取认证 cookies"""
        return {
            'BDUSS': self.bduss,
            'STOKEN': self.stoken,
            'BAIDUID': 'undefined',
            'BAIDUID_BFESS': 'undefined'
        }
    
    def list_files(self, path: str = "/", order: str = "time"):
        """列出指定目录的文件"""
        url = f"{self.BASE_URL}/file"
        params = {
            'method': 'list',
            'dir': path,
            'order': order,
            'desc': 1,
            'showempty': 0,
            'web': 1,
            'page': 1,
            'num': 1000
        }
        
        try:
            resp = self.session.get(url, params=params, cookies=self._get_cookies())
            data = resp.json()
            
            if data.get('errno') == 0:
                files = data.get('list', [])
                result = []
                for f in files:
                    result.append({
                        'name': f.get('server_filename'),
                        'path': f.get('path'),
                        'size': self._format_size(f.get('size', 0)),
                        'is_dir': f.get('isdir') == 1,
                        'modify_time': f.get('server_mtime'),
                        'fs_id': f.get('fs_id')
                    })
                return {'success': True, 'files': result, 'count': len(result)}
            else:
                return {'success': False, 'error': f"API错误: {data.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def search_files(self, keyword: str, path: str = "/"):
        """搜索文件"""
        url = f"{self.BASE_URL}/file"
        params = {
            'method': 'search',
            'key': keyword,
            'dir': path,
            'web': 1,
            'page': 1,
            'num': 1000
        }
        
        try:
            resp = self.session.get(url, params=params, cookies=self._get_cookies())
            data = resp.json()
            
            if data.get('errno') == 0:
                files = data.get('list', [])
                result = []
                for f in files:
                    result.append({
                        'name': f.get('server_filename'),
                        'path': f.get('path'),
                        'size': self._format_size(f.get('size', 0)),
                        'is_dir': f.get('isdir') == 1
                    })
                return {'success': True, 'files': result, 'count': len(result)}
            else:
                return {'success': False, 'error': f"API错误: {data.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def extract_share(self, share_url: str, extract_code: str = ""):
        """提取分享链接的文件列表"""
        # 提取 shorturl
        match = re.search(r'/s/([\w-]+)', share_url)
        if not match:
            return {'success': False, 'error': '无效的分享链接'}
        
        shorturl = match.group(1)
        
        # 验证提取码（如果有）
        if extract_code:
            verify_url = "https://pan.baidu.com/share/verify"
            data = {
                'surl': shorturl,
                'pwd': extract_code
            }
            try:
                resp = self.session.post(verify_url, data=data)
                verify_data = resp.json()
                if verify_data.get('errno') != 0:
                    return {'success': False, 'error': '提取码错误'}
            except Exception as e:
                return {'success': False, 'error': f'验证失败: {str(e)}'}
        
        # 获取分享文件列表
        url = f"{self.BASE_URL}/share/list"
        params = {
            'shorturl': shorturl,
            'page': 1,
            'num': 1000,
            'root': 1
        }
        
        try:
            resp = self.session.get(url, params=params, cookies=self._get_cookies())
            data = resp.json()
            
            if data.get('errno') == 0:
                files = data.get('list', [])
                result = []
                for f in files:
                    result.append({
                        'name': f.get('server_filename'),
                        'path': f.get('path'),
                        'size': self._format_size(f.get('size', 0)),
                        'is_dir': f.get('isdir') == 1,
                        'fs_id': f.get('fs_id')
                    })
                return {
                    'success': True, 
                    'files': result, 
                    'count': len(result),
                    'shareid': data.get('shareid'),
                    'uk': data.get('uk')
                }
            else:
                return {'success': False, 'error': f"API错误: {data.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def transfer_share(self, share_url: str, extract_code: str = "", save_path: str = "/我的资源"):
        """转存分享文件到自己的网盘"""
        # 先提取分享信息
        extract_result = self.extract_share(share_url, extract_code)
        if not extract_result['success']:
            return extract_result
        
        shareid = extract_result.get('shareid')
        uk = extract_result.get('uk')
        files = extract_result.get('files', [])
        
        if not files:
            return {'success': False, 'error': '分享中没有文件'}
        
        # 获取 fsid 列表
        fsids = [f['fs_id'] for f in files if 'fs_id' in f]
        
        # 执行转存
        url = f"{self.BASE_URL}/share/transfer"
        params = {
            'shareid': shareid,
            'from': uk,
            'sekey': '',
            'ondup': 'newcopy'
        }
        data = {
            'fsidlist': json.dumps(fsids),
            'path': save_path
        }
        
        try:
            resp = self.session.post(url, params=params, data=data, cookies=self._get_cookies())
            result = resp.json()
            
            if result.get('errno') == 0:
                return {
                    'success': True,
                    'message': f'成功转存 {len(fsids)} 个文件到 {save_path}'
                }
            else:
                return {'success': False, 'error': f"转存失败: {result.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def create_dir(self, path: str):
        """创建目录"""
        url = "https://pan.baidu.com/api/create"
        
        # 获取父目录
        parent = '/'.join(path.rstrip('/').split('/')[:-1]) or '/'
        name = path.split('/')[-1]
        
        data = {
            'path': path,
            'isdir': '1',
            'rtype': '1',
            'block_list': '[]'
        }
        
        try:
            resp = self.session.post(url, data=data, cookies=self._get_cookies())
            data = resp.json()
            
            if data.get('errno') == 0:
                return {'success': True, 'message': f'目录创建成功: {path}'}
            else:
                return {'success': False, 'error': f"创建失败: {data.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def _get_bdstoken(self):
        """获取 bdstoken"""
        try:
            url = "https://pan.baidu.com/api/gettemplatevariable"
            params = {
                'clienttype': 0,
                'app_id': 250528,
                'web': 1,
                'fields': '["bdstoken"]'
            }
            resp = self.session.get(url, params=params, cookies=self._get_cookies())
            data = resp.json()
            if data.get('errno') == 0:
                return data.get('result', {}).get('bdstoken')
            return None
        except:
            return None
    
    def delete_file(self, path: str):
        """删除文件或目录
        
        使用 filemanager API，需要 bdstoken
        """
        try:
            # 获取 bdstoken
            bdstoken = self._get_bdstoken()
            if not bdstoken:
                return {'success': False, 'error': '无法获取 bdstoken，请检查登录状态'}
            
            url = "https://pan.baidu.com/api/filemanager"
            params = {
                'opera': 'delete',
                'async': '2',
                'onnest': 'fail',
                'channel': 'chunlei',
                'web': 1,
                'app_id': 250528,
                'bdstoken': bdstoken,
                'clienttype': 0
            }
            
            # filelist 是 JSON 数组格式
            data = {
                'filelist': json.dumps([path])
            }
            
            resp = self.session.post(url, params=params, data=data, cookies=self._get_cookies())
            result = resp.json()
            
            if result.get('errno') == 0:
                return {'success': True, 'message': f'删除成功: {path}'}
            else:
                return {'success': False, 'error': f"删除失败，错误码: {result.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def rename_file(self, path: str, new_name: str):
        """重命名文件或目录
        
        使用 filemanager API，需要 bdstoken
        """
        try:
            # 获取 bdstoken
            bdstoken = self._get_bdstoken()
            if not bdstoken:
                return {'success': False, 'error': '无法获取 bdstoken，请检查登录状态'}
            
            # 获取父目录
            parent = '/'.join(path.rstrip('/').split('/')[:-1]) or '/'
            new_path = f"{parent}/{new_name}" if parent != '/' else f"/{new_name}"
            
            url = "https://pan.baidu.com/api/filemanager"
            params = {
                'opera': 'rename',
                'async': '2',
                'onnest': 'fail',
                'channel': 'chunlei',
                'web': 1,
                'app_id': 250528,
                'bdstoken': bdstoken,
                'clienttype': 0
            }
            
            # newname 是 JSON 对象格式: {path: newname}
            data = {
                'newname': json.dumps({path: new_name})
            }
            
            resp = self.session.post(url, params=params, data=data, cookies=self._get_cookies())
            result = resp.json()
            
            if result.get('errno') == 0:
                return {'success': True, 'message': f'重命名成功: {path} -> {new_path}'}
            else:
                return {'success': False, 'error': f"重命名失败，错误码: {result.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def move_file(self, path: str, dest: str):
        """移动文件或目录
        
        使用 filemanager API，需要 bdstoken
        """
        try:
            # 获取 bdstoken
            bdstoken = self._get_bdstoken()
            if not bdstoken:
                return {'success': False, 'error': '无法获取 bdstoken，请检查登录状态'}
            
            url = "https://pan.baidu.com/api/filemanager"
            params = {
                'opera': 'move',
                'async': '2',
                'onnest': 'fail',
                'channel': 'chunlei',
                'web': 1,
                'app_id': 250528,
                'bdstoken': bdstoken,
                'clienttype': 0
            }
            
            # filelist 是 JSON 数组格式，dest 是目标目录
            data = {
                'filelist': json.dumps([path]),
                'dest': dest
            }
            
            resp = self.session.post(url, params=params, data=data, cookies=self._get_cookies())
            result = resp.json()
            
            if result.get('errno') == 0:
                return {'success': True, 'message': f'移动成功: {path} -> {dest}'}
            else:
                return {'success': False, 'error': f"移动失败，错误码: {result.get('errno')}"}
                
        except Exception as e:
            return {'success': False, 'error': str(e)}
    
    def _format_size(self, size: int) -> str:
        """格式化文件大小"""
        for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
            if size < 1024:
                return f"{size:.2f} {unit}"
            size /= 1024
        return f"{size:.2f} PB"


def main():
    """主入口函数"""
    if len(sys.argv) < 2:
        print(json.dumps({
            'success': False,
            'error': '缺少操作参数'
        }))
        sys.exit(1)
    
    action = sys.argv[1]
    
    # 读取配置
    config_path = os.path.join(os.path.dirname(__file__), '..', 'config.json')
    try:
        with open(config_path, 'r') as f:
            config = json.load(f)
    except:
        config = {}
    
    bduss = config.get('bduss', os.getenv('BAIDU_BDUSS', ''))
    stoken = config.get('stoken', os.getenv('BAIDU_STOKEN', ''))
    
    if not bduss or not stoken:
        print(json.dumps({
            'success': False,
            'error': '缺少 BDUSS 或 STOKEN 配置'
        }))
        sys.exit(1)
    
    api = BaiduNetdiskAPI(bduss, stoken)
    
    # 解析参数
    params = {}
    for arg in sys.argv[2:]:
        if '=' in arg:
            key, value = arg.split('=', 1)
            params[key] = value
    
    # 执行操作
    if action == 'list':
        result = api.list_files(
            path=params.get('path', '/'),
            order=params.get('order', 'time')
        )
    elif action == 'search':
        result = api.search_files(
            keyword=params.get('keyword', ''),
            path=params.get('path', '/')
        )
    elif action == 'extract':
        result = api.extract_share(
            share_url=params.get('share_url', ''),
            extract_code=params.get('extract_code', '')
        )
    elif action == 'transfer':
        result = api.transfer_share(
            share_url=params.get('share_url', ''),
            extract_code=params.get('extract_code', ''),
            save_path=params.get('save_path', '/我的资源')
        )
    elif action == 'mkdir':
        result = api.create_dir(
            path=params.get('path', '/')
        )
    elif action == 'delete':
        result = api.delete_file(
            path=params.get('path', '')
        )
    elif action == 'rename':
        result = api.rename_file(
            path=params.get('path', ''),
            new_name=params.get('new_name', '')
        )
    elif action == 'move':
        result = api.move_file(
            path=params.get('path', ''),
            dest=params.get('dest', '')
        )
    else:
        result = {'success': False, 'error': f'未知操作: {action}'}
    
    print(json.dumps(result, ensure_ascii=False, indent=2))


if __name__ == '__main__':
    main()


path: skill.json
content: {
  "name": "baidunetdisk",
  "version": "1.0.2",
  "description": "百度网盘操作Skill - 支持完整的文件管理功能：列表、搜索、分享提取、转存、创建目录、重命名、移动、删除",
  "author": "MaxStorm Team",
  "license": "MIT",
  "homepage": "https://github.com/maxstorm/baidunetdisk-skill",
  "keywords": ["baidu", "netdisk", "cloud", "storage", "pan", "百度网盘"],
  "trigger": {
    "patterns": [
      "百度网盘",
      "网盘",
      "baidu netdisk",
      "列出网盘",
      "搜索网盘",
      "网盘分享",
      "转存",
      "创建目录"
    ]
  },
  "tools": ["exec"],
  "entry": "scripts/main.py",
  "config": {
    "schema": {
      "bduss": {
        "type": "string",
        "description": "百度网盘登录凭证BDUSS",
        "required": true,
        "secret": true
      },
      "stoken": {
        "type": "string",
        "description": "百度网盘登录凭证STOKEN",
        "required": true,
        "secret": true
      },
      "default_save_path": {
        "type": "string",
        "description": "默认下载保存路径",
        "default": "~/Downloads/BaiduNetdisk"
      }
    }
  },
  "dependencies": {
    "python": ">=3.8",
    "packages": ["requests"]
  },
  "platforms": ["darwin", "linux"]
}


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (HIGH)