{"_id":"123pancli","_rev":"2-e6743df89d273c2eb2f5480a5e340aac","name":"123pancli","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"123pancli","version":"1.0.0","keywords":["123pan","123yunpan","cli","tui","cloud-storage"],"license":"MIT","_id":"123pancli@1.0.0","maintainers":[{"name":"memsyslizi","email":"memsyslizi@outlook.com"}],"bin":{"pan123":"dist/cli.js"},"dist":{"shasum":"e40f91f35c83b2f82c7b4cec235bebdd9f3a65c0","tarball":"https://registry.npmjs.org/123pancli/-/123pancli-1.0.0.tgz","fileCount":4,"integrity":"sha512-DHcpuPIOzWZpAoBvJIExMqR7uMxTVnsZPpRZRTpouD9cC1IOMGr0BHVaahdGoNp6RWcg8q5AqJLiwXFjiOHEeg==","signatures":[{"sig":"MEUCIQDb3Cw9hEikRs0j2Aumvuc5Hx0vlyetxoBJEc/8jnLjvgIgDxMiZQr4P6Yyf+BOd3FhcceUa0FmB62Hk/y3e5ZTdy0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115684},"type":"module","_from":"file:123pancli-1.0.0.tgz","engines":{"node":">=18"},"scripts":{"dev":"tsx src/cli.tsx","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"memsyslizi","email":"memsyslizi@outlook.com"},"_resolved":"C:\\Users\\LK130\\AppData\\Local\\Temp\\65a056bcd81da7398bf01ad27dc47dba\\123pancli-1.0.0.tgz","_integrity":"sha512-DHcpuPIOzWZpAoBvJIExMqR7uMxTVnsZPpRZRTpouD9cC1IOMGr0BHVaahdGoNp6RWcg8q5AqJLiwXFjiOHEeg==","_npmVersion":"11.9.0","description":"A Node.js CLI and Ink TUI for 123Pan.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ink":"^6.5.1","zod":"^4.1.13","react":"^19.2.1","commander":"^14.0.2","string-width":"^8.2.1","ink-text-input":"^6.0.0","chest123-pan-sdk":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.0.14","typescript":"^5.9.3","@types/node":"^24.10.1","@types/react":"^19.2.7"},"_npmOperationalInternal":{"tmp":"tmp/123pancli_1.0.0_1780284038089_0.10168864234639474","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"123pancli","version":"1.1.0","description":"A Node.js CLI and Ink TUI for 123Pan.","type":"module","bin":{"pan123":"dist/cli.js"},"scripts":{"build":"tsup","dev":"tsx src/cli.tsx","prepack":"pnpm run build","test":"vitest run","typecheck":"tsc --noEmit"},"engines":{"node":">=18"},"dependencies":{"commander":"^14.0.2","ink":"^6.5.1","ink-text-input":"^6.0.0","react":"^19.2.1","string-width":"^8.2.1","zod":"^4.1.13"},"devDependencies":{"@types/node":"^24.10.1","@types/react":"^19.2.7","tsup":"^8.5.1","tsx":"^4.21.0","typescript":"^5.9.3","vitest":"^4.0.14"},"keywords":["123pan","123yunpan","cli","tui","cloud-storage"],"license":"MIT","gitHead":"f47949c5b1ecf46724dc66098f40cca5822584f6","_id":"123pancli@1.1.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-bQuuW+Iz2dJyvKTxFgZSEplZti6BU6/NiJy/4zYVki1LbYlpXWcegw9HvU4YrKaNAFUJf0aUlE8//yP7j6z1ag==","shasum":"13c5391a4b47132722905fc979e45da725a1ee67","tarball":"https://registry.npmjs.org/123pancli/-/123pancli-1.1.0.tgz","fileCount":4,"unpackedSize":181731,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDLermgKYU80dFObQaHmsEYtbdmxz/8zdGL+/bdA7uVwgIgQ6XrldGtZi/cL2hvXQQPXgnQDhd7mKM5bH19d9sI/r8="}]},"_npmUser":{"name":"memsyslizi","email":"memsyslizi@outlook.com"},"directories":{},"maintainers":[{"name":"memsyslizi","email":"memsyslizi@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/123pancli_1.1.0_1781229817202_0.1998195219779888"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-01T03:20:37.887Z","modified":"2026-06-12T02:03:37.486Z","1.0.0":"2026-06-01T03:20:38.254Z","1.1.0":"2026-06-12T02:03:37.374Z"},"license":"MIT","keywords":["123pan","123yunpan","cli","tui","cloud-storage"],"description":"A Node.js CLI and Ink TUI for 123Pan.","maintainers":[{"name":"memsyslizi","email":"memsyslizi@outlook.com"}],"readme":"# 123PanCLi\n\n`123PanCLi` 是一个 123 云盘终端工具，提供 `pan123` 命令和 Ink TUI。它适合两类场景：\n\n- 人在终端里打开 TUI 浏览、上传、下载、分享文件。\n- 其他项目通过命令行调用 123 云盘上传/下载能力，避免每个项目重复写 123 云盘接口。\n\n要求 Node.js `>= 18`。\n\n## 安装\n\n全局安装：\n\n```bash\nnpm i -g 123pancli\n```\n\n安装后主命令：\n\n```bash\npan123\n```\n\n本地开发：\n\n```bash\npnpm install\npnpm run build\nnode dist/cli.js\n```\n\n## 配置\n\n主配置文件：\n\n```txt\n~/.123pancli/config.json\n```\n\n首次运行 `pan123` 会进入 TUI 配置向导。也可以用命令写入配置：\n\n```bash\npan123 config set --client-id <PAN123_CLIENT_ID> --client-secret <PAN123_CLIENT_SECRET>\n```\n\n配置文件结构：\n\n```json\n{\n  \"version\": 1,\n  \"clientId\": \"\",\n  \"clientSecret\": \"\",\n  \"baseURL\": \"https://open-api.123pan.com\",\n  \"defaultParentFileId\": 0,\n  \"downloadDir\": \"~/Downloads/123pan\"\n}\n```\n\n`clientSecret` 会明文存储在 `config.json` 中，请保护好 `~/.123pancli` 目录。\n\n临时覆盖配置，不会写回 `config.json`：\n\n```bash\nPAN123_CLIENT_ID=xxx PAN123_CLIENT_SECRET=yyy pan123 ls\npan123 --auth-client-id xxx --auth-client-secret yyy ls\n```\n\n## 输出协议\n\n默认输出给人看。加 `--json` 后，最终结果输出到 `stdout`，结构稳定，适合程序解析。\n\n成功：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {}\n}\n```\n\n失败：\n\n```json\n{\n  \"ok\": false,\n  \"error\": {\n    \"message\": \"错误信息\",\n    \"code\": 401,\n    \"traceId\": \"trace-id\",\n    \"status\": 401\n  }\n}\n```\n\n需要进度时，加 `--progress-json`。进度会输出到 `stderr`，一行一个 JSON，最终结果仍然输出到 `stdout`。\n\n```bash\npan123 --json --progress-json upload ./app.zip --parent 0\npan123 --json --progress-json download 123456 --out ./downloads\n```\n\n进度事件示例：\n\n```json\n{\"ok\":true,\"type\":\"progress\",\"command\":\"download\",\"loadedBytes\":1048576,\"totalBytes\":10485760,\"percent\":10}\n```\n\n注意：\n\n- 下载进度是字节级进度。服务端返回 `content-length` 时有 `percent`，否则只有 `loadedBytes`。\n- 上传进度来自 `chest123-pan-sdk`。小文件单步上传目前只暴露阶段进度，例如 `hashing 100%`、`single 100%`；大文件分片上传会有分片进度，但不是完整网络字节级进度。\n\n## 全局参数\n\n这些参数放在子命令前面：\n\n```bash\npan123 [全局参数] <command>\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `--json` | 最终结果以 JSON 输出到 `stdout` |\n| `--progress-json` | 进度事件以 JSON Lines 输出到 `stderr` |\n| `--auth-client-id <id>` | 临时覆盖 `clientId` |\n| `--auth-client-secret <secret>` | 临时覆盖 `clientSecret` |\n| `--base-url <url>` | 临时覆盖 API 基础地址 |\n| `-V, --version` | 显示版本 |\n| `-h, --help` | 显示帮助 |\n\n示例：\n\n```bash\npan123 --json ls 0\npan123 --json --progress-json upload ./app.zip --parent 0\n```\n\n## TUI\n\n启动 TUI：\n\n```bash\npan123\n```\n\n强制进入配置向导：\n\n```bash\npan123 init\n```\n\nTUI 快捷键：\n\n| 快捷键 | 说明 |\n| --- | --- |\n| `↑` / `↓` / `j` / `k` | 移动选择 |\n| `enter` | 打开选中文件夹 |\n| `h` / `backspace` | 返回上级 |\n| `r` | 刷新 |\n| `u` | 上传文件 |\n| `m` | 新建目录 |\n| `d` | 下载选中文件 |\n| `s` | 分享选中文件 |\n| `l` | 获取选中文件直链 |\n| `q` | 退出 |\n\n## 配置命令\n\n### `pan123 config path`\n\n输出配置文件路径。\n\n```bash\npan123 config path\npan123 --json config path\n```\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": \"C:\\\\Users\\\\LK130\\\\.123pancli\\\\config.json\"\n}\n```\n\n### `pan123 config show`\n\n显示当前配置，`clientSecret` 会被遮罩。\n\n```bash\npan123 config show\npan123 --json config show\n```\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"version\": 1,\n    \"clientId\": \"your-client-id\",\n    \"clientSecret\": \"abcd****wxyz\",\n    \"baseURL\": \"https://open-api.123pan.com\",\n    \"defaultParentFileId\": 0,\n    \"downloadDir\": \"~/Downloads/123pan\"\n  }\n}\n```\n\n### `pan123 config set`\n\n写入配置。\n\n```bash\npan123 config set --client-id <id> --client-secret <secret>\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `--client-id <id>` | 是 | 123 云盘开放平台 clientId |\n| `--client-secret <secret>` | 是 | 123 云盘开放平台 clientSecret |\n| `--base-url <url>` | 否 | API 基础地址，默认 `https://open-api.123pan.com` |\n| `--download-dir <path>` | 否 | 默认下载目录，默认 `~/Downloads/123pan` |\n| `--default-parent-file-id <id>` | 否 | 默认上传目录，默认 `0` |\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"path\": \"C:\\\\Users\\\\LK130\\\\.123pancli\\\\config.json\",\n    \"config\": {\n      \"version\": 1,\n      \"clientId\": \"your-client-id\",\n      \"clientSecret\": \"abcd****wxyz\",\n      \"baseURL\": \"https://open-api.123pan.com\",\n      \"defaultParentFileId\": 0,\n      \"downloadDir\": \"~/Downloads/123pan\"\n    }\n  }\n}\n```\n\n### `pan123 config test`\n\n测试配置是否可用，会调用 `client.user.info()`。\n\n```bash\npan123 config test\npan123 --json config test\n```\n\nJSON 返回：123 云盘用户信息，字段由官方接口返回。\n\n## 文件列表\n\n### `pan123 ls [parentFileId]`\n\n列出文件夹内容。`parentFileId` 不传时默认 `0`。\n\n```bash\npan123 ls\npan123 ls 0\npan123 ls 38421550 --limit 100\npan123 ls 0 --search \"setup\"\npan123 --json ls 0\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `[parentFileId]` | 否 | 父目录 ID，根目录为 `0` |\n| `--limit <n>` | 否 | 每页数量，默认 `100` |\n| `--search <text>` | 否 | 搜索关键字 |\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"lastFileId\": -1,\n    \"fileList\": [\n      {\n        \"fileID\": 38421689,\n        \"filename\": \"app.exe\",\n        \"type\": 0,\n        \"size\": 123456,\n        \"etag\": \"md5\",\n        \"parentFileID\": 38421550,\n        \"trashed\": 0\n      }\n    ]\n  }\n}\n```\n\n说明：\n\n- `type: 0` 表示文件。\n- `type: 1` 表示文件夹。\n- CLI 会过滤掉 `trashed === 1` 的文件。\n\n## 创建目录\n\n### `pan123 mkdir <name> --parent <fileId>`\n\n创建云盘目录。\n\n```bash\npan123 mkdir \"assets\" --parent 0\npan123 --json mkdir \"assets\" --parent 38421550\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `<name>` | 是 | 目录名 |\n| `--parent <fileId>` | 是 | 父目录 ID |\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"dirID\": 38421550\n  }\n}\n```\n\n## 上传文件\n\n### `pan123 upload <path>`\n\n上传本地文件到 123 云盘。\n\n```bash\npan123 upload \"C:\\Users\\LK130\\Desktop\\app.exe\" --parent 38421550\npan123 upload \"./app.zip\" --parent 0 --name \"release.zip\"\npan123 upload \"./app.zip\" --parent 0 --overwrite\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `<path>` | 是 | 本地文件路径 |\n| `--parent <fileId>` | 否 | 上传到哪个目录。不传时使用 `config.json` 的 `defaultParentFileId` |\n| `--name <name>` | 否 | 上传后的云盘文件名。不传时使用本地文件名 |\n| `--overwrite` | 否 | 同名文件覆盖。默认保留两者 |\n\n普通模式会在 `stderr` 显示阶段进度：\n\n```txt\n上传阶段 hashing 100.0%\n上传阶段 single 100.0%\n```\n\nJSON 调用：\n\n```bash\npan123 --json upload \"C:\\Users\\LK130\\Desktop\\app.exe\" --parent 38421550\n```\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"fileID\": 38421689,\n    \"completed\": true,\n    \"reuse\": false\n  }\n}\n```\n\n字段说明：\n\n| 字段 | 说明 |\n| --- | --- |\n| `fileID` | 上传成功后的云盘文件 ID |\n| `completed` | 是否上传完成 |\n| `reuse` | 是否秒传。不是每次都有 |\n\n带机器可读进度：\n\n```bash\npan123 --json --progress-json upload \"C:\\Users\\LK130\\Desktop\\app.exe\" --parent 38421550\n```\n\n`stderr` 进度事件示例：\n\n```json\n{\"ok\":true,\"type\":\"progress\",\"command\":\"upload\",\"stage\":\"hashing\",\"loadedBytes\":0,\"totalBytes\":10485760,\"percent\":0}\n{\"ok\":true,\"type\":\"progress\",\"command\":\"upload\",\"stage\":\"hashing\",\"loadedBytes\":10485760,\"totalBytes\":10485760,\"percent\":100}\n{\"ok\":true,\"type\":\"progress\",\"command\":\"upload\",\"stage\":\"single\",\"loadedBytes\":10485760,\"totalBytes\":10485760,\"percent\":100}\n```\n\n分片上传时可能包含：\n\n```json\n{\"ok\":true,\"type\":\"progress\",\"command\":\"upload\",\"stage\":\"slice\",\"loadedBytes\":5242880,\"totalBytes\":10485760,\"percent\":50,\"sliceNo\":1,\"totalSlices\":2,\"completedSlices\":1}\n```\n\n重要说明：\n\n- 当前上传进度由 `chest123-pan-sdk` 提供。\n- 小文件单步上传没有真实网络字节级进度，只能看到阶段变化。\n- 大文件分片上传会按分片完成推进。\n- 最终结果在 `stdout`，进度事件在 `stderr`。\n\nNode.js 调用示例：\n\n```js\nimport { spawn } from 'node:child_process';\n\nconst child = spawn('pan123', [\n  '--json',\n  '--progress-json',\n  'upload',\n  'C:\\\\Users\\\\LK130\\\\Desktop\\\\app.exe',\n  '--parent',\n  '38421550'\n]);\n\nlet result = '';\n\nchild.stdout.on('data', chunk => {\n  result += chunk.toString();\n});\n\nchild.stderr.on('data', chunk => {\n  for (const line of chunk.toString().trim().split(/\\r?\\n/)) {\n    if (!line) continue;\n    const event = JSON.parse(line);\n    if (event.type === 'progress') {\n      console.log('上传进度:', event);\n    }\n  }\n});\n\nchild.on('close', code => {\n  const finalResult = JSON.parse(result);\n  console.log(code, finalResult);\n});\n```\n\n## 下载文件\n\n### `pan123 download <fileId>`\n\n下载云盘文件到本地。\n\n```bash\npan123 download 38421689 --out \"C:\\Users\\LK130\\Downloads\"\npan123 download 38421689 --out \"C:\\Users\\LK130\\Downloads\\app.exe\"\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `<fileId>` | 是 | 要下载的文件 ID |\n| `--out <path>` | 否 | 输出目录或完整文件路径。不传时使用 `config.json` 的 `downloadDir` |\n\n普通模式会在 `stderr` 显示下载进度：\n\n```txt\n正在下载 37.2%\n```\n\nJSON 调用：\n\n```bash\npan123 --json download 38421689 --out \"C:\\Users\\LK130\\Downloads\"\n```\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"path\": \"C:\\\\Users\\\\LK130\\\\Downloads\\\\app.exe\",\n    \"bytes\": 10485760\n  }\n}\n```\n\n字段说明：\n\n| 字段 | 说明 |\n| --- | --- |\n| `path` | 本地保存路径 |\n| `bytes` | 实际写入的字节数 |\n\n带机器可读进度：\n\n```bash\npan123 --json --progress-json download 38421689 --out \"C:\\Users\\LK130\\Downloads\"\n```\n\n`stderr` 进度事件示例：\n\n```json\n{\"ok\":true,\"type\":\"progress\",\"command\":\"download\",\"loadedBytes\":1048576,\"totalBytes\":10485760,\"percent\":10}\n{\"ok\":true,\"type\":\"progress\",\"command\":\"download\",\"loadedBytes\":5242880,\"totalBytes\":10485760,\"percent\":50}\n{\"ok\":true,\"type\":\"progress\",\"command\":\"download\",\"loadedBytes\":10485760,\"totalBytes\":10485760,\"percent\":100}\n```\n\n如果服务端没有返回文件总大小，事件可能没有 `totalBytes` 和 `percent`：\n\n```json\n{\"ok\":true,\"type\":\"progress\",\"command\":\"download\",\"loadedBytes\":1048576}\n```\n\nNode.js 调用示例：\n\n```js\nimport { spawn } from 'node:child_process';\n\nconst child = spawn('pan123', [\n  '--json',\n  '--progress-json',\n  'download',\n  '38421689',\n  '--out',\n  'C:\\\\Users\\\\LK130\\\\Downloads'\n]);\n\nlet result = '';\n\nchild.stdout.on('data', chunk => {\n  result += chunk.toString();\n});\n\nchild.stderr.on('data', chunk => {\n  for (const line of chunk.toString().trim().split(/\\r?\\n/)) {\n    if (!line) continue;\n    const event = JSON.parse(line);\n    if (event.type === 'progress') {\n      console.log('下载进度:', event);\n    }\n  }\n});\n\nchild.on('close', code => {\n  const finalResult = JSON.parse(result);\n  console.log(code, finalResult);\n});\n```\n\n## 分享\n\n### `pan123 share create <fileIds...>`\n\n创建普通分享链接。\n\n```bash\npan123 share create 38421689 --name \"测试分享\" --expire 7\npan123 share create 38421689 38421690 --name \"批量分享\" --expire 0 --pwd 1234\npan123 --json share create 38421689 --name \"测试分享\" --expire 7\n```\n\n参数：\n\n| 参数 | 必填 | 说明 |\n| --- | --- | --- |\n| `<fileIds...>` | 是 | 一个或多个文件 ID |\n| `--name <name>` | 否 | 分享名称。默认 `pan123-YYYY-MM-DD` |\n| `--expire <days>` | 否 | 有效期，可选 `1`、`7`、`30`、`0`，默认 `7`，`0` 表示永久 |\n| `--pwd <code>` | 否 | 提取码 |\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"shareID\": 123456,\n    \"shareKey\": \"abcdef\"\n  }\n}\n```\n\n返回字段由 123 云盘官方接口决定，通常包含 `shareID` 和 `shareKey`。\n\n## 直链\n\n### `pan123 direct-link enable <folderId>`\n\n启用某个文件夹的直链空间。\n\n```bash\npan123 direct-link enable 38421550\npan123 --json direct-link enable 38421550\n```\n\nJSON 返回：官方接口返回的数据，通常包含启用成功的文件夹信息。\n\n### `pan123 direct-link disable <folderId>`\n\n禁用某个文件夹的直链空间。\n\n```bash\npan123 direct-link disable 38421550\npan123 --json direct-link disable 38421550\n```\n\nJSON 返回：官方接口返回的数据。\n\n### `pan123 direct-link url <fileId>`\n\n获取文件直链。\n\n```bash\npan123 direct-link url 38421689\npan123 --json direct-link url 38421689\n```\n\n如果提示未启用直链空间，先启用文件所在目录：\n\n```bash\npan123 direct-link enable 38421550\npan123 direct-link url 38421689\n```\n\nJSON 返回：\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"url\": \"https://...\"\n  }\n}\n```\n\n## 常见组合命令\n\n上传到指定目录：\n\n```bash\npan123 upload \"C:\\Users\\LK130\\Desktop\\adofaimusicbox_1.0.0_x64-setup.exe\" --parent 38421550\n```\n\n下载指定文件：\n\n```bash\npan123 download 38421689 --out \"C:\\Users\\LK130\\Downloads\"\n```\n\n获取直链：\n\n```bash\npan123 direct-link url 38421689\n```\n\n给程序调用并监听进度：\n\n```bash\npan123 --json --progress-json upload \"C:\\Users\\LK130\\Desktop\\app.exe\" --parent 38421550\npan123 --json --progress-json download 38421689 --out \"C:\\Users\\LK130\\Downloads\"\n```\n\n## 开发\n\n```bash\npnpm install\npnpm run typecheck\npnpm test\npnpm run build\n```\n","readmeFilename":"README.md"}