4.9 KiB
4.9 KiB
description
| description |
|---|
| 百度备份 - 打包当前项目所有文件并上传到百度网盘指定目录 |
上传项目到百度网盘
用户提供百度网盘目标目录路径(如 /2026/0517),将当前工作区所有文件打包为 zip 并上传。
百度网盘凭证
- AppID: 121939687
- AppKey: z3gemBZfg7KYj6U3eHNfIzTs7uYS9OMh
- SecretKey: ptCKj2DfxL0KtGR1pM08c9KO2t2UC7SR
- Token缓存文件: ~/.baidu_pan_token.json
步骤
-
获取用户输入的百度网盘目标目录,如
/2026/0517。如果用户未输入,使用当前日期生成默认路径/年份/月日。 -
打包当前工作区根目录的 所有文件(包括二进制、配置、文档等),仅排除
.git目录。用友好进度展示: // turbo
cd <工作区父目录> && zip -r /tmp/<项目名>.zip <项目文件夹名> -x "<项目文件夹名>/.git/*" 2>&1 | tail -1 && ls -lh /tmp/<项目名>.zip | awk '{print "✅ 打包完成:", $5}'
- 检查 Token 缓存:读取
~/.baidu_pan_token.json,检查是否有有效的 access_token(未过期)。- 如果文件存在且 token 未过期(当前时间 < expires_at):直接使用缓存的 access_token,跳过步骤 4-5 的授权流程。
- 如果文件存在但 token 已过期:使用 refresh_token 刷新: // turbo
curl -s -X POST "https://openapi.baidu.com/oauth/2.0/token" \
-d "grant_type=refresh_token&refresh_token=<cached_refresh_token>&client_id=z3gemBZfg7KYj6U3eHNfIzTs7uYS9OMh&client_secret=ptCKj2DfxL0KtGR1pM08c9KO2t2UC7SR"
刷新成功后更新缓存文件,跳过步骤 4-5。
- 如果文件不存在或刷新失败:执行步骤 4-5 进行设备授权。
- (仅首次或刷新失败时)获取百度网盘设备授权码: // turbo
curl -s -X POST "https://openapi.baidu.com/oauth/2.0/device/code" \
-d "response_type=device_code&client_id=z3gemBZfg7KYj6U3eHNfIzTs7uYS9OMh&scope=basic,netdisk"
告知用户授权地址和用户码,等待确认。
- (仅首次或刷新失败时)用户确认授权后,获取 access_token: // turbo
curl -s -X POST "https://openapi.baidu.com/oauth/2.0/token" \
-d "grant_type=device_token&code=<device_code>&client_id=z3gemBZfg7KYj6U3eHNfIzTs7uYS9OMh&client_secret=ptCKj2DfxL0KtGR1pM08c9KO2t2UC7SR"
获取成功后,将 access_token、refresh_token、expires_at(当前时间+expires_in秒)保存到 ~/.baidu_pan_token.json:
{"access_token":"xxx","refresh_token":"xxx","expires_at":1234567890}
- 创建远程目录(确保目标目录存在): // turbo
curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=<access_token>" \
-d "path=<目标目录>&size=0&isdir=1"
忽略目录已存在的错误(errno=-8),只要不是其他错误即可。
- 预创建文件(precreate),用分片方式处理大文件: // turbo
FILE_SIZE=$(stat -f%z /tmp/<项目名>.zip)
BLOCK_SIZE=$((4*1024*1024))
BLOCKS=$(( (FILE_SIZE + BLOCK_SIZE - 1) / BLOCK_SIZE ))
# 生成 block_list(每片用占位符 md5)
BLOCK_LIST=$(python3 -c "import json; print(json.dumps(['0'*32]*$BLOCKS))")
curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=<access_token>" \
-d "path=<目标目录>/<项目名>.zip&size=$FILE_SIZE&isdir=0&autoinit=1&block_list=$BLOCK_LIST"
从返回中提取 uploadid。
- 分片上传,使用一个 shell 脚本完成,脚本内显示友好的进度信息(百分比、已传/总量、预计剩余时间): // turbo
# 创建上传脚本 /tmp/baidu_upload.sh 并执行
# 脚本逻辑:
# - 按 4MB 分片 dd 切割文件
# - 逐片上传到 superfile2 接口
# - 每上传一片输出一行进度:[=====> ] 23/259 (8.9%) | 已传92MB/1034MB | 速度: 2.1MB/s
# - 收集每片返回的 md5
# - 全部完成后输出汇总
bash /tmp/baidu_upload.sh
- 合并创建文件(create): // turbo
curl -s "https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=<access_token>" \
-d "path=<目标目录>/<项目名>.zip&size=$FILE_SIZE&isdir=0&uploadid=<uploadid>&block_list=[<所有分片md5>]"
确认返回 errno: 0 表示成功。
- 清理临时文件: // turbo
rm -f /tmp/<项目名>.zip /tmp/baidu_upload.sh /tmp/chunk_*
- 输出最终结果(友好格式):
╔══════════════════════════════════════╗
║ 📦 百度网盘备份完成! ║
╠══════════════════════════════════════╣
║ 📁 路径: /2026/0517/GovAI.zip ║
║ 📊 大小: 1034 MB ║
║ ⏱️ 耗时: 5分32秒 ║
║ ✅ 状态: 上传成功 ║
╚══════════════════════════════════════╝