Skill: libin771018-sketch/baidupan (version 1.0.0)

--- name: baidupan description: 百度网盘自动化工具，支持上传、下载、列表、同步等操作。 homepage: https://github.com/houtianze/bypy metadata: { "openclaw": { "emoji": "☁️", "requires": { "bins": ["bypy"] }, "install": [ { "id": "pip", "kind": "pip", "package": "bypy", "label": "Install bypy (pip)", }, ], }, } --- # BaiduPan（百度网盘） 百度网盘自动化工具，基于 `bypy` 实现。支持文件上传、下载、列表查看、同步等操作。 ## 前置要求 首次使用需要**授权登录**： ```bash # 运行授权命令 {baseDir}/scripts/auth.sh # 按提示操作： # 1. 复制显示的链接到浏览器打开 # 2. 登录百度账号并授权 # 3. 复制授权码 # 4. 粘贴回终端 ``` 授权一次，长期有效（直到百度token过期）。 --- ## 核心功能 | 功能 | 命令 | 说明 | |:---|:---|:---| | 查看网盘文件 | `list.sh` | 列出指定目录内容 | | 下载文件 | `download.sh` | 从网盘下载到本地 | | 上传文件 | `upload.sh` | 从本地上传到网盘 | | 同步目录 | `sync.sh` | 双向或单向同步 | | 查看配额 | `quota.sh` | 查看网盘空间使用情况 | --- ## 功能详解 ### 1. 查看网盘文件 (list.sh) ```bash # 列出根目录 {baseDir}/scripts/list.sh # 列出指定目录 {baseDir}/scripts/list.sh /我的视频/项目 # 显示文件详情（含大小、修改时间） {baseDir}/scripts/list.sh /我的视频 --detail ``` ### 2. 下载文件 (download.sh) ```bash # 下载单个文件到当前目录 {baseDir}/scripts/download.sh /我的视频/长城素材/video1.mp4 # 下载到指定目录 {baseDir}/scripts/download.sh /我的视频/长城素材/video1.mp4 --out ~/Downloads/ # 下载整个目录 {baseDir}/scripts/download.sh /我的视频/长城素材/ --out ~/Downloads/长城素材/ # 覆盖已存在文件 {baseDir}/scripts/download.sh /我的视频/video.mp4 --out ~/Downloads/ --force ``` ### 3. 上传文件 (upload.sh) ```bash # 上传单个文件到网盘根目录 {baseDir}/scripts/upload.sh ~/Downloads/video.mp4 # 上传到指定目录 {baseDir}/scripts/upload.sh ~/Downloads/video.mp4 --remote /我的视频/项目/ # 上传整个目录 {baseDir}/scripts/upload.sh ~/Downloads/长城素材/ --remote /我的视频/ # 覆盖网盘上已存在文件 {baseDir}/scripts/upload.sh ~/Downloads/video.mp4 --remote /我的视频/ --force ``` ### 4. 同步目录 (sync.sh) ```bash # 从网盘同步到本地（网盘为主） {baseDir}/scripts/sync.sh down /我的视频/项目 ~/本地备份/项目/ # 从本地同步到网盘（本地为主） {baseDir}/scripts/sync.sh up ~/本地项目/ /我的视频/项目/ # 双向同步（谨慎使用） {baseDir}/scripts/sync.sh both ~/本地项目/ /我的视频/项目/ ``` ### 5. 查看配额 (quota.sh) ```bash {baseDir}/scripts/quota.sh ``` 输出示例： ``` 网盘配额：2.0 TB 已使用：1.2 TB (60%) 剩余可用：800 GB ``` --- ## 视频项目工作流 ### 场景：从网盘下载素材进行剪辑 ```bash # 1. 查看网盘素材目录 {baseDir}/scripts/list.sh /视频素材/长城春晚/ # 2. 下载所有素材到本地 {baseDir}/scripts/download.sh /视频素材/长城春晚/ --out ~/龙虾项目/长城赞助春晚/raw/ # 3. 剪辑完成后，上传成品回网盘 {baseDir}/scripts/upload.sh ~/龙虾项目/长城赞助春晚/output/final.mp4 --remote /视频成品/ ``` --- ## 故障排查 | 问题 | 可能原因 | 解决方法 | |:---|:---|:---| | `Not authorized` | 未授权或授权过期 | 运行 `auth.sh` 重新授权 | | `Network error` | 网络问题 | 检查网络，稍后重试 | | `File not found` | 路径错误 | 检查网盘路径，区分大小写 | | `Quota exceeded` | 网盘空间不足 | 清理网盘或购买会员 | | `Rate limited` | 请求过于频繁 | 等待几分钟后重试 | --- ## 注意事项 1. **授权安全**：授权信息保存在本地 `~/.bypy/` 目录，不要分享给他人 2. **大文件传输**：上传/下载大文件可能需要较长时间，请保持网络稳定 3. **路径格式**：网盘路径以 `/` 开头，如 `/我的视频/项目/` 4. **免费额度**：百度网盘对非会员有下载限速，大文件建议开通会员或使用百度云同步盘 --- ## 相关链接 - bypy 项目：https://github.com/houtianze/bypy - 百度网盘开放平台：https://pan.baidu.com/union

path: scripts/auth.sh
content: #!/usr/bin/env bash
set -euo pipefail

echo "=========================================="
echo "  百度网盘授权登录"
echo "=========================================="
echo ""
echo "即将打开浏览器进行授权..."
echo ""

# 运行bypy授权
bypy info

echo ""
echo "=========================================="
echo "  授权流程："
echo "=========================================="
echo "1. 如果浏览器没有自动打开，请复制上方链接手动打开"
echo "2. 登录您的百度账号"
echo "3. 点击'授权'按钮"
echo "4. 复制授权码"
echo "5. 回到终端粘贴授权码并按回车"
echo ""
echo "授权成功后即可使用网盘功能！"
echo ""


path: scripts/download.sh
content: #!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  download.sh <网盘路径> [--out 本地目录] [--force]

Examples:
  download.sh /我的视频/video.mp4
  download.sh /我的视频/video.mp4 --out ~/Downloads/
  download.sh /我的视频/素材/ --out ~/项目/ --force
EOF
  exit 2
}

if [[ "${1:-}" == "" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
fi

remote_path="$1"
local_dir="."
force_flag=""

# 解析参数
shift
while [[ $# -gt 0 ]]; do
  case "$1" in
    --out|-o)
      local_dir="${2:-.}"
      shift 2
      ;;
    --force|-f)
      force_flag="--force"
      shift
      ;;
    *)
      echo "Unknown arg: $1" >&2
      usage
      ;;
  esac
done

# 确保本地目录存在
mkdir -p "$local_dir"

echo "=========================================="
echo "  百度网盘下载"
echo "=========================================="
echo "网盘路径：$remote_path"
echo "本地目录：$local_dir"
echo ""

# 判断是文件还是目录
if [[ "$remote_path" == */ ]]; then
  # 目录下载
  echo "正在下载目录..."
  bypy download "$remote_path" "$local_dir" $force_flag
else
  # 单个文件下载
  echo "正在下载文件..."
  filename=$(basename "$remote_path")
  bypy downfile "$remote_path" "$local_dir/$filename"
fi

echo ""
echo "✓ 下载完成！"
echo "保存位置：$local_dir"
echo ""


path: scripts/list.sh
content: #!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  list.sh [网盘路径] [--detail]

Examples:
  list.sh                  # 列出根目录
  list.sh /我的视频        # 列出指定目录
  list.sh /我的视频 --detail  # 显示详细信息
EOF
  exit 2
}

path="${1:-/}"
detail=false

# 解析参数
if [[ "$#" -gt 1 ]]; then
  for arg in "${@:2}"; do
    case "$arg" in
      --detail|-d)
        detail=true
        ;;
      -h|--help)
        usage
        ;;
    esac
  done
fi

echo "=========================================="
echo "  百度网盘文件列表"
echo "=========================================="
echo "路径：$path"
echo ""

if [[ "$detail" == true ]]; then
  bypy list "$path" -v
else
  bypy list "$path"
fi

echo ""


path: scripts/quota.sh
content: #!/usr/bin/env bash
set -euo pipefail

echo "=========================================="
echo "  百度网盘配额信息"
echo "=========================================="
echo ""

bypy quota

echo ""


path: scripts/sync.sh
content: #!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  sync.sh <direction> <源路径> <目标路径>

Direction:
  down  - 从网盘同步到本地（网盘为主）
  up    - 从本地同步到网盘（本地为主）
  both  - 双向同步（谨慎使用）

Examples:
  sync.sh down /我的视频/项目 ~/本地备份/
  sync.sh up ~/本地项目/ /我的视频/项目/
EOF
  exit 2
}

if [[ $# -lt 3 ]]; then
  usage
fi

direction="$1"
source_path="$2"
target_path="$3"

echo "=========================================="
echo "  百度网盘同步"
echo "=========================================="

case "$direction" in
  down)
    echo "同步方向：网盘 → 本地"
    echo "网盘路径：$source_path"
    echo "本地路径：$target_path"
    echo ""
    mkdir -p "$target_path"
    bypy syncdown "$source_path" "$target_path"
    ;;
  up)
    echo "同步方向：本地 → 网盘"
    echo "本地路径：$source_path"
    echo "网盘路径：$target_path"
    echo ""
    if [[ ! -e "$source_path" ]]; then
      echo "错误：本地路径不存在：$source_path" >&2
      exit 1
    fi
    bypy syncup "$source_path" "$target_path"
    ;;
  both)
    echo "同步方向：双向同步"
    echo "本地路径：$source_path"
    echo "网盘路径：$target_path"
    echo ""
    echo "⚠️  警告：双向同步可能导致文件冲突！"
    read -p "确认继续？(y/N) " confirm
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
      echo "已取消"
      exit 0
    fi
    bypy sync "$source_path" "$target_path"
    ;;
  *)
    echo "错误：未知的同步方向：$direction" >&2
    usage
    ;;
esac

echo ""
echo "✓ 同步完成！"
echo ""


path: scripts/upload.sh
content: #!/usr/bin/env bash
set -euo pipefail

usage() {
  cat >&2 <<'EOF'
Usage:
  upload.sh <本地路径> [--remote 网盘目录] [--force]

Examples:
  upload.sh ~/Downloads/video.mp4
  upload.sh ~/Downloads/video.mp4 --remote /我的视频/
  upload.sh ~/项目/素材/ --remote /我的视频/ --force
EOF
  exit 2
}

if [[ "${1:-}" == "" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
fi

local_path="$1"
remote_dir="/"
force_flag=""

# 解析参数
shift
while [[ $# -gt 0 ]]; do
  case "$1" in
    --remote|-r)
      remote_dir="${2:-/}"
      shift 2
      ;;
    --force|-f)
      force_flag="--force"
      shift
      ;;
    *)
      echo "Unknown arg: $1" >&2
      usage
      ;;
  esac
done

# 检查本地路径是否存在
if [[ ! -e "$local_path" ]]; then
  echo "错误：本地路径不存在：$local_path" >&2
  exit 1
fi

echo "=========================================="
echo "  百度网盘上传"
echo "=========================================="
echo "本地路径：$local_path"
echo "网盘目录：$remote_dir"
echo ""

# 判断是文件还是目录
if [[ -d "$local_path" ]]; then
  # 目录上传
  echo "正在上传目录..."
  bypy upload "$local_path" "$remote_dir" $force_flag
else
  # 单个文件上传
  echo "正在上传文件..."
  bypy upload "$local_path" "$remote_dir" $force_flag
fi

echo ""
echo "✓ 上传完成！"
echo "网盘位置：$remote_dir/$(basename "$local_path")"
echo ""


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