baiduwangpan-cli 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,471 +1,504 @@
1
- <div align="center">
2
-
3
- # baiduwangpan-cli
4
-
5
- **百度网盘 CLI — 全盘读写 · 免下载读取 · 群聊文件浏览/下载**
6
-
7
- 专为 AI Agent 设计的百度网盘命令行工具
8
-
9
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
- [![Node.js](https://img.shields.io/badge/node-%3E%3D14-brightgreen)](https://nodejs.org)
11
- [![npm version](https://img.shields.io/npm/v/baiduwangpan-cli)](https://www.npmjs.com/package/baiduwangpan-cli)
12
- [![npm downloads](https://img.shields.io/npm/dm/baiduwangpan-cli)](https://www.npmjs.com/package/baiduwangpan-cli)
13
- [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-blue)]()
14
- [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
15
-
16
- </div>
17
-
18
- ---
19
-
20
- ## ✨ 特性
21
-
22
- - **🗂️ 全盘访问** — 不受 `/apps/` 目录限制,读写网盘任意路径
23
- - **📄 免下载读取** — 通过 HTTP Range 直接读取文件内容到 stdout,无需下载整个文件
24
- - **👥 群聊文件浏览 + 下载** — 逆向 mbox API,列出群组、浏览群内分享库、搜索群文件,并支持**直接下载群文件到本地**(免转存)
25
- - **🤖 Agent 友好** — 所有命令支持 `--json` 结构化输出,零解析成本
26
- - **🔧 双模式** — 既是 CLI 工具,也可作为 Node.js 库 `require()` 使用
27
- - **🔐 凭证安全** — 配置存储在 `~/.bdp/config.json`,不写入代码或日志
28
-
29
- ## 📌 能力一览
30
-
31
- | 能力 | 命令 | 说明 |
32
- |:-----|:------|:-----|
33
- | 列目录 | `bdp ls /` | 全盘任意目录 |
34
- | 搜索文件名 | `bdp search "报告"` | 递归全盘搜索,支持 glob/正则 |
35
- | **读取文件内容** | `bdp cat /文档/data.json` | 免下载,限 1MB |
36
- | **读取前 N 行** | `bdp head -n 50 /文档/log.txt` | 免下载 |
37
- | **读取后 N 行** | `bdp tail -n 30 /文档/log.txt` | 免下载 |
38
- | **搜索文件内容** | `bdp grep "关键词" /文档/file.txt` | 免下载 |
39
- | 预览文件 | `bdp peek /文档/report.pdf` | 类型检测 + 前 10 行 + md5/ctime |
40
- | 下载 | `bdp get /文档/file.zip` | 保存到本地,**size 校验 + 断点续传** |
41
- | 上传 | `bdp put ./file.txt /文档/` | 全盘任意位置 |
42
- | 移动/重命名 | `bdp mv <src> <dst>` | 移动或重命名 |
43
- | 拷贝 | `bdp cp <src> <dst>` | 网盘内复制 |
44
- | 配额 | `bdp quota` | 总容量/已用/剩余 |
45
- | 容量分析 | `bdp du [path]` | 递归统计目录大小,找空间大户 |
46
- | 回收站 | `bdp recycle list/restore/clean` | 列出/还原/清空回收站 |
47
- | 离线下载 | `bdp offline add <url>` | 百度服务器代下 |
48
- | 分享管理 | `bdp share set/cancel` | 生成/取消分享链接 |
49
- | **列出群组** | `bdp groups` | 所有群聊 + gid |
50
- | **群内分享库** | `bdp gshares <gid>` | 顶层分享目录 |
51
- | **浏览群文件** | `bdp gls <gid> <fs_id>` | 分页 + 递归 |
52
- | **搜索群文件** | `bdp gsearch <gid> "关键词"` | 按文件名搜索(缓存命中秒回) |
53
- | **下载群文件** | `bdp gdownload <gid> <fs_id>` | **直接下载到本地,免转存**(逆向 sharedownload API) |
54
- | 群目录树 | `bdp gtree <gid>` | BFS 构建目录树 |
55
- | 群缓存管理 | `bdp cache [clear]` | 查看 / 清空会话缓存 |
56
-
57
- ## 🚀 快速开始
58
-
59
- ### 1. 安装
60
-
61
- ```bash
62
- npm install -g baiduwangpan-cli
63
- ```
64
-
65
- 安装时会**自动下载** BaiduPCS-Go 引擎(镜像优先加速,国内也能装;全部下载源失败时打印手动下载地址,不阻断安装)。
66
- CLI 会自动发现引擎(包根固定路径或 `BaiduPCS-Go-v4.0.1-windows-x64/` 版本子目录),升级不会丢 `pcsPath` 配置。也支持手动克隆:
67
-
68
- ```bash
69
- git clone https://github.com/NkAntony777/baiduwangpan-cli.git
70
- cd baiduwangpan-cli
71
- npm install # postinstall 自动下载引擎
72
- npm link # 全局注册 bdp 命令
73
- ```
74
-
75
- > **依赖**: Node.js 14+ 和 `curl`(已在 Windows 10+ / macOS / 大多数 Linux 预装)
76
-
77
- ### 2. 配置认证
78
-
79
- **方式一:浏览器自动登录(推荐)**
80
-
81
- ```bash
82
- bdp login
83
- ```
84
-
85
- 自动启动 Chrome/Edge → 打开百度网盘登录页 → **手机扫码** → 在页面会话内验证登录 → 自动同步引擎。无需 F12。
86
-
87
- 扫码产生的新会话可能被百度限制为只能在原浏览器上下文中使用。因此 `bdp` 会保留专用 profile,并在登录后将浏览器最小化;PCS API 继续使用 BDUSS/STOKEN,网页和群聊 API 通过该浏览器的 CDP 会话调用。浏览器被关闭后,下次网页 API 调用会使用同一 profile 自动重启。
88
-
89
- **方式二:手动凭证**
90
-
91
- ```bash
92
- bdp login --bduss <你的BDUSS> --stoken <你的STOKEN>
93
- bdp whoami # 验证
94
- ```
95
-
96
- <details>
97
- <summary>📋 如何获取 BDUSS 和 STOKEN(手动方式)</summary>
98
-
99
- 1. 浏览器打开 [pan.baidu.com](https://pan.baidu.com) 并登录
100
- 2. 按 `F12` → **Application** → **Cookies** → `https://pan.baidu.com`
101
- 3. 找到 **BDUSS** 和 **STOKEN** 的值,复制
102
-
103
- > ⚠️ STOKEN 必须在百度网盘页面获取(不是百度首页),值中应包含大写字母。
104
-
105
- > 💡 推荐直接运行 `bdp login`,全程自动化,无需手动操作。
106
-
107
- </details>
108
-
109
- ### 3. 开始使用
110
-
111
- ```bash
112
- # 浏览网盘
113
- bdp ls /
114
- bdp search "中医"
115
-
116
- # 免下载读取文件
117
- bdp head -n 10 /文档/data.csv
118
- bdp cat /文档/config.json
119
-
120
- # 浏览群聊文件
121
- bdp groups
122
- bdp gshares 539478953581833690
123
- bdp gls 539478953581833690 742474845517885
124
- # 下载群文件到本地 (免转存)
125
- bdp gdownload 539478953581833690 954615608563687 -o ./downloads
126
- ```
127
-
128
- ## 📖 完整命令参考
129
-
130
- ### 网盘文件操作
131
-
132
- ```
133
- bdp ls [path] 列出目录
134
- bdp search <keyword> [-p dir] 搜索文件名
135
- [--regex 正则] [--glob 通配符] [--any-word] [--exact]
136
- bdp cat <path> 读取文件内容 (免下载, 限 1MB)
137
- bdp head [-n N] <path> 读取前 N 行 (默认 20)
138
- bdp tail [-n N] <path> 读取后 N 行 (默认 20)
139
- bdp grep <pattern> <path> 搜索文件内容
140
- bdp peek <path> 预览文件信息 + 前 10 行 (含 md5/ctime)
141
- bdp get <path> [-o dir] 下载文件 (直链分块, size 校验, 断点续传)
142
- [--resume] [--force] [--progress] [--no-verify-size] [--dry-run]
143
- <gid>:<fs_id> 形式自动走群文件直下
144
- bdp put <local> <remote> 上传文件 [--dry-run]
145
- bdp mkdir <path> 创建目录
146
- bdp rm <path> 删除文件/目录 [--dry-run]
147
- bdp mv <src> <dst> 移动/重命名文件/目录
148
- bdp cp <src> <dst> 拷贝文件/目录
149
- bdp quota 网盘配额 (总/已用/剩余)
150
- bdp du [path] 目录容量分析 (递归统计, --depth/--top/--concurrency)
151
- bdp recycle list / restore <id>... / clean 回收站管理 (clean 不可恢复)
152
- bdp offline add <url> [--path D] 离线下载 (百度服务器代下)
153
- bdp offline list 离线任务列表
154
- bdp share set <path> [--pwd P] 创建分享链接 [--combined 输出带密码链接]
155
- bdp share cancel <id>... 取消分享
156
- bdp share list 列出分享 (受 BaiduPCS-Go v4.0.1 引擎 bug 限制)
157
- bdp profile list / use <name> 多账号 profile 管理
158
- bdp help [command] 帮助总览 / 单命令详情 (--json 结构化输出)
159
- ```
160
-
161
- ### 群聊文件操作
162
-
163
- ```
164
- bdp groups 列出所有群组
165
- bdp gshares <gid> [--no-cache] 列出群内分享库 (自动游标翻页)
166
- bdp gls <gid> <fs_id> [--page N] [--page-size N] [--from-uk X] [--msg-id Y]
167
- [--parent-fs-id Z] [--no-cache] 浏览分享库内容
168
- bdp gtree <gid> [--depth N] [--concurrency N] [--max-nodes N]
169
- [--max-pages N] [--max-requests N] [--no-cache] 构建群目录树
170
- bdp gsearch <gid> <keyword> 搜索群文件名 (全量遍历目录)
171
- [--page N] [--limit N] [--depth N] [--concurrency N]
172
- [--max-pages N] [--max-requests N] [--no-unique]
173
- [--all|--all-results] [--timeout N] [--save-partial]
174
- [--any-word] [--exact] [--no-cache]
175
- bdp gdownload <gid> <fs_id>... 直接下载群文件到本地 (逆向 /api/sharedownload, 免转存)
176
- 单文件直下;多个 fs_id(同消息)自动 zip 打包下载
177
- [-o dir] [--filename NAME] [--from-uk X] [--msg-id Y] [--no-cache]
178
- bdp cache [clear] 查看 / 清空会话缓存 (~/.bdp/cache/)
179
- ```
180
-
181
- > **群文件下载限制说明**(实测,2026-08):
182
- > - 单文件 ≤ ~20MB:直接下载 ✅
183
- > - 同消息多文件:zip 打包下载 ✅(总包 ≤ ~100MB)
184
- > - 大文件(> ~100MB):网页端受百度限制(单文件加密 / zip 报 `31090 package is too large`),需用官方客户端;转存接口已被百度下线(`errno=-10`)
185
- > - 详见 `docs/group-download-final-verdict.md`
186
-
187
- ### 通用选项
188
-
189
- ```
190
- --json JSON 结构化输出 (Agent 友好)
191
- --json-file <path> JSON 写入文件 (UTF-8, 绕开控制台编码)
192
- --verbose 进度/日志只写 stderr
193
- -n <N> 行数 (head/tail, 默认 20)
194
- -p <path> 搜索路径 (search, 默认 /)
195
- -i 忽略大小写 (grep)
196
- -N 显示行号 (cat/grep)
197
- -o <dir> 输出目录 (get)
198
- --resume 断点续传 (get;存在部分文件时自动续传)
199
- --force 覆盖重下 (get;先删除旧文件)
200
- --progress 显示实时进度 + 速度 (get,stderr)
201
- --no-verify-size 关闭下载后 size 校验 (get;默认开启)
202
- --regex / --glob 搜索模式: 正则 / 通配符 (search)
203
- --any-word 空格分隔关键词命中任意一个 (search/gsearch)
204
- --exact 整名精确匹配 (search/gsearch)
205
- --pwd <P> 分享提取码 (share set)
206
- --combined 输出带提取码的分享链接 (share set)
207
- --dry-run 模拟执行不落盘 (get/put/rm)
208
- --profile <name> 切换账号 profile (全局参数,命令前/后均可)
209
- --page <N> 页码 (gls/gsearch, 默认 1)
210
- --page-size <N> 每页条数 (gls, 默认 50, 最大 100)
211
- --limit <N> 每页条数 (gsearch, 默认 50)
212
- --depth <N> 递归深度 (gsearch 默认 1 / gtree 默认 2)
213
- --concurrency <N> 并发扫描数 (gsearch/gtree, 默认 4, 1-8)
214
- --max-nodes <N> 树节点上限 (gtree, 默认 2000)
215
- --max-pages <N> 单目录最大页数 (gsearch/gtree, 默认 50, 100 条/页)
216
- --max-requests <N> 单命令请求预算 (gsearch/gtree, 默认 400, 防限流)
217
- --from-uk <X> / --msg-id <Y> 分享来源参数 (gls 子目录)
218
- --parent-fs-id <Z> 父目录 fsId (gls, errno=-3 时回退用)
219
- --no-unique 保留不同 msgId 的重复项 (gsearch)
220
- --all, --all-results 忽略分页获取全部结果 (gsearch; 不限时, 慢但完整)
221
- --timeout <N> 超时秒数,到点返回已扫到的部分结果 (gsearch; 0=不限时, 默认 0)
222
- --save-partial 未完整时自动把已搜到的结果存为 JSON 并打印路径 (gsearch; 配 --json-file 时写该文件)
223
- --any-word 空格分隔关键词命中任意一个即可 (gsearch; 默认=全部命中 AND)
224
- --exact 按文件名精确匹配,忽略路径前缀 (gsearch; 大小写不敏感)
225
- --no-cache 禁用会话缓存 (gsearch/gtree/gshares/gls)
226
- ```
227
-
228
- ### get 下载可靠性(v1.2.0)
229
-
230
- `bdp get` 已从裸跑 BaiduPCS-Go 升级为**直链分块下载 + 三重保障**(实测,2026-08):
231
-
232
- ```
233
- bdp get /文档/大文件.zip # 下载到当前目录,自动 size 校验
234
- bdp get /文档/大文件.zip -o ./dl # 下载到指定目录 (自动创建)
235
- bdp get /文档/大文件.zip --resume # 断点续传(存在部分文件时自动续传,无需该参数)
236
- bdp get /文档/大文件.zip --force # 已有文件时覆盖重下
237
- bdp get /文档/大文件.zip --progress # 实时进度 + 速度 (stderr)
238
- bdp get /文档/大文件.zip --json # JSON 元信息: {path, localPath, size, md5, remoteMd5,
239
- # md5Match, md5Obfuscated, dlinkExpiry, verified,
240
- # skipped, resumed, avgSpeedBps}
241
- ```
242
-
243
- - **size 校验**(默认开启,`--no-verify-size` 可关):下载后比对远端/本地字节数,0 字节或大小不符即报错并**保留文件供排查**
244
- - **断点续传**:curl 有界 Range 分块下载(4MB/块,实测部分 CDN 节点只接受 ≤5MB 的有界 Range,无界请求会 403),每块失败自动**换新 dlink 重试**;中断后重跑同一命令即从断点继续
245
- - **并发分块**:大文件(>32MB)默认 3 路并发分块(`--concurrency 1` 可回串行)。实测百度对非 SVIP 是**账号级限速**,并发无法突破总量限速,但多 CDN 节点并行能提升稳定性(坏节点/单连接抖动不影响整体)
246
- - **md5 软校验**:百度 `/api/list` 返回的 md5 是**混淆键**(含 `o`/`t` 等非 hex 字符,非内容哈希),无法作为完整性依据;CLI 计算本地 md5 供流水线比对,`md5Obfuscated:true` 标注远端不可信
247
- - **默认保存位置**:`-o` 指定目录,否则当前目录(与 `gdownload` 一致)
248
- - 目录下载 / 获取 dlink 失败等边界场景自动回退 BaiduPCS-Go 引擎(无校验/续传)
249
-
250
- ### 多账号 profile(v1.3.0)
251
-
252
- 多个百度账号切换,认证字段按 profile 隔离(pcsPath/ua 等配置保持全局):
253
-
254
- ```
255
- bdp --profile svip login --bduss X --stoken Y # 登录到 svip profile
256
- bdp profile list # 列出所有 profile
257
- bdp --profile svip quota # 用 svip 账号执行命令
258
- bdp login --profile 备份 ... # --profile 也可放命令后
259
- bdp profile unset # 切回全局账号
260
- ```
261
-
262
- - 存储在 `~/.bdp/config.json` 的 `profiles` + `activeProfile` 字段;无 profile 时行为与旧版完全一致
263
- - `bdp whoami` 会显示当前 profile
264
-
265
- ### 容量管理(v1.6.0)
266
-
267
- 网盘容量见底时的排查三件套(百度无服务端目录大小接口,`du` 走 /api/list 并发遍历):
268
-
269
- ```
270
- bdp quota # 总/已用/剩余(实测 99.78% 时优先排查下面两项)
271
- bdp recycle list # 回收站:删除的文件保留 60 天仍占容量,先看这里
272
- bdp recycle restore <fs_id>... # 还原误删
273
- bdp recycle clean # 清空回收站释放容量(不可恢复,务必确认)
274
- bdp du / # 顶层目录容量分布(找空间大户)
275
- bdp du /玄学 --depth 5 --top 20 # 深扫指定目录(深度封顶的子目录标 [深度封顶])
276
- bdp du / --json # JSON 输出(Agent 可解析)
277
- ```
278
-
279
- > 注意:`du` 全盘扫描较慢(API 限制,深度 4 全盘约 10 分钟),建议先顶层后深扫;若 quota 已用量与全盘可见内容差距巨大,优先怀疑**百度扩容/福利空间到期**(总量缩水,历史总量需在网页端空间明细核实)。
280
-
281
- ## 🤖 Agent 集成示例
282
-
283
- 所有命令支持 `--json` 输出,适合 AI Agent 直接调用和解析。**Agent 运行时发现用法**:
284
-
285
- ```bash
286
- bdp help --json # 全部命令的 usage/desc/options/examples(结构化)
287
- bdp help get --json # 单个命令的完整定义
288
- bdp help gsearch --json # 群搜索的全部选项
289
- ```
290
-
291
- ```bash
292
- # Agent 获取群组列表 (JSON)
293
- bdp groups --json
294
- # → [{"gid":"539478953581833690","name":"国学文化SVIP13",...}]
295
-
296
- # Agent 读取文件内容 (JSON)
297
- bdp head -n 5 /文档/data.csv --json
298
- # → {"path":"/文档/data.csv","lines":5,"content":["header","row1","row2",...]}
299
-
300
- # Agent 搜索群文件 (JSON)
301
- bdp gsearch 539478953581833690 "倪海厦" --json
302
- # → [{"name":"N 倪海厦","path":"/全店svip200位大师课(共16T)/N 倪海厦","isDir":true,...}]
303
- ```
304
-
305
- ### 作为 Node.js 库使用
306
-
307
- ```javascript
308
- const { pan, group } = require('baiduwangpan-cli');
309
-
310
- // 免下载读取文件
311
- const content = pan.cat('/文档/data.json');
312
-
313
- // 搜索群聊文件
314
- const results = await group.searchFiles('539478953581833690', '倪海厦');
315
- ```
316
-
317
- ## 🏗️ 架构
318
-
319
- ```
320
- ┌─────────────────────────────────────────────────────┐
321
- │ Agent / 用户 │
322
- ├─────────────┬───────────────────────────────────────┤
323
- │ CLI 模式 │ 库模式 (require) │
324
- │ bdp <cmd> │ const {pan, group} = require() │
325
- ├─────────────┴───────────────────────────────────────┤
326
- │ bin/bdp.js │
327
- │ (统一命令解析 + 路由) │
328
- ├──────────────────┬──────────────────────────────────┤
329
- │ lib/pan.js │ lib/group.js │
330
- │ 全盘文件操作 │ 群聊文件浏览 + 下载 │
331
- ├──────────────────┼──────────────────────────────────┤
332
- │ BaiduPCS-Go │ lib/http.js (curl / browser) │
333
- │ (BDUSS 认证) │ mbox API (逆向) │
334
- │ locate → dlink │ /mbox/group/listshare │
335
- │ upload/download │ /mbox/msg/shareinfo │
336
- │ │ /api/sharedownload → dlink │
337
- ├──────────────────┴──────────────────────────────────┤
338
- │ 百度网盘 CDN / API │
339
- └─────────────────────────────────────────────────────┘
340
- ```
341
-
342
- ### 免下载读取原理
343
-
344
- ```
345
- bdp cat /文档/报告.txt
346
- │
347
- ├── BaiduPCS-Go locate /文档/报告.txt
348
- │ → 获取 CDN 直链 dlink (有效期 8h)
349
- │
350
- ├── curl -r 0-1048575 <dlink>
351
- │ → HTTP Range 请求,只读取前 1MB
352
- │ → 百度 CDN 返回 206 Partial Content
353
- │
354
- └── stdout 输出文件内容
355
- → Agent 直接读取,无需下载整个文件
356
- ```
357
-
358
- ### 群聊 API 链路(逆向 `/mbox/`)
359
-
360
- ```
361
- bdp groups bdp gshares <gid>
362
- │ │
363
- ├── /mbox/group/list ├── /mbox/group/listshare
364
- │ → 获取全部群组 (gid) │ → 获取分享库 (msg_id + from_uk + fs_id)
365
- │ │ └ has_more=1 时按 last_msg_time 游标翻页
366
- └───────────────────────────────────┘
367
- ↓
368
- bdp gls <gid> <fs_id> bdp gsearch <gid> "关键词"
369
- │ │
370
- ├── /mbox/msg/shareinfo ├── 全量遍历: shareinfo 自动翻页 (每页上限 100)
371
- │ → 浏览文件/子目录 │ → 目录级并发扫描 + 磁盘缓存
372
- ↓ ↓
373
- 文件列表 (名称/大小/类型/fs_id) 匹配结果
374
- ```
375
-
376
- **逆向实测结论(2026-08)**:
377
-
378
- - 群聊文件**没有服务端搜索接口**(`listshare`/`shareinfo` 的 `key`/`keyword` 参数被忽略,`/api/search` 不支持群维度)——网页端搜索同样是客户端遍历,`gsearch` 走的是同一条路。
379
- - `shareinfo` 每页**硬上限 100 条**(`num>100` 不返回更多),`page` 翻页可用 → `gsearch`/`gtree` 自动全页遍历,不再漏数据。
380
- - 高频调用会触发限流,表现为 `errno=-3`、**self-echo**(`errno=0` 但返回目录自身)、或空列表;工具自动退避重试、连续限流停止扫描,重跑命令即续扫(`--max-requests` 可控制单命令请求预算,默认 400)。
381
- - 群文件路径可能含**非法百分号编码**(裸 `%`),直接 `decodeURIComponent` 会抛 `URIError` 报废整个目录 → 已改为安全解码。
382
- - `gsearch`/`gtree`/`gshares` 默认启用**磁盘会话缓存**(目录 30min / 分享 5min,`~/.bdp/cache/`,`--no-cache` 关闭、`bdp cache clear` 清理)——重复搜索秒回,深扫续扫收敛。
383
-
384
- ## 📁 项目结构
385
-
386
- ```
387
- baiduwangpan-cli/
388
- ├── package.json # npm 配置 (bin: bdp,唯一入口)
389
- ├── bin/
390
- │ └── bdp.js # CLI 入口 (统一命令解析 + 命令注册表)
391
- ├── lib/
392
- │ ├── index.js # 库导出
393
- │ ├── config.js # 配置管理 (~/.bdp/config.json,含多账号 profile)
394
- │ ├── http.js # 网页 API 双传输 (curl / browser)
395
- │ ├── browser-login.js # 浏览器登录、持久 profile 与 CDP 请求
396
- │ ├── pan.js # 网盘操作 (BaiduPCS-Go 桥接 + 直链分块下载)
397
- │ ├── group.js # 群聊操作 (逆向 mbox API)
398
- │ ├── pcs-extra.js # 引擎扩展命令 (mv/cp/quota/offline/share)
399
- │ ├── name-match.js # 文件名匹配 (glob/正则/AND/OR)
400
- │ └── console.js # Windows 控制台编码兜底 (chcp 65001)
401
- ├── test/ # Node.js 回归测试
402
- ├── skills/
403
- │ └── baiduwangpan/ # Agent Skill 源文件 (SKILL.md + reference + scripts)
404
- └── baiduwangpan-skill.zip # Agent Skill 打包 (Releases 附件)
405
- ```
406
-
407
- > **唯一入口**:`bdp` 命令(`bin/bdp.js`)。历史原型 `bdp.py` / `bdp.js` / `bdp-group.js` 已删除(git 历史可查),避免多入口行为不一致。Agent 不确定命令用法时用 `bdp help <命令> --json` 查询。
408
-
409
- ## 🤖 Agent Skill 使用
410
-
411
- 本仓库附带一个标准格式的 Agent Skill,让 Claude Code / Codex / OpenClaw / Cursor 等 Agent 通过自然语言操作百度网盘。
412
-
413
- ### 安装 Skill
414
-
415
- 从 [Releases](https://github.com/NkAntony777/baiduwangpan-cli/releases) 下载 `baiduwangpan-skill.zip`,或直接复制仓库 `skills/baiduwangpan/` 文件夹:
416
-
417
- ```bash
418
- # 各平台 skills 目录
419
- ~/.claude/skills/ # Claude Code
420
- ~/.codex/skills/ # Codex CLI
421
- ~/.config/opencode/skills/ # OpenCode
422
- # 或对应 Agent 的 skills 目录
423
- ```
424
-
425
- ### Skill 使用
426
-
427
- Agent 加载 skill 后,自然语言即可驱动(skill 会自动触发):
428
-
429
- ```
430
- 用户: 看看我网盘里有什么
431
- 用户: 在群里找倪海厦的资料
432
- 用户: 读一下 /文档/data.csv 前几行
433
- 用户: 搜索网盘里所有报告文件
434
- ```
435
-
436
- skill 会自动执行 `bdp` 命令并返回结构化结果(含 `--json` 输出)。
437
-
438
- ### Skill 内容
439
-
440
- ```
441
- skills/baiduwangpan/
442
- ├── SKILL.md # 技能定义(触发规则 + 命令规范 + 安全边界)
443
- ├── reference/
444
- │ ├── commands.md # 完整命令参考
445
- │ ├── authentication.md # 凭证获取与配置
446
- │ ├── examples.md # Agent 使用示例 + JSON 输出格式
447
- │ └── troubleshooting.md # 故障排查
448
- └── scripts/
449
- ├── setup.sh # macOS/Linux 自动安装
450
- └── setup.ps1 # Windows 自动安装
451
- ```
452
-
453
- ## ⚠️ 注意事项
454
-
455
- - **BDUSS 有效期**:Cookie 会过期,失效后重新执行 `bdp login`
456
- - **下载限速**:非 SVIP 用户下载受百度限速策略限制
457
- - **cat 限制**:为防止误读超大文件,`cat` 默认限制 1MB,可通过 `BDP_MAX_CAT_BYTES` 环境变量调整
458
- - **群聊文件**:群聊 API 为逆向获取,可能随百度服务端变更而失效
459
- - **share list**:BaiduPCS-Go v4.0.1 的 `share list` 有引擎 bug(panic),CLI 会提示替代方案;`share set/cancel` 正常
460
- - **PowerShell 中文乱码**:CLI 启动时自动 `chcp 65001`(仅 TTY 且非 UTF-8 代码页时),中文正常显示;管道/重定向场景无副作用
461
- - **1.1.0 升级**:若引擎丢失(postinstall 网络失败),CLI 会自动发现 `BaiduPCS-Go-v*` 版本子目录中的二进制;config 里失效的绝对 `pcsPath` 也会自动回退到自动发现,无需手改配置
462
-
463
- ## 🤝 致谢
464
-
465
- - [BaiduPCS-Go](https://github.com/qjfoidnh/BaiduPCS-Go) — 强大的百度网盘 Go 客户端,本工具的底层引擎
466
- - [hustuhao/bdntoy](https://github.com/hustuhao/bdntoy) — mbox API 逆向参考
467
- - 所有百度网盘逆向工程社区的贡献者
468
-
469
- ## 📄 License
470
-
471
- [MIT](LICENSE)
1
+ <div align="center">
2
+
3
+ # baiduwangpan-cli
4
+
5
+ **百度网盘 CLI — 全盘读写 · 免下载读取 · 群聊文件浏览/下载**
6
+
7
+ 专为 AI Agent 设计的百度网盘命令行工具
8
+
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
10
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D14-brightgreen)](https://nodejs.org)
11
+ [![npm version](https://img.shields.io/npm/v/baiduwangpan-cli)](https://www.npmjs.com/package/baiduwangpan-cli)
12
+ [![npm downloads](https://img.shields.io/npm/dm/baiduwangpan-cli)](https://www.npmjs.com/package/baiduwangpan-cli)
13
+ [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-blue)]()
14
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## ✨ 特性
21
+
22
+ - **🗂️ 全盘访问** — 不受 `/apps/` 目录限制,读写网盘任意路径
23
+ - **📄 免下载读取** — 通过 HTTP Range 直接读取文件内容到 stdout,无需下载整个文件
24
+ - **👥 群聊文件浏览 + 下载** — 逆向 mbox API,列出群组、浏览群内分享库、搜索群文件,并支持**直接下载群文件到本地**(免转存)
25
+ - **🤖 Agent 友好** — 所有命令支持 `--json` 结构化输出,零解析成本
26
+ - **🔌 MCP 接入** — `bdp serve --mcp` 可作为 MCP 服务器运行,工具描述与参数 schema 由客户端自动发现
27
+ - **📚 结构化目录/搜索** — `ls` / `search` 的 `--json` 返回真正的结构化 `entries[]`,不再需要解析文本表格
28
+ - **🔤 编码自动识别** — UTF-8 / GBK / Big5 自动判别,中文古籍不再乱码,grep 不再静默漏检
29
+ - **🚦 可信的退出码** — 命令失败一定以非零退出码结束,Agent 不会把失败当成功
30
+ - **🔧 双模式** — 既是 CLI 工具,也可作为 Node.js 库 `require()` 使用
31
+ - **🔐 凭证安全** — 配置存储在 `~/.bdp/config.json`,不写入代码或日志;`bdp config` 默认脱敏
32
+
33
+ ## 📌 能力一览
34
+
35
+ | 能力 | 命令 | 说明 |
36
+ |:-----|:------|:-----|
37
+ | 列目录 | `bdp ls /` | 全盘任意目录 |
38
+ | 搜索文件名 | `bdp search "报告"` | 递归全盘搜索,支持 glob/正则 |
39
+ | **读取文件内容** | `bdp cat /文档/data.json` | 免下载,限 1MB |
40
+ | **读取前 N 行** | `bdp head -n 50 /文档/log.txt` | 免下载 |
41
+ | **读取后 N 行** | `bdp tail -n 30 /文档/log.txt` | 免下载 |
42
+ | **搜索文件内容** | `bdp grep "关键词" /文档/file.txt` | 免下载 |
43
+ | 预览文件 | `bdp peek /文档/report.pdf` | 类型检测 + 前 10 行 + md5/ctime |
44
+ | 下载 | `bdp get /文档/file.zip` | 保存到本地,**size 校验 + 断点续传** |
45
+ | 上传 | `bdp put ./file.txt /文档/` | 全盘任意位置 |
46
+ | 移动/重命名 | `bdp mv <src> <dst>` | 移动或重命名 |
47
+ | 拷贝 | `bdp cp <src> <dst>` | 网盘内复制 |
48
+ | 配额 | `bdp quota` | 总容量/已用/剩余 |
49
+ | 容量分析 | `bdp du [path]` | 递归统计目录大小,找空间大户 |
50
+ | 回收站 | `bdp recycle list/restore/clean` | 列出/还原/清空回收站 |
51
+ | 离线下载 | `bdp offline add <url>` | 百度服务器代下 |
52
+ | 分享管理 | `bdp share set/cancel` | 生成/取消分享链接 |
53
+ | **列出群组** | `bdp groups` | 所有群聊 + gid |
54
+ | **群内分享库** | `bdp gshares <gid>` | 顶层分享目录 |
55
+ | **浏览群文件** | `bdp gls <gid> <fs_id>` | 分页 + 递归 |
56
+ | **搜索群文件** | `bdp gsearch <gid> "关键词"` | 按文件名搜索(缓存命中秒回) |
57
+ | **下载群文件** | `bdp gdownload <gid> <fs_id>` | **直接下载到本地,免转存**(逆向 sharedownload API) |
58
+ | 群目录树 | `bdp gtree <gid>` | BFS 构建目录树 |
59
+ | 群缓存管理 | `bdp cache [clear]` | 查看 / 清空会话缓存 |
60
+ | 列出我的分享 | `bdp share list` | 网页 API,绕过引擎 panic bug |
61
+ | 错误码释义 | `bdp error -3` | 内置错误码字典 |
62
+ | **MCP 服务器** | `bdp serve --mcp` | stdio 传输,10 个带 schema 的工具 |
63
+
64
+ ## 🚀 快速开始
65
+
66
+ ### 1. 安装
67
+
68
+ ```bash
69
+ npm install -g baiduwangpan-cli
70
+ ```
71
+
72
+ 安装时会**自动下载** BaiduPCS-Go 引擎(镜像优先加速,国内也能装;全部下载源失败时打印手动下载地址,不阻断安装)。
73
+ CLI 会自动发现引擎(包根固定路径或 `BaiduPCS-Go-v4.0.1-windows-x64/` 版本子目录),升级不会丢 `pcsPath` 配置。也支持手动克隆:
74
+
75
+ ```bash
76
+ git clone https://github.com/NkAntony777/baiduwangpan-cli.git
77
+ cd baiduwangpan-cli
78
+ npm install # postinstall 自动下载引擎
79
+ npm link # 全局注册 bdp 命令
80
+ ```
81
+
82
+ > **依赖**: Node.js 14+ 和 `curl`(已在 Windows 10+ / macOS / 大多数 Linux 预装)
83
+
84
+ ### 2. 配置认证
85
+
86
+ **方式一:浏览器自动登录(推荐)**
87
+
88
+ ```bash
89
+ bdp login
90
+ ```
91
+
92
+ 自动启动 Chrome/Edge → 打开百度网盘登录页 → **手机扫码** → 在页面会话内验证登录 → 自动同步引擎。无需 F12。
93
+
94
+ 扫码产生的新会话可能被百度限制为只能在原浏览器上下文中使用。因此 `bdp` 会保留专用 profile,并在登录后将浏览器最小化;PCS API 继续使用 BDUSS/STOKEN,网页和群聊 API 通过该浏览器的 CDP 会话调用。浏览器被关闭后,下次网页 API 调用会使用同一 profile 自动重启。
95
+
96
+ **方式二:手动凭证**
97
+
98
+ ```bash
99
+ bdp login --bduss <你的BDUSS> --stoken <你的STOKEN>
100
+ bdp whoami # 验证
101
+ ```
102
+
103
+ <details>
104
+ <summary>📋 如何获取 BDUSS 和 STOKEN(手动方式)</summary>
105
+
106
+ 1. 浏览器打开 [pan.baidu.com](https://pan.baidu.com) 并登录
107
+ 2. 按 `F12` → **Application** → **Cookies** → `https://pan.baidu.com`
108
+ 3. 找到 **BDUSS** 和 **STOKEN** 的值,复制
109
+
110
+ > ⚠️ STOKEN 必须在百度网盘页面获取(不是百度首页),值中应包含大写字母。
111
+
112
+ > 💡 推荐直接运行 `bdp login`,全程自动化,无需手动操作。
113
+
114
+ </details>
115
+
116
+ ### 3. 开始使用
117
+
118
+ ```bash
119
+ # 浏览网盘
120
+ bdp ls /
121
+ bdp search "中医"
122
+
123
+ # 免下载读取文件
124
+ bdp head -n 10 /文档/data.csv
125
+ bdp cat /文档/config.json
126
+
127
+ # 浏览群聊文件
128
+ bdp groups
129
+ bdp gshares 539478953581833690
130
+ bdp gls 539478953581833690 742474845517885
131
+ # 下载群文件到本地 (免转存)
132
+ bdp gdownload 539478953581833690 954615608563687 -o ./downloads
133
+ ```
134
+
135
+ ## 🆕 v1.7.0 新增
136
+
137
+ | 改进 | 说明 |
138
+ |:-----|:-----|
139
+ | **凭证不再泄漏** | `bdp config --json` 此前会明文吐出完整 BDUSS/STOKEN(而 SKILL.md 要求 Agent 优先用 `--json`)。现已默认脱敏,JSON 带 `"redacted": true` |
140
+ | **失败不再伪装成功** | `ls`/`get`/`put` 失败时退出码曾为 0(`get` 还会把失败报成"下载完成 0B")。现统一以退出码 1 结束,JSON 带 `{"error","errno"}` |
141
+ | **GBK 中文古籍修复** | 编码检测的 GBK 回退分支曾是死代码(`Buffer.toString("utf-8")` 永不抛错),导致 75% 字符乱码、grep 静默返回空。现自动识别 UTF-8/GBK/Big5 |
142
+ | **ls/search 结构化** | `--json` 从"塞一段文本表格"改为真正的 `entries[]`(index/name/path/isDir/size/mtime) |
143
+ | **search 分页** | 新增 `--limit`/`--page`/`--max-results`/`--fields`;输出含 `total`/`hasMore`/`nextPage`,避免一次搜索吃掉 13 万 tokens |
144
+ | **二进制守卫** | PDF/zip/图片/音视频不再被当文本读取,直接报错并提示改用 `bdp get` |
145
+ | **du 完整性** | `capped`/`partial` 沿路径向上传播,不再出现"capped:false 但 size 不完整";新增 `--progress`、`depthLimit`、`depthCapped` |
146
+ | **share list 可用** | 改走网页 API,绕过引擎 panic bug |
147
+ | **rm 批量 + 确认** | 支持多路径删除、`--yes`、结构化输出 |
148
+ | **mkdir 幂等** | 目录已存在不再报失败 |
149
+ | **gls nextPage** | 补上 SKILL.md 一直引用却不存在的翻页字段 |
150
+ | **error -3 可用** | 负数错误码此前无法执行(`bdp error -- -3` 现在也支持) |
151
+ | **MCP 服务器** | `bdp serve --mcp` 暴露 10 个带 JSON Schema 的工具 |
152
+
153
+ > v1.6.0 及更早版本的行为差异详见 [CHANGELOG.md](CHANGELOG.md)。
154
+
155
+ ## 📖 完整命令参考
156
+
157
+ ### 网盘文件操作
158
+
159
+ ```
160
+ bdp ls [path] 列出目录
161
+ bdp search <keyword> [-p dir] 搜索文件名
162
+ [--regex 正则] [--glob 通配符] [--any-word] [--exact]
163
+ bdp cat <path> 读取文件内容 (免下载, 限 1MB)
164
+ bdp head [-n N] <path> 读取前 N 行 (默认 20)
165
+ bdp tail [-n N] <path> 读取后 N 行 (默认 20)
166
+ bdp grep <pattern> <path> 搜索文件内容
167
+ bdp peek <path> 预览文件信息 + 前 10 行 (含 md5/ctime)
168
+ bdp get <path> [-o dir] 下载文件 (直链分块, size 校验, 断点续传)
169
+ [--resume] [--force] [--progress] [--no-verify-size] [--dry-run]
170
+ <gid>:<fs_id> 形式自动走群文件直下
171
+ bdp put <local> <remote> 上传文件 [--dry-run]
172
+ bdp mkdir <path> 创建目录
173
+ bdp rm <path> 删除文件/目录 [--dry-run]
174
+ bdp mv <src> <dst> 移动/重命名文件/目录
175
+ bdp cp <src> <dst> 拷贝文件/目录
176
+ bdp quota 网盘配额 (总/已用/剩余)
177
+ bdp du [path] 目录容量分析 (递归统计, --depth/--top/--concurrency)
178
+ bdp recycle list / restore <id>... / clean 回收站管理 (clean 不可恢复)
179
+ bdp offline add <url> [--path D] 离线下载 (百度服务器代下)
180
+ bdp offline list 离线任务列表
181
+ bdp share set <path> [--pwd P] 创建分享链接 [--combined 输出带密码链接]
182
+ bdp share cancel <id>... 取消分享
183
+ bdp share list 列出分享 (受 BaiduPCS-Go v4.0.1 引擎 bug 限制)
184
+ bdp profile list / use <name> 多账号 profile 管理
185
+ bdp help [command] 帮助总览 / 单命令详情 (--json 结构化输出)
186
+ ```
187
+
188
+ ### 群聊文件操作
189
+
190
+ ```
191
+ bdp groups 列出所有群组
192
+ bdp gshares <gid> [--no-cache] 列出群内分享库 (自动游标翻页)
193
+ bdp gls <gid> <fs_id> [--page N] [--page-size N] [--from-uk X] [--msg-id Y]
194
+ [--parent-fs-id Z] [--no-cache] 浏览分享库内容
195
+ bdp gtree <gid> [--depth N] [--concurrency N] [--max-nodes N]
196
+ [--max-pages N] [--max-requests N] [--no-cache] 构建群目录树
197
+ bdp gsearch <gid> <keyword> 搜索群文件名 (全量遍历目录)
198
+ [--page N] [--limit N] [--depth N] [--concurrency N]
199
+ [--max-pages N] [--max-requests N] [--no-unique]
200
+ [--all|--all-results] [--timeout N] [--save-partial]
201
+ [--any-word] [--exact] [--no-cache]
202
+ bdp gdownload <gid> <fs_id>... 直接下载群文件到本地 (逆向 /api/sharedownload, 免转存)
203
+ 单文件直下;多个 fs_id(同消息)自动 zip 打包下载
204
+ [-o dir] [--filename NAME] [--from-uk X] [--msg-id Y] [--no-cache]
205
+ bdp cache [clear] 查看 / 清空会话缓存 (~/.bdp/cache/)
206
+ ```
207
+
208
+ > **群文件下载限制说明**(实测,2026-08):
209
+ > - 单文件 ≤ ~20MB:直接下载 ✅
210
+ > - 同消息多文件:zip 打包下载 ✅(总包 ≤ ~100MB)
211
+ > - 大文件(> ~100MB):网页端受百度限制(单文件加密 / zip 报 `31090 package is too large`),需用官方客户端;转存接口已被百度下线(`errno=-10`)
212
+ > - 详见 `docs/group-download-final-verdict.md`
213
+
214
+ ### 通用选项
215
+
216
+ ```
217
+ --json JSON 结构化输出 (Agent 友好)
218
+ --json-file <path> JSON 写入文件 (UTF-8, 绕开控制台编码)
219
+ --verbose 进度/日志只写 stderr
220
+ -n <N> 行数 (head/tail, 默认 20)
221
+ -p <path> 搜索路径 (search, 默认 /)
222
+ -i 忽略大小写 (grep)
223
+ -N 显示行号 (cat/grep)
224
+ -o <dir> 输出目录 (get)
225
+ --resume 断点续传 (get;存在部分文件时自动续传)
226
+ --force 覆盖重下 (get;先删除旧文件)
227
+ --progress 显示实时进度 + 速度 (get,stderr)
228
+ --no-verify-size 关闭下载后 size 校验 (get;默认开启)
229
+ --regex / --glob 搜索模式: 正则 / 通配符 (search)
230
+ --any-word 空格分隔关键词命中任意一个 (search/gsearch)
231
+ --exact 整名精确匹配 (search/gsearch)
232
+ --pwd <P> 分享提取码 (share set)
233
+ --combined 输出带提取码的分享链接 (share set)
234
+ --dry-run 模拟执行不落盘 (get/put/rm)
235
+ --profile <name> 切换账号 profile (全局参数,命令前/后均可)
236
+ --page <N> 页码 (gls/gsearch, 默认 1)
237
+ --page-size <N> 每页条数 (gls, 默认 50, 最大 100)
238
+ --limit <N> 每页条数 (gsearch, 默认 50)
239
+ --depth <N> 递归深度 (gsearch 默认 1 / gtree 默认 2)
240
+ --concurrency <N> 并发扫描数 (gsearch/gtree, 默认 4, 1-8)
241
+ --max-nodes <N> 树节点上限 (gtree, 默认 2000)
242
+ --max-pages <N> 单目录最大页数 (gsearch/gtree, 默认 50, 100 条/页)
243
+ --max-requests <N> 单命令请求预算 (gsearch/gtree, 默认 400, 防限流)
244
+ --from-uk <X> / --msg-id <Y> 分享来源参数 (gls 子目录)
245
+ --parent-fs-id <Z> 父目录 fsId (gls, errno=-3 时回退用)
246
+ --no-unique 保留不同 msgId 的重复项 (gsearch)
247
+ --all, --all-results 忽略分页获取全部结果 (gsearch; 不限时, 慢但完整)
248
+ --timeout <N> 超时秒数,到点返回已扫到的部分结果 (gsearch; 0=不限时, 默认 0)
249
+ --save-partial 未完整时自动把已搜到的结果存为 JSON 并打印路径 (gsearch; 配 --json-file 时写该文件)
250
+ --any-word 空格分隔关键词命中任意一个即可 (gsearch; 默认=全部命中 AND)
251
+ --exact 按文件名精确匹配,忽略路径前缀 (gsearch; 大小写不敏感)
252
+ --no-cache 禁用会话缓存 (gsearch/gtree/gshares/gls)
253
+ ```
254
+
255
+ ### get 下载可靠性(v1.2.0)
256
+
257
+ `bdp get` 已从裸跑 BaiduPCS-Go 升级为**直链分块下载 + 三重保障**(实测,2026-08):
258
+
259
+ ```
260
+ bdp get /文档/大文件.zip # 下载到当前目录,自动 size 校验
261
+ bdp get /文档/大文件.zip -o ./dl # 下载到指定目录 (自动创建)
262
+ bdp get /文档/大文件.zip --resume # 断点续传(存在部分文件时自动续传,无需该参数)
263
+ bdp get /文档/大文件.zip --force # 已有文件时覆盖重下
264
+ bdp get /文档/大文件.zip --progress # 实时进度 + 速度 (stderr)
265
+ bdp get /文档/大文件.zip --json # JSON 元信息: {path, localPath, size, md5, remoteMd5,
266
+ # md5Match, md5Obfuscated, dlinkExpiry, verified,
267
+ # skipped, resumed, avgSpeedBps}
268
+ ```
269
+
270
+ - **size 校验**(默认开启,`--no-verify-size` 可关):下载后比对远端/本地字节数,0 字节或大小不符即报错并**保留文件供排查**
271
+ - **断点续传**:curl 有界 Range 分块下载(4MB/块,实测部分 CDN 节点只接受 ≤5MB 的有界 Range,无界请求会 403),每块失败自动**换新 dlink 重试**;中断后重跑同一命令即从断点继续
272
+ - **并发分块**:大文件(>32MB)默认 3 路并发分块(`--concurrency 1` 可回串行)。实测百度对非 SVIP 是**账号级限速**,并发无法突破总量限速,但多 CDN 节点并行能提升稳定性(坏节点/单连接抖动不影响整体)
273
+ - **md5 软校验**:百度 `/api/list` 返回的 md5 是**混淆键**(含 `o`/`t` 等非 hex 字符,非内容哈希),无法作为完整性依据;CLI 计算本地 md5 供流水线比对,`md5Obfuscated:true` 标注远端不可信
274
+ - **默认保存位置**:`-o` 指定目录,否则当前目录(与 `gdownload` 一致)
275
+ - 目录下载 / 获取 dlink 失败等边界场景自动回退 BaiduPCS-Go 引擎(无校验/续传)
276
+
277
+ ### 多账号 profile(v1.3.0)
278
+
279
+ 多个百度账号切换,认证字段按 profile 隔离(pcsPath/ua 等配置保持全局):
280
+
281
+ ```
282
+ bdp --profile svip login --bduss X --stoken Y # 登录到 svip profile
283
+ bdp profile list # 列出所有 profile
284
+ bdp --profile svip quota # 用 svip 账号执行命令
285
+ bdp login --profile 备份 ... # --profile 也可放命令后
286
+ bdp profile unset # 切回全局账号
287
+ ```
288
+
289
+ - 存储在 `~/.bdp/config.json` 的 `profiles` + `activeProfile` 字段;无 profile 时行为与旧版完全一致
290
+ - `bdp whoami` 会显示当前 profile
291
+
292
+ ### 容量管理(v1.6.0)
293
+
294
+ 网盘容量见底时的排查三件套(百度无服务端目录大小接口,`du` 走 /api/list 并发遍历):
295
+
296
+ ```
297
+ bdp quota # 总/已用/剩余(实测 99.78% 时优先排查下面两项)
298
+ bdp recycle list # 回收站:删除的文件保留 60 天仍占容量,先看这里
299
+ bdp recycle restore <fs_id>... # 还原误删
300
+ bdp recycle clean # 清空回收站释放容量(不可恢复,务必确认)
301
+ bdp du / # 顶层目录容量分布(找空间大户)
302
+ bdp du /玄学 --depth 5 --top 20 # 深扫指定目录(深度封顶的子目录标 [深度封顶])
303
+ bdp du / --json # JSON 输出(Agent 可解析)
304
+ ```
305
+
306
+ > 注意:`du` 全盘扫描较慢(API 限制,深度 4 全盘约 10 分钟),建议先顶层后深扫;若 quota 已用量与全盘可见内容差距巨大,优先怀疑**百度扩容/福利空间到期**(总量缩水,历史总量需在网页端空间明细核实)。
307
+
308
+ ## 🤖 Agent 集成示例
309
+
310
+ 所有命令支持 `--json` 输出,适合 AI Agent 直接调用和解析。**Agent 运行时发现用法**:
311
+
312
+ ```bash
313
+ bdp help --json # 全部命令的 usage/desc/options/examples(结构化)
314
+ bdp help get --json # 单个命令的完整定义
315
+ bdp help gsearch --json # 群搜索的全部选项
316
+ ```
317
+
318
+ ```bash
319
+ # Agent 获取群组列表 (JSON)
320
+ bdp groups --json
321
+ # → [{"gid":"539478953581833690","name":"国学文化SVIP13",...}]
322
+
323
+ # Agent 读取文件内容 (JSON)
324
+ bdp head -n 5 /文档/data.csv --json
325
+ # → {"path":"/文档/data.csv","lines":5,"content":["header","row1","row2",...]}
326
+
327
+ # Agent 搜索群文件 (JSON)
328
+ bdp gsearch 539478953581833690 "倪海厦" --json
329
+ # → [{"name":"N 倪海厦","path":"/全店svip200位大师课(共16T)/N 倪海厦","isDir":true,...}]
330
+ ```
331
+
332
+ ### 作为 Node.js 库使用
333
+
334
+ ```javascript
335
+ const { pan, group } = require('baiduwangpan-cli');
336
+
337
+ // 免下载读取文件
338
+ const content = pan.cat('/文档/data.json');
339
+
340
+ // 搜索群聊文件
341
+ const results = await group.searchFiles('539478953581833690', '倪海厦');
342
+ ```
343
+
344
+ ## 🏗️ 架构
345
+
346
+ ```
347
+ ┌─────────────────────────────────────────────────────┐
348
+ │ Agent / 用户 │
349
+ ├─────────────┬───────────────────────────────────────┤
350
+ │ CLI 模式 │ 库模式 (require) │
351
+ │ bdp <cmd> │ const {pan, group} = require() │
352
+ ├─────────────┴───────────────────────────────────────┤
353
+ │ bin/bdp.js │
354
+ │ (统一命令解析 + 路由) │
355
+ ├──────────────────┬──────────────────────────────────┤
356
+ │ lib/pan.js │ lib/group.js │
357
+ │ 全盘文件操作 │ 群聊文件浏览 + 下载 │
358
+ ├──────────────────┼──────────────────────────────────┤
359
+ │ BaiduPCS-Go │ lib/http.js (curl / browser) │
360
+ │ (BDUSS 认证) │ mbox API (逆向) │
361
+ │ locate → dlink │ /mbox/group/listshare │
362
+ │ upload/download │ /mbox/msg/shareinfo │
363
+ │ │ /api/sharedownload → dlink │
364
+ ├──────────────────┴──────────────────────────────────┤
365
+ │ 百度网盘 CDN / API │
366
+ └─────────────────────────────────────────────────────┘
367
+ ```
368
+
369
+ ### 免下载读取原理
370
+
371
+ ```
372
+ bdp cat /文档/报告.txt
373
+ │
374
+ ├── BaiduPCS-Go locate /文档/报告.txt
375
+ │ → 获取 CDN 直链 dlink (有效期 8h)
376
+ │
377
+ ├── curl -r 0-1048575 <dlink>
378
+ │ → HTTP Range 请求,只读取前 1MB
379
+ │ → 百度 CDN 返回 206 Partial Content
380
+ │
381
+ └── stdout 输出文件内容
382
+ → Agent 直接读取,无需下载整个文件
383
+ ```
384
+
385
+ ### 群聊 API 链路(逆向 `/mbox/`)
386
+
387
+ ```
388
+ bdp groups bdp gshares <gid>
389
+ │ │
390
+ ├── /mbox/group/list ├── /mbox/group/listshare
391
+ │ → 获取全部群组 (gid) │ → 获取分享库 (msg_id + from_uk + fs_id)
392
+ │ │ └ has_more=1 时按 last_msg_time 游标翻页
393
+ └───────────────────────────────────┘
394
+ ↓
395
+ bdp gls <gid> <fs_id> bdp gsearch <gid> "关键词"
396
+ │ │
397
+ ├── /mbox/msg/shareinfo ├── 全量遍历: shareinfo 自动翻页 (每页上限 100)
398
+ │ → 浏览文件/子目录 │ → 目录级并发扫描 + 磁盘缓存
399
+ ↓ ↓
400
+ 文件列表 (名称/大小/类型/fs_id) 匹配结果
401
+ ```
402
+
403
+ **逆向实测结论(2026-08)**:
404
+
405
+ - 群聊文件**没有服务端搜索接口**(`listshare`/`shareinfo` 的 `key`/`keyword` 参数被忽略,`/api/search` 不支持群维度)——网页端搜索同样是客户端遍历,`gsearch` 走的是同一条路。
406
+ - `shareinfo` 每页**硬上限 100 条**(`num>100` 不返回更多),`page` 翻页可用 → `gsearch`/`gtree` 自动全页遍历,不再漏数据。
407
+ - 高频调用会触发限流,表现为 `errno=-3`、**self-echo**(`errno=0` 但返回目录自身)、或空列表;工具自动退避重试、连续限流停止扫描,重跑命令即续扫(`--max-requests` 可控制单命令请求预算,默认 400)。
408
+ - 群文件路径可能含**非法百分号编码**(裸 `%`),直接 `decodeURIComponent` 会抛 `URIError` 报废整个目录 → 已改为安全解码。
409
+ - `gsearch`/`gtree`/`gshares` 默认启用**磁盘会话缓存**(目录 30min / 分享 5min,`~/.bdp/cache/`,`--no-cache` 关闭、`bdp cache clear` 清理)——重复搜索秒回,深扫续扫收敛。
410
+
411
+ ## 📁 项目结构
412
+
413
+ ```
414
+ baiduwangpan-cli/
415
+ ├── package.json # npm 配置 (bin: bdp,唯一入口)
416
+ ├── bin/
417
+ │ └── bdp.js # CLI 入口 (统一命令解析 + 命令注册表)
418
+ ├── lib/
419
+ │ ├── index.js # 库导出
420
+ │ ├── config.js # 配置管理 (~/.bdp/config.json,含多账号 profile)
421
+ │ ├── http.js # 网页 API 双传输 (curl / browser)
422
+ │ ├── browser-login.js # 浏览器登录、持久 profile 与 CDP 请求
423
+ │ ├── pan.js # 网盘操作 (BaiduPCS-Go 桥接 + 直链分块下载)
424
+ │ ├── group.js # 群聊操作 (逆向 mbox API)
425
+ │ ├── pcs-extra.js # 引擎扩展命令 (mv/cp/quota/offline/share)
426
+ │ ├── name-match.js # 文件名匹配 (glob/正则/AND/OR)
427
+ │ ├── table.js # pcstable 表格解析 (CJK 显示宽对齐)
428
+ │ ├── file-type.js # 二进制文件类型识别 (魔数)
429
+ │ ├── mcp.js # MCP 服务器 (stdio, JSON-RPC 2.0)
430
+ │ └── console.js # Windows 控制台编码兜底 (chcp 65001)
431
+ ├── test/ # Node.js 回归测试
432
+ ├── skills/
433
+ │ └── baiduwangpan/ # Agent Skill 源文件 (SKILL.md + reference + scripts)
434
+ └── baiduwangpan-skill.zip # Agent Skill 打包 (Releases 附件)
435
+ ```
436
+
437
+ > **唯一入口**:`bdp` 命令(`bin/bdp.js`)。历史原型 `bdp.py` / `bdp.js` / `bdp-group.js` 已删除(git 历史可查),避免多入口行为不一致。Agent 不确定命令用法时用 `bdp help <命令> --json` 查询。
438
+
439
+ ## 🤖 Agent Skill 使用
440
+
441
+ 本仓库附带一个标准格式的 Agent Skill,让 Claude Code / Codex / OpenClaw / Cursor 等 Agent 通过自然语言操作百度网盘。
442
+
443
+ ### 安装 Skill
444
+
445
+ 从 [Releases](https://github.com/NkAntony777/baiduwangpan-cli/releases) 下载 `baiduwangpan-skill.zip`,或直接复制仓库 `skills/baiduwangpan/` 文件夹:
446
+
447
+ ```bash
448
+ # 各平台 skills 目录
449
+ ~/.claude/skills/ # Claude Code
450
+ ~/.codex/skills/ # Codex CLI
451
+ ~/.config/opencode/skills/ # OpenCode
452
+ # 或对应 Agent 的 skills 目录
453
+ ```
454
+
455
+ ### Skill 使用
456
+
457
+ Agent 加载 skill 后,自然语言即可驱动(skill 会自动触发):
458
+
459
+ ```
460
+ 用户: 看看我网盘里有什么
461
+ 用户: 在群里找倪海厦的资料
462
+ 用户: 读一下 /文档/data.csv 前几行
463
+ 用户: 搜索网盘里所有报告文件
464
+ ```
465
+
466
+ skill 会自动执行 `bdp` 命令并返回结构化结果(含 `--json` 输出)。
467
+
468
+ ### Skill 内容
469
+
470
+ ```
471
+ skills/baiduwangpan/
472
+ ├── SKILL.md # 技能定义(触发规则 + 命令规范 + 安全边界)
473
+ ├── reference/
474
+ │ ├── commands.md # 完整命令参考
475
+ │ ├── authentication.md # 凭证获取与配置
476
+ │ ├── examples.md # Agent 使用示例 + JSON 输出格式
477
+ │ └── troubleshooting.md # 故障排查
478
+ └── scripts/
479
+ ├── setup.sh # macOS/Linux 自动安装
480
+ └── setup.ps1 # Windows 自动安装
481
+ ```
482
+
483
+ ## ⚠️ 注意事项
484
+
485
+ - **BDUSS 有效期**:Cookie 会过期,失效后重新执行 `bdp login`
486
+ - **下载限速**:非 SVIP 用户下载受百度限速策略限制
487
+ - **cat 限制**:为防止误读超大文件,`cat` 默认限制 1MB,可通过 `BDP_MAX_CAT_BYTES` 环境变量调整
488
+ - **群聊文件**:群聊 API 为逆向获取,可能随百度服务端变更而失效
489
+ - **share list**:v1.7.0 起改走网页 API(BaiduPCS-Go v4.0.1 引擎的 `share list` 有 panic bug,网页 API 正常)
490
+ - **rm 高危**:非交互环境(Agent/管道)执行 `bdp rm` 必须显式加 `--yes`,否则拒绝执行并返回退出码 1;交互终端会弹 y/N 确认
491
+ - **config 脱敏**:`bdp config` / `bdp config --json` 默认对 BDUSS/STOKEN 脱敏(`"redacted": true`),仅 `--show-secrets` 才输出原值
492
+ - **du 的 size 可能偏小**:百度没有服务端目录大小接口,`du` 靠递归求和,默认只扫 3 层;JSON 里 `partial: true` 表示因深度封顶而不完整,**实际占用以 `bdp quota` 为准**
493
+ - **PowerShell 中文乱码**:CLI 启动时自动 `chcp 65001`(仅 TTY 且非 UTF-8 代码页时),中文正常显示;管道/重定向场景无副作用
494
+ - **1.1.0 升级**:若引擎丢失(postinstall 网络失败),CLI 会自动发现 `BaiduPCS-Go-v*` 版本子目录中的二进制;config 里失效的绝对 `pcsPath` 也会自动回退到自动发现,无需手改配置
495
+
496
+ ## 🤝 致谢
497
+
498
+ - [BaiduPCS-Go](https://github.com/qjfoidnh/BaiduPCS-Go) — 强大的百度网盘 Go 客户端,本工具的底层引擎
499
+ - [hustuhao/bdntoy](https://github.com/hustuhao/bdntoy) — mbox API 逆向参考
500
+ - 所有百度网盘逆向工程社区的贡献者
501
+
502
+ ## 📄 License
503
+
504
+ [MIT](LICENSE)