{"id":"a72ddcde-3758-4b6d-9da8-eff889158534","entityType":"agent","slug":"clawhub-langhuachuanshi-qiniu-kodo","name":"qiniu-kodo","canonicalUrl":"https://www.xpersona.co/agent/clawhub-langhuachuanshi-qiniu-kodo","canonicalPath":"/agent/clawhub-langhuachuanshi-qiniu-kodo","generatedAt":"2026-10-10T22:48:58.126Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":null},"description":"七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Skill: qiniu-kodo Owner: langhuachuanshi Summary: 七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Tags: cloud:1.0.3, kodo:1.0.3, latest:1.0.3, oss:1.0.3, qiniu:1.0.3, storage:1.0.3 Version history: v1.0.3 | 2026-03-06T17:10:15.394Z | auto Version 1.0.3 of qiniu-kodo - No file changes detected in this release. - Documentation, features, and dependencies remain unchanged. v1.0.2 |","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s172yjpf05bfj3wjfrwx88v8sx83hf31:qiniu-kodo","sourceUrl":"https://clawhub.ai/langhuachuanshi/qiniu-kodo","homepage":"https://clawhub.ai/langhuachuanshi/skills/qiniu-kodo","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/langhuachuanshi/qiniu-kodo","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/langhuachuanshi/skills/qiniu-kodo","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Skill: qiniu-kodo Owner: langhuachuanshi Summary: 七牛云 KODO 对象存储技能。支持文件上传、"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":null},"stars":null,"forks":null,"downloads":1266,"packageName":null,"latestVersion":"1.0.3","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T20:28:31.064Z","lastCrawledAt":"2026-10-10T20:28:31.064Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T20:28:31.064Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.3","createdAt":"2026-03-06T17:10:15.394Z","changelog":"Version 1.0.3 of qiniu-kodo - No file changes detected in this release. - Documentation, features, and dependencies remain unchanged.","fileCount":9,"zipByteSize":14910},{"version":"1.0.2","createdAt":"2026-03-06T15:55:19.405Z","changelog":"- Minor updates in code or script (see scripts/qiniu_node.mjs for details). - No user-facing or documentation changes in this version.","fileCount":8,"zipByteSize":13552},{"version":"1.0.1","createdAt":"2026-03-06T15:47:01.231Z","changelog":"qiniu-kodo v1.0.1 - Initial public release with three-layer architecture: MCP tool, Node.js SDK, and qshell CLI. - Added concise Quick Start and troubleshooting sections. - Provided usage examples for upload, list, download, delete, and URL retrieval. - Introduced config file format, regional codes, and basic API command table. - Included installation requirements and metadata.","fileCount":8,"zipByteSize":13608},{"version":"1.0.0","createdAt":"2026-03-01T23:18:50.287Z","changelog":"Initial release - MCP + Node.js SDK + qshell three-tier fallback strategy, complete documentation and examples","fileCount":7,"zipByteSize":16641}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s172yjpf05bfj3wjfrwx88v8sx83hf31:qiniu-kodo","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T22:48:58.126Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-langhuachuanshi-qiniu-kodo/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":null},"readme":"Skill: qiniu-kodo\n\nOwner: langhuachuanshi\n\nSummary: 七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。\n\nTags: cloud:1.0.3, kodo:1.0.3, latest:1.0.3, oss:1.0.3, qiniu:1.0.3, storage:1.0.3\n\nVersion history:\n\nv1.0.3 | 2026-03-06T17:10:15.394Z | auto\n\nVersion 1.0.3 of qiniu-kodo\n\n- No file changes detected in this release.\n- Documentation, features, and dependencies remain unchanged.\n\nv1.0.2 | 2026-03-06T15:55:19.405Z | auto\n\n- Minor updates in code or script (see scripts/qiniu_node.mjs for details).\n- No user-facing or documentation changes in this version.\n\nv1.0.1 | 2026-03-06T15:47:01.231Z | auto\n\nqiniu-kodo v1.0.1\n\n- Initial public release with three-layer architecture: MCP tool, Node.js SDK, and qshell CLI.\n- Added concise Quick Start and troubleshooting sections.\n- Provided usage examples for upload, list, download, delete, and URL retrieval.\n- Introduced config file format, regional codes, and basic API command table.\n- Included installation requirements and metadata.\n\nv1.0.0 | 2026-03-01T23:18:50.287Z | user\n\nInitial release - MCP + Node.js SDK + qshell three-tier fallback strategy, complete documentation and examples\n\nArchive index:\n\nArchive v1.0.3: 9 files, 14910 bytes\n\nFiles: _meta.json (129b), config/qiniu-config.example.json (329b), docs/EXAMPLES.md (6728b), package.json (428b), README.md (1144b), scripts/qiniu_node.mjs (14257b), scripts/setup.sh (11772b), skill-card.md (2588b), SKILL.md (3605b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: qiniu-kodo\ndescription: |\n  七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。\n  三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"☁️\",\n        \"requires\": { \"bins\": [\"node\", \"python3\", \"pip3\"], \"packages\": [\"qiniu\", \"qiniu-mcp-server\"] },\n        \"install\":\n          [\n            { \"id\": \"qiniu-sdk\", \"kind\": \"node\", \"package\": \"qiniu\", \"label\": \"Install qiniu Node.js SDK\" },\n            { \"id\": \"qiniu-mcp\", \"kind\": \"python\", \"package\": \"qiniu-mcp-server\", \"label\": \"Install qiniu-mcp-server\" },\n          ],\n      },\n  }\n---\n\n# ☁️ 七牛云 KODO 技能\n\n通过 **MCP 工具** / **Node.js SDK** / **qshell CLI** 管理七牛云对象存储。\n\n---\n\n## 🎯 执行策略（三层降级）\n\n| 优先级 | 工具 | 使用场景 |\n|--------|------|----------|\n| **1** | `qiniu-mcp-server` | 功能最全，优先使用 |\n| **2** | Node.js SDK | MCP 不可用时降级 |\n| **3** | qshell CLI | 最后备选 |\n\n---\n\n## 🚀 快速开始\n\n### 1. 安装依赖\n\n```bash\n# 进入技能目录\ncd ~/.openclaw/workspace/skills/qiniu-kodo\n\n# 运行自动安装\nbash scripts/setup.sh\n```\n\n### 2. 配置凭证\n\n```bash\nbash scripts/setup.sh \\\n  --access-key \"YOUR_ACCESS_KEY\" \\\n  --secret-key \"YOUR_SECRET_KEY\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\"\n```\n\n### 3. 测试连接\n\n```bash\nnode scripts/qiniu_node.mjs test-connection\n```\n\n---\n\n## 📋 使用示例\n\n### 上传文件\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\"\n```\n\n### 列出文件\n\n```bash\nnode scripts/qiniu_node.mjs list --prefix \"uploads/\" --limit 100\n```\n\n### 下载文件\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/save.txt\"\n```\n\n### 删除文件\n\n```bash\nnode scripts/qiniu_node.mjs delete --key \"uploads/file.txt\" --force\n```\n\n### 获取文件 URL\n\n```bash\n# 公开空间\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\"\n\n# 私有空间（1小时有效）\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\" --private --expires 3600\n```\n\n---\n\n## 🔧 Node.js SDK API\n\n| 命令 | 说明 |\n|------|------|\n| `upload --local <path> --key <key>` | 上传文件 |\n| `download --key <key> --local <path>` | 下载文件 |\n| `list [--prefix <p>] [--limit <n>]` | 列出文件 |\n| `delete --key <key> [--force]` | 删除文件 |\n| `url --key <key> [--private] [--expires <s>]` | 获取 URL |\n| `stat --key <key>` | 文件信息 |\n| `move --src-key <a> --dest-key <b>` | 移动文件 |\n| `copy --src-key <a> --dest-key <b>` | 复制文件 |\n| `test-connection` | 测试连接 |\n\n---\n\n## ⚙️ 配置文件\n\n**config/qiniu-config.json**\n\n```json\n{\n  \"accessKey\": \"YOUR_ACCESS_KEY\",\n  \"secretKey\": \"YOUR_SECRET_KEY\",\n  \"bucket\": \"mybucket\",\n  \"region\": \"z0\",\n  \"domain\": \"https://cdn.example.com\"\n}\n```\n\n**区域代码**：\n- `z0` - 华东（杭州）\n- `z1` - 华北（河北）\n- `z2` - 华南（广州）\n- `na0` - 北美（洛杉矶）\n- `as0` - 东南亚（新加坡）\n\n---\n\n## 🐛 故障排查\n\n| 问题 | 解决 |\n|------|------|\n| `Cannot find module 'qiniu'` | `npm install qiniu` |\n| `401 Unauthorized` | 检查 AccessKey/SecretKey |\n| `连接超时` | 检查区域代码和网络 |\n\n---\n\n## 📚 相关链接\n\n- [七牛云 MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [qshell 工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n\n---\n\n## 📄 许可证\n\nMIT License\n\nFile v1.0.3:README.md\n\n# ☁️ 七牛云 KODO 技能\n\nOpenClaw 技能，用于管理七牛云对象存储（KODO）。\n\n## ✨ 功能\n\n- 📤 上传文件\n- 📥 下载文件\n- 📋 列出文件\n- 🗑️ 删除文件\n- 🔗 获取文件 URL（支持私有空间签名）\n- 📊 查看文件信息\n- 📁 移动/复制文件\n\n## 🚀 快速开始\n\n```bash\n# 安装依赖\nnpm install\n\n# 配置凭证\nbash scripts/setup.sh --access-key \"xxx\" --secret-key \"xxx\" --region \"z0\" --bucket \"mybucket\"\n\n# 测试连接\nnode scripts/qiniu_node.mjs test-connection\n```\n\n## 📖 使用示例\n\n```bash\n# 上传\nnode scripts/qiniu_node.mjs upload --local file.txt --key uploads/file.txt\n\n# 列出\nnode scripts/qiniu_node.mjs list --prefix uploads/\n\n# 下载\nnode scripts/qiniu_node.mjs download --key uploads/file.txt --local file.txt\n\n# 删除\nnode scripts/qiniu_node.mjs delete --key uploads/file.txt --force\n\n# 获取 URL\nnode scripts/qiniu_node.mjs url --key uploads/file.txt\n```\n\n## 🔧 架构\n\n三层降级策略：\n1. **MCP 工具** (`qiniu-mcp-server`) - 功能最全\n2. **Node.js SDK** (`qiniu`) - 稳定可靠\n3. **qshell CLI** - 官方命令行\n\n## 📄 许可证\n\nMIT\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn78r3ca13npsxrn5f905res8n821ssm\",\n  \"slug\": \"qiniu-kodo\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1772817015394\n}\n\nFile v1.0.3:docs/EXAMPLES.md\n\n# 七牛云 KODO 技能 - 使用示例\n\n本文档包含七牛云 KODO 技能的各种使用示例。\n\n---\n\n## 📤 示例1：上传文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```\n优先级 1：尝试使用 qiniu-mcp MCP 工具\n优先级 2：如果 MCP 不可用，使用 Python SDK\n优先级 3：如果 SDK 也不可用，使用 qshell\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local /backups/daily-20260301.tar.gz \\\n  --key backups/daily-20260301.tar.gz\n```\n\n---\n\n## 📋 示例2：列出文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n### 命令行方式\n\n```bash\n# 列出所有文件\nnode scripts/qiniu_node.mjs list\n\n# 列出指定前缀的文件\nnode scripts/qiniu_node.mjs list --prefix backups/ --limit 50\n\n# JSON 格式输出\nnode scripts/qiniu_node.mjs list --prefix backups/ --format json\n```\n\n---\n\n## 🔗 示例3：获取文件 URL\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n### 命令行方式\n\n```bash\n# 公开空间 URL\nnode scripts/qiniu_node.mjs url --key images/photo.jpg\n\n# 私有空间 URL（1小时有效）\nnode scripts/qiniu_node.mjs url --key documents/report.pdf --private --expires 3600\n```\n\n---\n\n## 🗑️ 示例4：删除文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n删除七牛云上的 old-backup.tar.gz\n```\n\n**AI 执行：**\n```\n1. 先确认：是否真的要删除？\n2. 用户确认后执行删除\n```\n\n**返回：**\n```\n✅ 删除成功！\n\n文件：old-backup.tar.gz\n```\n\n### 命令行方式\n\n```bash\n# 删除单个文件（需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz\n\n# 强制删除（不需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz --force\n\n# 批量删除\ncat > delete-list.txt << EOF\nbackups/backup-20260101.tar.gz\nbackups/backup-20260102.tar.gz\nEOF\n\nnode scripts/qiniu_node.mjs batch-delete --file delete-list.txt\n```\n\n---\n\n## 📊 示例5：获取文件信息\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n查看 documents/report.pdf 的详细信息\n```\n\n**返回：**\n```\n📊 文件信息：\n\n文件名：documents/report.pdf\n大小：2.5 MB\n类型：application/pdf\nHash：FhGxK...（文件哈希值）\n修改时间：2026-03-01 15:30:00\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs stat --key documents/report.pdf\n```\n\n---\n\n## 📥 示例6：下载文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n从七牛云下载 documents/report.pdf 到本地\n```\n\n**返回：**\n```\n✅ 下载成功！\n\n文件：documents/report.pdf\n大小：2.5 MB\n保存到：/downloads/report.pdf\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key documents/report.pdf \\\n  --local /downloads/report.pdf\n```\n\n---\n\n## 🔄 示例7：移动和复制文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 temp/file.txt 移动到 archive/file.txt\n```\n\n**返回：**\n```\n✅ 文件已移动\n\n原路径：temp/file.txt\n新路径：archive/file.txt\n```\n\n### 命令行方式（需要扩展）\n\n```bash\n# 移动文件（需要扩展 Python 脚本）\n# 复制文件（需要扩展 Python 脚本）\n```\n\n---\n\n## 🖼️ 示例8：图片处理（需要 MCP）\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```\n使用 qiniu-mcp MCP 工具进行图片处理\n（需要 MCP 工具支持）\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://your-domain.com/images/photo.jpg\n处理后：http://your-domain.com/images/photo.jpg?imageView2/1/w/800/h/600|watermark/...\n```\n\n---\n\n## 🤖 示例9：自动化备份脚本\n\n### 完整脚本\n\n```bash\n#!/bin/bash\n\n# 每日备份脚本\nBACKUP_DIR=\"/backups\"\nDATE=$(date +%Y%m%d)\nBACKUP_FILE=\"backup-${DATE}.tar.gz\"\n\n# 1. 创建备份\necho \"📦 创建备份...\"\ntar -czf \"${BACKUP_DIR}/${BACKUP_FILE}\" /data\n\n# 2. 上传到七牛云\necho \"📤 上传到七牛云...\"\ncd /home/node/.openclaw/workspace/skills/qiniu-kodo\nnode scripts/qiniu_node.mjs upload \\\n  --local \"${BACKUP_DIR}/${BACKUP_FILE}\" \\\n  --key \"backups/${BACKUP_FILE}\"\n\n# 3. 清理本地旧备份（保留7天）\necho \"🗑️  清理旧备份...\"\nfind ${BACKUP_DIR} -name \"backup-*.tar.gz\" -mtime +7 -delete\n\n# 4. 清理云端旧备份（保留30天）\necho \"🗑️  清理云端旧备份...\"\npython -c \"\nfrom scripts.qiniu_python import QiniuKodo\nfrom datetime import datetime, timedelta\n\nkodo = QiniuKodo()\ncutoff = datetime.now() - timedelta(days=30)\n\nfor file in kodo.list_files(prefix='backups/'):\n    if datetime.fromtimestamp(file['mtime']) < cutoff:\n        kodo.delete(file['key'])\n        print(f'已删除: {file[\\\"key\\\"]}')\n\"\n\necho \"✅ 备份完成！\"\n```\n\n---\n\n## 📝 示例10：批量操作\n\n### 批量上传图片\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\nimport os\n\nkodo = QiniuKodo()\n\nimage_dir = \"/path/to/images\"\nuploaded = 0\n\nfor filename in os.listdir(image_dir):\n    if filename.endswith(('.jpg', '.png', '.gif')):\n        local_path = os.path.join(image_dir, filename)\n        key = f\"images/{filename}\"\n\n        try:\n            result = kodo.upload(local_path, key)\n            print(f\"✅ {filename} -> {result['url']}\")\n            uploaded += 1\n        except Exception as e:\n            print(f\"❌ {filename} 上传失败: {e}\")\n\nprint(f\"\\n✅ 共上传 {uploaded} 个文件\")\n```\n\n---\n\n## 🔧 高级用法\n\n### 使用配置文件\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\n# 使用自定义配置文件\nkodo = QiniuKodo(config_path='/path/to/custom-config.json')\n\n# 上传文件\nresult = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n```\n\n### 错误处理\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\nkodo = QiniuKodo()\n\ntry:\n    result = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n    print(f\"上传成功: {result['url']}\")\nexcept FileNotFoundError as e:\n    print(f\"文件不存在: {e}\")\nexcept Exception as e:\n    print(f\"上传失败: {e}\")\n```\n\n---\n\n## 🎯 更多示例\n\n查看 [SKILL.md](../SKILL.md) 获取更多详细信息和 API 文档。\n\nFile v1.0.3:skill-card.md\n\n## Description:\n\nQiniu Kodo helps agents manage Qiniu Cloud Kodo object storage by uploading, downloading, listing, deleting, inspecting, moving, copying objects, and generating file URLs through MCP, the Node.js SDK, or qshell.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[langhuachuanshi](https://clawhub.ai/user/langhuachuanshi)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and engineers use this skill to automate Qiniu Cloud Kodo object-storage workflows from an agent, including object upload, download, listing, deletion, metadata inspection, moves, copies, and URL generation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Credential exposure from persisted Qiniu keys or shared-shell usage.\n\nMitigation: Use narrowly scoped Qiniu credentials, avoid long-lived secrets in shared shells, and inspect shell startup files and mcporter configuration before and after setup.\n\nRisk: Cloud data loss from delete or batch-delete operations.\n\nMitigation: Avoid destructive operations on production buckets unless independent backups exist and the exact bucket, prefix, and object keys have been verified.\n\nRisk: Installation behavior may modify the user environment through global installs, downloads, and shell-profile edits.\n\nMitigation: Review the setup script before installing, prefer local package installation, and back up shell startup files before allowing setup changes.\n\n## Reference(s):\n\n- [Qiniu Kodo ClawHub skill page](https://clawhub.ai/langhuachuanshi/skills/qiniu-kodo)\n- [Qiniu MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [Qiniu Node.js SDK documentation](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [Qiniu qshell tool documentation](https://developer.qiniu.com/kodo/tools/1302/qshell)\n- [Usage examples](docs/EXAMPLES.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON configuration examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May propose or run Qiniu object-storage actions that depend on configured credentials, bucket, region, domain, and installed Node.js or MCP tooling.]\n\n## Skill Version(s):\n\n1.0.3 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.3:config/qiniu-config.example.json\n\n{\n  \"accessKey\": \"你的AccessKey\",\n  \"secretKey\": \"你的SecretKey\",\n  \"bucket\": \"你的存储桶名称\",\n  \"region\": \"z0\",\n  \"domain\": \"http://你的域名.com\",\n  \"options\": {\n    \"use_https\": true,\n    \"use_cdn\": true,\n    \"timeout\": 30,\n    \"upload_threshold\": 4194304,\n    \"chunk_size\": 4194304,\n    \"retry_times\": 3\n  }\n}\n\nFile v1.0.3:package.json\n\n{\n  \"name\": \"qiniu-kodo-skill\",\n  \"version\": \"1.0.0\",\n  \"description\": \"七牛云 KODO 对象存储技能\",\n  \"main\": \"scripts/qiniu_node.mjs\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"setup\": \"bash scripts/setup.sh\",\n    \"test\": \"node scripts/qiniu_node.mjs test-connection\"\n  },\n  \"dependencies\": {\n    \"qiniu\": \"^7.14.0\"\n  },\n  \"keywords\": [\"qiniu\", \"kodo\", \"oss\", \"openclaw\", \"skill\"],\n  \"author\": \"33\",\n  \"license\": \"MIT\"\n}\n\nArchive v1.0.2: 8 files, 13552 bytes\n\nFiles: _meta.json (129b), config/qiniu-config.example.json (329b), docs/EXAMPLES.md (6728b), package.json (428b), README.md (1144b), scripts/qiniu_node.mjs (14257b), scripts/setup.sh (11772b), SKILL.md (3605b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: qiniu-kodo\ndescription: |\n  七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。\n  三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"☁️\",\n        \"requires\": { \"bins\": [\"node\", \"python3\", \"pip3\"], \"packages\": [\"qiniu\", \"qiniu-mcp-server\"] },\n        \"install\":\n          [\n            { \"id\": \"qiniu-sdk\", \"kind\": \"node\", \"package\": \"qiniu\", \"label\": \"Install qiniu Node.js SDK\" },\n            { \"id\": \"qiniu-mcp\", \"kind\": \"python\", \"package\": \"qiniu-mcp-server\", \"label\": \"Install qiniu-mcp-server\" },\n          ],\n      },\n  }\n---\n\n# ☁️ 七牛云 KODO 技能\n\n通过 **MCP 工具** / **Node.js SDK** / **qshell CLI** 管理七牛云对象存储。\n\n---\n\n## 🎯 执行策略（三层降级）\n\n| 优先级 | 工具 | 使用场景 |\n|--------|------|----------|\n| **1** | `qiniu-mcp-server` | 功能最全，优先使用 |\n| **2** | Node.js SDK | MCP 不可用时降级 |\n| **3** | qshell CLI | 最后备选 |\n\n---\n\n## 🚀 快速开始\n\n### 1. 安装依赖\n\n```bash\n# 进入技能目录\ncd ~/.openclaw/workspace/skills/qiniu-kodo\n\n# 运行自动安装\nbash scripts/setup.sh\n```\n\n### 2. 配置凭证\n\n```bash\nbash scripts/setup.sh \\\n  --access-key \"YOUR_ACCESS_KEY\" \\\n  --secret-key \"YOUR_SECRET_KEY\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\"\n```\n\n### 3. 测试连接\n\n```bash\nnode scripts/qiniu_node.mjs test-connection\n```\n\n---\n\n## 📋 使用示例\n\n### 上传文件\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\"\n```\n\n### 列出文件\n\n```bash\nnode scripts/qiniu_node.mjs list --prefix \"uploads/\" --limit 100\n```\n\n### 下载文件\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/save.txt\"\n```\n\n### 删除文件\n\n```bash\nnode scripts/qiniu_node.mjs delete --key \"uploads/file.txt\" --force\n```\n\n### 获取文件 URL\n\n```bash\n# 公开空间\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\"\n\n# 私有空间（1小时有效）\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\" --private --expires 3600\n```\n\n---\n\n## 🔧 Node.js SDK API\n\n| 命令 | 说明 |\n|------|------|\n| `upload --local <path> --key <key>` | 上传文件 |\n| `download --key <key> --local <path>` | 下载文件 |\n| `list [--prefix <p>] [--limit <n>]` | 列出文件 |\n| `delete --key <key> [--force]` | 删除文件 |\n| `url --key <key> [--private] [--expires <s>]` | 获取 URL |\n| `stat --key <key>` | 文件信息 |\n| `move --src-key <a> --dest-key <b>` | 移动文件 |\n| `copy --src-key <a> --dest-key <b>` | 复制文件 |\n| `test-connection` | 测试连接 |\n\n---\n\n## ⚙️ 配置文件\n\n**config/qiniu-config.json**\n\n```json\n{\n  \"accessKey\": \"YOUR_ACCESS_KEY\",\n  \"secretKey\": \"YOUR_SECRET_KEY\",\n  \"bucket\": \"mybucket\",\n  \"region\": \"z0\",\n  \"domain\": \"https://cdn.example.com\"\n}\n```\n\n**区域代码**：\n- `z0` - 华东（杭州）\n- `z1` - 华北（河北）\n- `z2` - 华南（广州）\n- `na0` - 北美（洛杉矶）\n- `as0` - 东南亚（新加坡）\n\n---\n\n## 🐛 故障排查\n\n| 问题 | 解决 |\n|------|------|\n| `Cannot find module 'qiniu'` | `npm install qiniu` |\n| `401 Unauthorized` | 检查 AccessKey/SecretKey |\n| `连接超时` | 检查区域代码和网络 |\n\n---\n\n## 📚 相关链接\n\n- [七牛云 MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [qshell 工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n\n---\n\n## 📄 许可证\n\nMIT License\n\nFile v1.0.2:README.md\n\n# ☁️ 七牛云 KODO 技能\n\nOpenClaw 技能，用于管理七牛云对象存储（KODO）。\n\n## ✨ 功能\n\n- 📤 上传文件\n- 📥 下载文件\n- 📋 列出文件\n- 🗑️ 删除文件\n- 🔗 获取文件 URL（支持私有空间签名）\n- 📊 查看文件信息\n- 📁 移动/复制文件\n\n## 🚀 快速开始\n\n```bash\n# 安装依赖\nnpm install\n\n# 配置凭证\nbash scripts/setup.sh --access-key \"xxx\" --secret-key \"xxx\" --region \"z0\" --bucket \"mybucket\"\n\n# 测试连接\nnode scripts/qiniu_node.mjs test-connection\n```\n\n## 📖 使用示例\n\n```bash\n# 上传\nnode scripts/qiniu_node.mjs upload --local file.txt --key uploads/file.txt\n\n# 列出\nnode scripts/qiniu_node.mjs list --prefix uploads/\n\n# 下载\nnode scripts/qiniu_node.mjs download --key uploads/file.txt --local file.txt\n\n# 删除\nnode scripts/qiniu_node.mjs delete --key uploads/file.txt --force\n\n# 获取 URL\nnode scripts/qiniu_node.mjs url --key uploads/file.txt\n```\n\n## 🔧 架构\n\n三层降级策略：\n1. **MCP 工具** (`qiniu-mcp-server`) - 功能最全\n2. **Node.js SDK** (`qiniu`) - 稳定可靠\n3. **qshell CLI** - 官方命令行\n\n## 📄 许可证\n\nMIT\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn78r3ca13npsxrn5f905res8n821ssm\",\n  \"slug\": \"qiniu-kodo\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1772812519405\n}\n\nFile v1.0.2:docs/EXAMPLES.md\n\n# 七牛云 KODO 技能 - 使用示例\n\n本文档包含七牛云 KODO 技能的各种使用示例。\n\n---\n\n## 📤 示例1：上传文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```\n优先级 1：尝试使用 qiniu-mcp MCP 工具\n优先级 2：如果 MCP 不可用，使用 Python SDK\n优先级 3：如果 SDK 也不可用，使用 qshell\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local /backups/daily-20260301.tar.gz \\\n  --key backups/daily-20260301.tar.gz\n```\n\n---\n\n## 📋 示例2：列出文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n### 命令行方式\n\n```bash\n# 列出所有文件\nnode scripts/qiniu_node.mjs list\n\n# 列出指定前缀的文件\nnode scripts/qiniu_node.mjs list --prefix backups/ --limit 50\n\n# JSON 格式输出\nnode scripts/qiniu_node.mjs list --prefix backups/ --format json\n```\n\n---\n\n## 🔗 示例3：获取文件 URL\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n### 命令行方式\n\n```bash\n# 公开空间 URL\nnode scripts/qiniu_node.mjs url --key images/photo.jpg\n\n# 私有空间 URL（1小时有效）\nnode scripts/qiniu_node.mjs url --key documents/report.pdf --private --expires 3600\n```\n\n---\n\n## 🗑️ 示例4：删除文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n删除七牛云上的 old-backup.tar.gz\n```\n\n**AI 执行：**\n```\n1. 先确认：是否真的要删除？\n2. 用户确认后执行删除\n```\n\n**返回：**\n```\n✅ 删除成功！\n\n文件：old-backup.tar.gz\n```\n\n### 命令行方式\n\n```bash\n# 删除单个文件（需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz\n\n# 强制删除（不需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz --force\n\n# 批量删除\ncat > delete-list.txt << EOF\nbackups/backup-20260101.tar.gz\nbackups/backup-20260102.tar.gz\nEOF\n\nnode scripts/qiniu_node.mjs batch-delete --file delete-list.txt\n```\n\n---\n\n## 📊 示例5：获取文件信息\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n查看 documents/report.pdf 的详细信息\n```\n\n**返回：**\n```\n📊 文件信息：\n\n文件名：documents/report.pdf\n大小：2.5 MB\n类型：application/pdf\nHash：FhGxK...（文件哈希值）\n修改时间：2026-03-01 15:30:00\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs stat --key documents/report.pdf\n```\n\n---\n\n## 📥 示例6：下载文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n从七牛云下载 documents/report.pdf 到本地\n```\n\n**返回：**\n```\n✅ 下载成功！\n\n文件：documents/report.pdf\n大小：2.5 MB\n保存到：/downloads/report.pdf\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key documents/report.pdf \\\n  --local /downloads/report.pdf\n```\n\n---\n\n## 🔄 示例7：移动和复制文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 temp/file.txt 移动到 archive/file.txt\n```\n\n**返回：**\n```\n✅ 文件已移动\n\n原路径：temp/file.txt\n新路径：archive/file.txt\n```\n\n### 命令行方式（需要扩展）\n\n```bash\n# 移动文件（需要扩展 Python 脚本）\n# 复制文件（需要扩展 Python 脚本）\n```\n\n---\n\n## 🖼️ 示例8：图片处理（需要 MCP）\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```\n使用 qiniu-mcp MCP 工具进行图片处理\n（需要 MCP 工具支持）\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://your-domain.com/images/photo.jpg\n处理后：http://your-domain.com/images/photo.jpg?imageView2/1/w/800/h/600|watermark/...\n```\n\n---\n\n## 🤖 示例9：自动化备份脚本\n\n### 完整脚本\n\n```bash\n#!/bin/bash\n\n# 每日备份脚本\nBACKUP_DIR=\"/backups\"\nDATE=$(date +%Y%m%d)\nBACKUP_FILE=\"backup-${DATE}.tar.gz\"\n\n# 1. 创建备份\necho \"📦 创建备份...\"\ntar -czf \"${BACKUP_DIR}/${BACKUP_FILE}\" /data\n\n# 2. 上传到七牛云\necho \"📤 上传到七牛云...\"\ncd /home/node/.openclaw/workspace/skills/qiniu-kodo\nnode scripts/qiniu_node.mjs upload \\\n  --local \"${BACKUP_DIR}/${BACKUP_FILE}\" \\\n  --key \"backups/${BACKUP_FILE}\"\n\n# 3. 清理本地旧备份（保留7天）\necho \"🗑️  清理旧备份...\"\nfind ${BACKUP_DIR} -name \"backup-*.tar.gz\" -mtime +7 -delete\n\n# 4. 清理云端旧备份（保留30天）\necho \"🗑️  清理云端旧备份...\"\npython -c \"\nfrom scripts.qiniu_python import QiniuKodo\nfrom datetime import datetime, timedelta\n\nkodo = QiniuKodo()\ncutoff = datetime.now() - timedelta(days=30)\n\nfor file in kodo.list_files(prefix='backups/'):\n    if datetime.fromtimestamp(file['mtime']) < cutoff:\n        kodo.delete(file['key'])\n        print(f'已删除: {file[\\\"key\\\"]}')\n\"\n\necho \"✅ 备份完成！\"\n```\n\n---\n\n## 📝 示例10：批量操作\n\n### 批量上传图片\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\nimport os\n\nkodo = QiniuKodo()\n\nimage_dir = \"/path/to/images\"\nuploaded = 0\n\nfor filename in os.listdir(image_dir):\n    if filename.endswith(('.jpg', '.png', '.gif')):\n        local_path = os.path.join(image_dir, filename)\n        key = f\"images/{filename}\"\n\n        try:\n            result = kodo.upload(local_path, key)\n            print(f\"✅ {filename} -> {result['url']}\")\n            uploaded += 1\n        except Exception as e:\n            print(f\"❌ {filename} 上传失败: {e}\")\n\nprint(f\"\\n✅ 共上传 {uploaded} 个文件\")\n```\n\n---\n\n## 🔧 高级用法\n\n### 使用配置文件\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\n# 使用自定义配置文件\nkodo = QiniuKodo(config_path='/path/to/custom-config.json')\n\n# 上传文件\nresult = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n```\n\n### 错误处理\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\nkodo = QiniuKodo()\n\ntry:\n    result = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n    print(f\"上传成功: {result['url']}\")\nexcept FileNotFoundError as e:\n    print(f\"文件不存在: {e}\")\nexcept Exception as e:\n    print(f\"上传失败: {e}\")\n```\n\n---\n\n## 🎯 更多示例\n\n查看 [SKILL.md](../SKILL.md) 获取更多详细信息和 API 文档。\n\nFile v1.0.2:config/qiniu-config.example.json\n\n{\n  \"accessKey\": \"你的AccessKey\",\n  \"secretKey\": \"你的SecretKey\",\n  \"bucket\": \"你的存储桶名称\",\n  \"region\": \"z0\",\n  \"domain\": \"http://你的域名.com\",\n  \"options\": {\n    \"use_https\": true,\n    \"use_cdn\": true,\n    \"timeout\": 30,\n    \"upload_threshold\": 4194304,\n    \"chunk_size\": 4194304,\n    \"retry_times\": 3\n  }\n}\n\nFile v1.0.2:package.json\n\n{\n  \"name\": \"qiniu-kodo-skill\",\n  \"version\": \"1.0.0\",\n  \"description\": \"七牛云 KODO 对象存储技能\",\n  \"main\": \"scripts/qiniu_node.mjs\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"setup\": \"bash scripts/setup.sh\",\n    \"test\": \"node scripts/qiniu_node.mjs test-connection\"\n  },\n  \"dependencies\": {\n    \"qiniu\": \"^7.14.0\"\n  },\n  \"keywords\": [\"qiniu\", \"kodo\", \"oss\", \"openclaw\", \"skill\"],\n  \"author\": \"33\",\n  \"license\": \"MIT\"\n}\n\nArchive v1.0.1: 8 files, 13608 bytes\n\nFiles: _meta.json (129b), config/qiniu-config.example.json (329b), docs/EXAMPLES.md (6728b), package.json (428b), README.md (1144b), scripts/qiniu_node.mjs (14403b), scripts/setup.sh (11772b), SKILL.md (3605b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: qiniu-kodo\ndescription: |\n  七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。\n  三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"☁️\",\n        \"requires\": { \"bins\": [\"node\", \"python3\", \"pip3\"], \"packages\": [\"qiniu\", \"qiniu-mcp-server\"] },\n        \"install\":\n          [\n            { \"id\": \"qiniu-sdk\", \"kind\": \"node\", \"package\": \"qiniu\", \"label\": \"Install qiniu Node.js SDK\" },\n            { \"id\": \"qiniu-mcp\", \"kind\": \"python\", \"package\": \"qiniu-mcp-server\", \"label\": \"Install qiniu-mcp-server\" },\n          ],\n      },\n  }\n---\n\n# ☁️ 七牛云 KODO 技能\n\n通过 **MCP 工具** / **Node.js SDK** / **qshell CLI** 管理七牛云对象存储。\n\n---\n\n## 🎯 执行策略（三层降级）\n\n| 优先级 | 工具 | 使用场景 |\n|--------|------|----------|\n| **1** | `qiniu-mcp-server` | 功能最全，优先使用 |\n| **2** | Node.js SDK | MCP 不可用时降级 |\n| **3** | qshell CLI | 最后备选 |\n\n---\n\n## 🚀 快速开始\n\n### 1. 安装依赖\n\n```bash\n# 进入技能目录\ncd ~/.openclaw/workspace/skills/qiniu-kodo\n\n# 运行自动安装\nbash scripts/setup.sh\n```\n\n### 2. 配置凭证\n\n```bash\nbash scripts/setup.sh \\\n  --access-key \"YOUR_ACCESS_KEY\" \\\n  --secret-key \"YOUR_SECRET_KEY\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\"\n```\n\n### 3. 测试连接\n\n```bash\nnode scripts/qiniu_node.mjs test-connection\n```\n\n---\n\n## 📋 使用示例\n\n### 上传文件\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\"\n```\n\n### 列出文件\n\n```bash\nnode scripts/qiniu_node.mjs list --prefix \"uploads/\" --limit 100\n```\n\n### 下载文件\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/save.txt\"\n```\n\n### 删除文件\n\n```bash\nnode scripts/qiniu_node.mjs delete --key \"uploads/file.txt\" --force\n```\n\n### 获取文件 URL\n\n```bash\n# 公开空间\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\"\n\n# 私有空间（1小时有效）\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\" --private --expires 3600\n```\n\n---\n\n## 🔧 Node.js SDK API\n\n| 命令 | 说明 |\n|------|------|\n| `upload --local <path> --key <key>` | 上传文件 |\n| `download --key <key> --local <path>` | 下载文件 |\n| `list [--prefix <p>] [--limit <n>]` | 列出文件 |\n| `delete --key <key> [--force]` | 删除文件 |\n| `url --key <key> [--private] [--expires <s>]` | 获取 URL |\n| `stat --key <key>` | 文件信息 |\n| `move --src-key <a> --dest-key <b>` | 移动文件 |\n| `copy --src-key <a> --dest-key <b>` | 复制文件 |\n| `test-connection` | 测试连接 |\n\n---\n\n## ⚙️ 配置文件\n\n**config/qiniu-config.json**\n\n```json\n{\n  \"accessKey\": \"YOUR_ACCESS_KEY\",\n  \"secretKey\": \"YOUR_SECRET_KEY\",\n  \"bucket\": \"mybucket\",\n  \"region\": \"z0\",\n  \"domain\": \"https://cdn.example.com\"\n}\n```\n\n**区域代码**：\n- `z0` - 华东（杭州）\n- `z1` - 华北（河北）\n- `z2` - 华南（广州）\n- `na0` - 北美（洛杉矶）\n- `as0` - 东南亚（新加坡）\n\n---\n\n## 🐛 故障排查\n\n| 问题 | 解决 |\n|------|------|\n| `Cannot find module 'qiniu'` | `npm install qiniu` |\n| `401 Unauthorized` | 检查 AccessKey/SecretKey |\n| `连接超时` | 检查区域代码和网络 |\n\n---\n\n## 📚 相关链接\n\n- [七牛云 MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [qshell 工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n\n---\n\n## 📄 许可证\n\nMIT License\n\nFile v1.0.1:README.md\n\n# ☁️ 七牛云 KODO 技能\n\nOpenClaw 技能，用于管理七牛云对象存储（KODO）。\n\n## ✨ 功能\n\n- 📤 上传文件\n- 📥 下载文件\n- 📋 列出文件\n- 🗑️ 删除文件\n- 🔗 获取文件 URL（支持私有空间签名）\n- 📊 查看文件信息\n- 📁 移动/复制文件\n\n## 🚀 快速开始\n\n```bash\n# 安装依赖\nnpm install\n\n# 配置凭证\nbash scripts/setup.sh --access-key \"xxx\" --secret-key \"xxx\" --region \"z0\" --bucket \"mybucket\"\n\n# 测试连接\nnode scripts/qiniu_node.mjs test-connection\n```\n\n## 📖 使用示例\n\n```bash\n# 上传\nnode scripts/qiniu_node.mjs upload --local file.txt --key uploads/file.txt\n\n# 列出\nnode scripts/qiniu_node.mjs list --prefix uploads/\n\n# 下载\nnode scripts/qiniu_node.mjs download --key uploads/file.txt --local file.txt\n\n# 删除\nnode scripts/qiniu_node.mjs delete --key uploads/file.txt --force\n\n# 获取 URL\nnode scripts/qiniu_node.mjs url --key uploads/file.txt\n```\n\n## 🔧 架构\n\n三层降级策略：\n1. **MCP 工具** (`qiniu-mcp-server`) - 功能最全\n2. **Node.js SDK** (`qiniu`) - 稳定可靠\n3. **qshell CLI** - 官方命令行\n\n## 📄 许可证\n\nMIT\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn78r3ca13npsxrn5f905res8n821ssm\",\n  \"slug\": \"qiniu-kodo\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1772812021231\n}\n\nFile v1.0.1:docs/EXAMPLES.md\n\n# 七牛云 KODO 技能 - 使用示例\n\n本文档包含七牛云 KODO 技能的各种使用示例。\n\n---\n\n## 📤 示例1：上传文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```\n优先级 1：尝试使用 qiniu-mcp MCP 工具\n优先级 2：如果 MCP 不可用，使用 Python SDK\n优先级 3：如果 SDK 也不可用，使用 qshell\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local /backups/daily-20260301.tar.gz \\\n  --key backups/daily-20260301.tar.gz\n```\n\n---\n\n## 📋 示例2：列出文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n### 命令行方式\n\n```bash\n# 列出所有文件\nnode scripts/qiniu_node.mjs list\n\n# 列出指定前缀的文件\nnode scripts/qiniu_node.mjs list --prefix backups/ --limit 50\n\n# JSON 格式输出\nnode scripts/qiniu_node.mjs list --prefix backups/ --format json\n```\n\n---\n\n## 🔗 示例3：获取文件 URL\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n### 命令行方式\n\n```bash\n# 公开空间 URL\nnode scripts/qiniu_node.mjs url --key images/photo.jpg\n\n# 私有空间 URL（1小时有效）\nnode scripts/qiniu_node.mjs url --key documents/report.pdf --private --expires 3600\n```\n\n---\n\n## 🗑️ 示例4：删除文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n删除七牛云上的 old-backup.tar.gz\n```\n\n**AI 执行：**\n```\n1. 先确认：是否真的要删除？\n2. 用户确认后执行删除\n```\n\n**返回：**\n```\n✅ 删除成功！\n\n文件：old-backup.tar.gz\n```\n\n### 命令行方式\n\n```bash\n# 删除单个文件（需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz\n\n# 强制删除（不需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz --force\n\n# 批量删除\ncat > delete-list.txt << EOF\nbackups/backup-20260101.tar.gz\nbackups/backup-20260102.tar.gz\nEOF\n\nnode scripts/qiniu_node.mjs batch-delete --file delete-list.txt\n```\n\n---\n\n## 📊 示例5：获取文件信息\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n查看 documents/report.pdf 的详细信息\n```\n\n**返回：**\n```\n📊 文件信息：\n\n文件名：documents/report.pdf\n大小：2.5 MB\n类型：application/pdf\nHash：FhGxK...（文件哈希值）\n修改时间：2026-03-01 15:30:00\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs stat --key documents/report.pdf\n```\n\n---\n\n## 📥 示例6：下载文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n从七牛云下载 documents/report.pdf 到本地\n```\n\n**返回：**\n```\n✅ 下载成功！\n\n文件：documents/report.pdf\n大小：2.5 MB\n保存到：/downloads/report.pdf\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key documents/report.pdf \\\n  --local /downloads/report.pdf\n```\n\n---\n\n## 🔄 示例7：移动和复制文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 temp/file.txt 移动到 archive/file.txt\n```\n\n**返回：**\n```\n✅ 文件已移动\n\n原路径：temp/file.txt\n新路径：archive/file.txt\n```\n\n### 命令行方式（需要扩展）\n\n```bash\n# 移动文件（需要扩展 Python 脚本）\n# 复制文件（需要扩展 Python 脚本）\n```\n\n---\n\n## 🖼️ 示例8：图片处理（需要 MCP）\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```\n使用 qiniu-mcp MCP 工具进行图片处理\n（需要 MCP 工具支持）\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://your-domain.com/images/photo.jpg\n处理后：http://your-domain.com/images/photo.jpg?imageView2/1/w/800/h/600|watermark/...\n```\n\n---\n\n## 🤖 示例9：自动化备份脚本\n\n### 完整脚本\n\n```bash\n#!/bin/bash\n\n# 每日备份脚本\nBACKUP_DIR=\"/backups\"\nDATE=$(date +%Y%m%d)\nBACKUP_FILE=\"backup-${DATE}.tar.gz\"\n\n# 1. 创建备份\necho \"📦 创建备份...\"\ntar -czf \"${BACKUP_DIR}/${BACKUP_FILE}\" /data\n\n# 2. 上传到七牛云\necho \"📤 上传到七牛云...\"\ncd /home/node/.openclaw/workspace/skills/qiniu-kodo\nnode scripts/qiniu_node.mjs upload \\\n  --local \"${BACKUP_DIR}/${BACKUP_FILE}\" \\\n  --key \"backups/${BACKUP_FILE}\"\n\n# 3. 清理本地旧备份（保留7天）\necho \"🗑️  清理旧备份...\"\nfind ${BACKUP_DIR} -name \"backup-*.tar.gz\" -mtime +7 -delete\n\n# 4. 清理云端旧备份（保留30天）\necho \"🗑️  清理云端旧备份...\"\npython -c \"\nfrom scripts.qiniu_python import QiniuKodo\nfrom datetime import datetime, timedelta\n\nkodo = QiniuKodo()\ncutoff = datetime.now() - timedelta(days=30)\n\nfor file in kodo.list_files(prefix='backups/'):\n    if datetime.fromtimestamp(file['mtime']) < cutoff:\n        kodo.delete(file['key'])\n        print(f'已删除: {file[\\\"key\\\"]}')\n\"\n\necho \"✅ 备份完成！\"\n```\n\n---\n\n## 📝 示例10：批量操作\n\n### 批量上传图片\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\nimport os\n\nkodo = QiniuKodo()\n\nimage_dir = \"/path/to/images\"\nuploaded = 0\n\nfor filename in os.listdir(image_dir):\n    if filename.endswith(('.jpg', '.png', '.gif')):\n        local_path = os.path.join(image_dir, filename)\n        key = f\"images/{filename}\"\n\n        try:\n            result = kodo.upload(local_path, key)\n            print(f\"✅ {filename} -> {result['url']}\")\n            uploaded += 1\n        except Exception as e:\n            print(f\"❌ {filename} 上传失败: {e}\")\n\nprint(f\"\\n✅ 共上传 {uploaded} 个文件\")\n```\n\n---\n\n## 🔧 高级用法\n\n### 使用配置文件\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\n# 使用自定义配置文件\nkodo = QiniuKodo(config_path='/path/to/custom-config.json')\n\n# 上传文件\nresult = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n```\n\n### 错误处理\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\nkodo = QiniuKodo()\n\ntry:\n    result = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n    print(f\"上传成功: {result['url']}\")\nexcept FileNotFoundError as e:\n    print(f\"文件不存在: {e}\")\nexcept Exception as e:\n    print(f\"上传失败: {e}\")\n```\n\n---\n\n## 🎯 更多示例\n\n查看 [SKILL.md](../SKILL.md) 获取更多详细信息和 API 文档。\n\nFile v1.0.1:config/qiniu-config.example.json\n\n{\n  \"accessKey\": \"你的AccessKey\",\n  \"secretKey\": \"你的SecretKey\",\n  \"bucket\": \"你的存储桶名称\",\n  \"region\": \"z0\",\n  \"domain\": \"http://你的域名.com\",\n  \"options\": {\n    \"use_https\": true,\n    \"use_cdn\": true,\n    \"timeout\": 30,\n    \"upload_threshold\": 4194304,\n    \"chunk_size\": 4194304,\n    \"retry_times\": 3\n  }\n}\n\nFile v1.0.1:package.json\n\n{\n  \"name\": \"qiniu-kodo-skill\",\n  \"version\": \"1.0.0\",\n  \"description\": \"七牛云 KODO 对象存储技能\",\n  \"main\": \"scripts/qiniu_node.mjs\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"setup\": \"bash scripts/setup.sh\",\n    \"test\": \"node scripts/qiniu_node.mjs test-connection\"\n  },\n  \"dependencies\": {\n    \"qiniu\": \"^7.14.0\"\n  },\n  \"keywords\": [\"qiniu\", \"kodo\", \"oss\", \"openclaw\", \"skill\"],\n  \"author\": \"33\",\n  \"license\": \"MIT\"\n}\n\nArchive v1.0.0: 7 files, 16641 bytes\n\nFiles: config/qiniu-config.example.json (329b), docs/EXAMPLES.md (6728b), README.md (1424b), scripts/qiniu_node.mjs (14403b), scripts/setup.sh (11772b), SKILL.md (13953b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n# Qiniu KODO 技能\n\n通过 qiniu-mcp MCP 工具 + Node.js SDK 脚本 + qshell 管理七牛云对象存储和数据处理。\n\n---\n\n## 📖 功能说明\n\n### 核心功能\n- 📤 **上传文件** - 单文件、批量上传、断点续传\n- 📥 **下载文件** - 单文件、批量下载\n- 📋 **列出文件** - 按前缀、分页列出\n- 🗑️ **删除文件** - 单文件、批量删除\n- 🔗 **获取 URL** - 公开/私有空间 URL 生成\n- 📊 **文件信息** - 查看文件详情\n- 📁 **目录操作** - 移动、复制、重命名\n\n### 高级功能（通过 MCP 工具）\n- 🖼️ **图片处理** - 缩放、裁剪、水印、格式转换\n- 🎵 **音视频处理** - 转码、截图、切片\n- 🔍 **智能搜索** - 文件搜索和元数据查询\n- 📝 **文档处理** - 文档预览、格式转换\n\n---\n\n## 🚀 首次使用 — 自动设置\n\n当用户首次要求操作 KODO 时，按以下流程操作：\n\n### 步骤 1：检查当前状态\n\n```bash\n{baseDir}/scripts/setup.sh --check-only\n```\n\n**检查内容：**\n- ✅ Node.js 环境\n- ✅ qiniu-mcp 是否已安装\n- ✅ qshell 是否已安装\n- ✅ 配置文件是否存在\n- ✅ 凭证是否已配置\n\n如果输出显示一切 OK（qiniu-mcp 已安装、凭证已配置），跳到「执行策略」。\n\n---\n\n### 步骤 2：如果未配置，引导用户提供凭证\n\n告诉用户：\n\n```\n我需要你的七牛云凭证来连接 KODO 存储服务。请提供：\n\nAccessKey — 七牛云 AccessKey\nSecretKey — 七牛云 SecretKey  \nRegion — 存储区域（如 z0=华东, z1=华北, z2=华南, na0=北美, as0=东南亚）\nBucket — 存储桶名称\nDomain（可选） — 访问域名（用于生成文件 URL，如 http://cdn.example.com）\n\n你可以在七牛云控制台获取：\n- 密钥管理：https://portal.qiniu.com/user/key\n- 存储桶列表：https://portal.qiniu.com/kodo/bucket\n- 区域说明：\n  - z0: 华东（杭州）\n  - z1: 华北（河北）\n  - z2: 华南（广州）\n  - na0: 北美（洛杉矶）\n  - as0: 东南亚（新加坡）\n```\n\n---\n\n### 步骤 3：用户提供凭证后，运行自动设置\n\n```bash\n{baseDir}/scripts/setup.sh \\\n  --access-key \"<AccessKey>\" \\\n  --secret-key \"<SecretKey>\" \\\n  --region \"<Region>\" \\\n  --bucket \"<Bucket>\" \\\n  --domain \"<Domain>\"\n```\n\n**脚本会自动：**\n\n1. ✅ 检查并安装 mcporter（MCP 命令行工具）\n2. ✅ 检查并安装 qiniu-mcp-server（七牛云官方 MCP 工具）\n3. ✅ 安装 qiniu Node.js SDK\n4. ✅ 安装 qshell 命令行工具\n5. ✅ 创建/更新 `~/.mcporter/mcporter.json`，写入 qiniu-mcp 服务器配置\n6. ✅ 将凭证写入 shell 配置文件（`~/.zshrc` 或 `~/.bashrc`），重启后仍可用\n7. ✅ 创建配置文件 `{baseDir}/config/qiniu-config.json`\n8. ✅ 验证七牛云连接\n9. ✅ 测试上传下载功能\n\n**设置完成后即可开始使用。**\n\n---\n\n## 🎯 执行策略\n\n三种方式按优先级降级，确保操作始终可完成：\n\n### 方式一：qiniu-mcp MCP 工具（优先）\n\n**特点：** 功能最全，支持存储 + 图片处理 + 音视频处理 + 智能搜索\n\n**使用场景：**\n- 需要图片处理（缩放、裁剪、水印）\n- 需要音视频转码\n- 需要智能搜索\n- 需要文档处理\n\n**调用方式：**\n```javascript\n// 通过 MCP 工具调用\nuse_mcp_tool(\"qiniu-mcp\", \"upload_file\", {\n  localPath: \"/path/to/file.txt\",\n  key: \"uploads/file.txt\"\n})\n```\n\n---\n\n### 方式二：Node.js SDK 脚本\n\n**特点：** 稳定可靠，支持基础存储操作\n\n**使用场景：**\n- MCP 工具不可用\n- 只需要基础存储操作\n- 需要自定义处理逻辑\n\n**调用方式：**\n```bash\nnode {baseDir}/scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\"\n\nnode {baseDir}/scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/file.txt\"\n\nnode {baseDir}/scripts/qiniu_node.mjs list \\\n  --prefix \"uploads/\" \\\n  --limit 100\n```\n\n---\n\n### 方式三：qshell 命令行（最后备选）\n\n**特点：** 官方命令行工具，功能全面\n\n**使用场景：**\n- MCP 和 SDK 都不可用\n- 需要批量操作\n- 需要高级功能\n\n**调用方式：**\n```bash\n# 上传文件\nqshell fput <Bucket> <Key> <LocalFile>\n\n# 下载文件\nqshell get <Bucket> <Key> <LocalFile>\n\n# 列出文件\nqshell list <Bucket> <Prefix> <Limit>\n\n# 批量上传\nqshell qupload <ThreadCount> <SrcDir> <Bucket>\n```\n\n---\n\n## 📋 使用示例\n\n### 示例1：上传备份文件\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```javascript\n// 优先使用 MCP 工具\nresult = use_mcp_tool(\"qiniu-mcp\", \"upload_file\", {\n  \"localPath\": \"/backups/daily-20260301.tar.gz\",\n  \"key\": \"backups/daily-20260301.tar.gz\"\n})\n\n// 如果 MCP 不可用，降级到 Node.js SDK\n// node scripts/qiniu_node.mjs upload \\\n//   --local \"/backups/daily-20260301.tar.gz\" \\\n//   --key \"backups/daily-20260301.tar.gz\"\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n---\n\n### 示例2：列出文件\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**AI 执行：**\n```javascript\n// 优先使用 MCP 工具\nfiles = use_mcp_tool(\"qiniu-mcp\", \"list_files\", {\n  \"prefix\": \"backups/\",\n  \"limit\": 100\n})\n\n// 如果 MCP 不可用，降级到 Node.js SDK\n// node scripts/qiniu_node.mjs list --prefix \"backups/\"\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n---\n\n### 示例3：获取文件 URL\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**AI 执行：**\n```javascript\n// 优先使用 MCP 工具\nurl = use_mcp_tool(\"qiniu-mcp\", \"get_file_url\", {\n  \"key\": \"images/photo.jpg\",\n  \"private\": true,\n  \"expires\": 3600\n})\n\n// 如果 MCP 不可用，降级到 Node.js SDK\n// node scripts/qiniu_node.mjs url \\\n//   --key \"images/photo.jpg\" --private --expires 3600\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n---\n\n### 示例4：图片处理\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```javascript\n// 必须使用 MCP 工具（SDK 不支持图片处理）\nurl = use_mcp_tool(\"qiniu-mcp\", \"process_image\", {\n  \"key\": \"images/photo.jpg\",\n  \"operations\": [\n    {\"type\": \"resize\", \"width\": 800, \"height\": 600},\n    {\"type\": \"watermark\", \"text\": \"OpenClaw\", \"position\": \"bottom-right\"}\n  ]\n})\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://your-domain.com/images/photo.jpg\n处理后：http://your-domain.com/images/photo.jpg?imageView2/1/w/800/h/600|watermark/...\n```\n\n---\n\n### 示例5：批量删除旧备份\n\n**用户说：**\n```\n删除七牛云上 30 天前的备份\n```\n\n**AI 执行：**\n```javascript\n// 使用 Node.js SDK 脚本\nconst cutoffDate = Date.now() - (30 * 24 * 60 * 60 * 1000);\n\n// 列出所有备份\nconst { execSync } = require('child_process');\nconst files = JSON.parse(execSync('node scripts/qiniu_node.mjs list --prefix \"backups/\" --format json'));\n\n// 删除旧备份\nfor (const file of files) {\n  if (file.mtime * 1000 < cutoffDate) {\n    execSync(`node scripts/qiniu_node.mjs delete --key ${file.key} --force`);\n  }\n}\n```\n\n**返回：**\n```\n🗑️  已删除 12 个旧备份：\n\nbackups/backup-20260115.tar.gz\nbackups/backup-20260114.tar.gz\n...\n```\n\n---\n\n## 🔧 API 文档\n\n### Node.js SDK 脚本 API\n\n#### 上传文件\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local <LocalPath> \\\n  --key <RemoteKey> \\\n  [--bucket <Bucket>] \\\n  [--overwrite]\n```\n\n#### 下载文件\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key <RemoteKey> \\\n  --local <LocalPath> \\\n  [--bucket <Bucket>]\n```\n\n#### 列出文件\n```bash\nnode scripts/qiniu_node.mjs list \\\n  [--prefix <Prefix>] \\\n  [--limit <Limit>] \\\n  [--delimiter <Delimiter>] \\\n  [--format json|table]\n```\n\n#### 删除文件\n```bash\nnode scripts/qiniu_node.mjs delete \\\n  --key <RemoteKey> \\\n  [--bucket <Bucket>] \\\n  [--force]\n```\n\n#### 批量删除\n```bash\nnode scripts/qiniu_node.mjs batch-delete \\\n  --file <KeyListFile> \\\n  [--bucket <Bucket>]\n```\n\n#### 获取文件 URL\n```bash\nnode scripts/qiniu_node.mjs url \\\n  --key <RemoteKey> \\\n  [--private] \\\n  [--expires <Seconds>]\n```\n\n#### 获取文件信息\n```bash\nnode scripts/qiniu_node.mjs stat \\\n  --key <RemoteKey> \\\n  [--bucket <Bucket>]\n```\n\n#### 移动文件\n```bash\nnode scripts/qiniu_node.mjs move \\\n  --src-key <SourceKey> \\\n  --dest-key <DestKey> \\\n  [--bucket <Bucket>] \\\n  [--force]\n```\n\n#### 复制文件\n```bash\nnode scripts/qiniu_node.mjs copy \\\n  --src-key <SourceKey> \\\n  --dest-key <DestKey> \\\n  [--bucket <Bucket>] \\\n  [--force]\n```\n\n---\n\n### MCP 工具 API\n\n#### 上传文件\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"upload_file\", {\n  localPath: string,    // 本地文件路径\n  key: string,          // 远程文件名\n  bucket?: string,      // 存储桶（可选）\n  overwrite?: boolean   // 是否覆盖（可选）\n})\n```\n\n#### 下载文件\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"download_file\", {\n  key: string,          // 远程文件名\n  localPath: string,    // 本地保存路径\n  bucket?: string       // 存储桶（可选）\n})\n```\n\n#### 列出文件\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"list_files\", {\n  prefix?: string,      // 文件前缀（可选）\n  limit?: number,       // 最大数量（可选）\n  delimiter?: string    // 分隔符（可选）\n})\n```\n\n#### 删除文件\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"delete_file\", {\n  key: string,          // 远程文件名\n  bucket?: string       // 存储桶（可选）\n})\n```\n\n#### 获取文件 URL\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"get_file_url\", {\n  key: string,          // 远程文件名\n  private?: boolean,    // 是否私有空间（可选）\n  expires?: number      // 有效期秒数（可选）\n})\n```\n\n#### 图片处理\n```javascript\nuse_mcp_tool(\"qiniu-mcp\", \"process_image\", {\n  key: string,          // 图片文件名\n  operations: [         // 处理操作数组\n    {\n      type: \"resize\",   // 缩放\n      width: 800,\n      height: 600,\n      mode: \"fit\"       // fit/fill/crop\n    },\n    {\n      type: \"watermark\", // 水印\n      text: \"OpenClaw\",\n      position: \"bottom-right\",\n      opacity: 0.5\n    }\n  ]\n})\n```\n\n---\n\n## ⚙️ 配置文件\n\n### config/qiniu-config.json\n\n```json\n{\n  \"accessKey\": \"你的AccessKey\",\n  \"secretKey\": \"你的SecretKey\",\n  \"bucket\": \"你的存储桶名称\",\n  \"region\": \"z0\",\n  \"domain\": \"http://你的域名.com\",\n  \"options\": {\n    \"use_https\": true,\n    \"use_cdn\": true,\n    \"timeout\": 30,\n    \"upload_threshold\": 4194304,\n    \"chunk_size\": 4194304,\n    \"retry_times\": 3\n  }\n}\n```\n\n### 配置项说明\n\n| 配置项 | 类型 | 必填 | 说明 |\n|--------|------|------|------|\n| accessKey | string | ✅ | 七牛云 AccessKey |\n| secretKey | string | ✅ | 七牛云 SecretKey |\n| bucket | string | ✅ | 存储桶名称 |\n| region | string | ✅ | 区域代码 |\n| domain | string | ❌ | 访问域名 |\n| use_https | boolean | ❌ | 使用 HTTPS |\n| use_cdn | boolean | ❌ | 使用 CDN |\n| timeout | number | ❌ | 超时时间（秒） |\n| upload_threshold | number | ❌ | 分片上传阈值（字节） |\n| chunk_size | number | ❌ | 分片大小（字节） |\n| retry_times | number | ❌ | 重试次数 |\n\n---\n\n## 🐛 故障排查\n\n### 问题1：qiniu-mcp 未安装\n\n**症状：**\n```\n❌ qiniu-mcp 未安装\n```\n\n**解决：**\n```bash\n# 自动安装\nbash scripts/setup.sh --install-mcp\n\n# 或手动安装\nnpm install -g @qiniu/qiniu-mcp-server\n```\n\n---\n\n### 问题2：凭证配置失败\n\n**症状：**\n```\n❌ 凭证验证失败：401 Unauthorized\n```\n\n**检查：**\n1. AccessKey 和 SecretKey 是否正确\n2. 是否有对应存储桶的权限\n3. 配置文件格式是否正确\n\n**解决：**\n```bash\n# 重新配置\nbash scripts/setup.sh \\\n  --access-key \"新的AccessKey\" \\\n  --secret-key \"新的SecretKey\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\"\n```\n\n---\n\n### 问题3：上传失败\n\n**症状：**\n```\n❌ 上传失败：连接超时\n```\n\n**检查：**\n1. 网络连接是否正常\n2. 区域代码是否正确\n3. 存储桶是否存在\n\n**解决：**\n```bash\n# 检查配置\nnode scripts/qiniu_node.mjs check-config\n\n# 测试连接\nnode scripts/qiniu_node.mjs test-connection\n```\n\n---\n\n### 问题4：Node.js SDK 未安装\n\n**症状：**\n```\n❌ Cannot find module 'qiniu'\n```\n\n**解决：**\n```bash\n# 安装 SDK\ncd /home/node/.openclaw/workspace/skills/qiniu-kodo\nnpm install qiniu\n\n# 或使用自动安装\nbash scripts/setup.sh --install-sdk\n```\n\n---\n\n### 问题5：qshell 未安装\n\n**症状：**\n```\n❌ qshell: command not found\n```\n\n**解决：**\n```bash\n# 下载并安装\nwget https://devtools.qiniu.com/qshell-linux-x64-v2.6.2.zip\nunzip qshell-linux-x64-v2.6.2.zip\nchmod +x qshell\nsudo mv qshell /usr/local/bin/\n\n# 配置账号\nqshell account <AccessKey> <SecretKey> <Name>\n```\n\n---\n\n## 📚 相关文档\n\n- [七牛云官方文档](https://developer.qiniu.com/)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [七牛云 MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [qshell 命令行工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n- [OpenClaw 技能开发指南](https://docs.openclaw.ai/skills)\n\n---\n\n## 🎯 未来计划\n\n- [ ] 支持增量同步\n- [ ] 支持断点续传进度查询\n- [ ] 支持文件加密上传\n- [ ] 支持 Webhook 通知\n- [ ] 支持多存储桶管理\n- [ ] 支持访问统计分析\n\n---\n\n## 👤 作者\n\n- **创建者**：33 (AI 助手)\n- **创建日期**：2026-03-01\n- **版本**：v1.0.0\n- **参考**：Tencent Cloud COS 技能架构\n\n---\n\n## 📞 支持\n\n如有问题，请在 OpenClaw 中联系 33。\n\n---\n\n## 📄 许可证\n\nMIT License\n\nFile v1.0.0:README.md\n\n# Qiniu KODO 技能\n\n七牛云对象存储技能 - 通过 MCP 工具 + Node.js SDK + qshell 管理七牛云存储\n\n## 🚀 快速开始\n\n### 1. 检查环境\n\n```bash\nbash scripts/setup.sh --check-only\n```\n\n### 2. 配置凭证\n\n如果环境检查未通过，运行：\n\n```bash\nbash scripts/setup.sh \\\n  --access-key \"<你的AccessKey>\" \\\n  --secret-key \"<你的SecretKey>\" \\\n  --region \"z0\" \\\n  --bucket \"<你的存储桶名称>\" \\\n  --domain \"http://你的域名.com\"\n```\n\n**获取凭证：**\n- 密钥管理：https://portal.qiniu.com/user/key\n- 存储桶列表：https://portal.qiniu.com/kodo/bucket\n\n### 3. 开始使用\n\n**命令行：**\n\n```bash\n# 上传文件\nnode scripts/qiniu_node.mjs upload --local /path/to/file.txt --key uploads/file.txt\n\n# 下载文件\nnode scripts/qiniu_node.mjs download --key uploads/file.txt --local /path/to/file.txt\n\n# 列出文件\nnode scripts/qiniu_node.mjs list --prefix uploads/\n\n# 获取 URL\nnode scripts/qiniu_node.mjs url --key uploads/file.txt\n```\n\n**在 OpenClaw 中：**\n\n```\n帮我上传 /backups/daily.tar.gz 到七牛云\n```\n\n## 📚 完整文档\n\n查看 [SKILL.md](./SKILL.md) 获取完整文档。\n\n## 🔗 相关链接\n\n- [七牛云官网](https://www.qiniu.com/)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [qiniu-mcp-server](https://github.com/qiniu/qiniu-mcp-server)\n- [qshell 工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78r3ca13npsxrn5f905res8n821ssm\",\n  \"slug\": \"qiniu-kodo\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1772407130287\n}\n\nFile v1.0.0:docs/EXAMPLES.md\n\n# 七牛云 KODO 技能 - 使用示例\n\n本文档包含七牛云 KODO 技能的各种使用示例。\n\n---\n\n## 📤 示例1：上传文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```\n优先级 1：尝试使用 qiniu-mcp MCP 工具\n优先级 2：如果 MCP 不可用，使用 Python SDK\n优先级 3：如果 SDK 也不可用，使用 qshell\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local /backups/daily-20260301.tar.gz \\\n  --key backups/daily-20260301.tar.gz\n```\n\n---\n\n## 📋 示例2：列出文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n### 命令行方式\n\n```bash\n# 列出所有文件\nnode scripts/qiniu_node.mjs list\n\n# 列出指定前缀的文件\nnode scripts/qiniu_node.mjs list --prefix backups/ --limit 50\n\n# JSON 格式输出\nnode scripts/qiniu_node.mjs list --prefix backups/ --format json\n```\n\n---\n\n## 🔗 示例3：获取文件 URL\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n### 命令行方式\n\n```bash\n# 公开空间 URL\nnode scripts/qiniu_node.mjs url --key images/photo.jpg\n\n# 私有空间 URL（1小时有效）\nnode scripts/qiniu_node.mjs url --key documents/report.pdf --private --expires 3600\n```\n\n---\n\n## 🗑️ 示例4：删除文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n删除七牛云上的 old-backup.tar.gz\n```\n\n**AI 执行：**\n```\n1. 先确认：是否真的要删除？\n2. 用户确认后执行删除\n```\n\n**返回：**\n```\n✅ 删除成功！\n\n文件：old-backup.tar.gz\n```\n\n### 命令行方式\n\n```bash\n# 删除单个文件（需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz\n\n# 强制删除（不需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz --force\n\n# 批量删除\ncat > delete-list.txt << EOF\nbackups/backup-20260101.tar.gz\nbackups/backup-20260102.tar.gz\nEOF\n\nnode scripts/qiniu_node.mjs batch-delete --file delete-list.txt\n```\n\n---\n\n## 📊 示例5：获取文件信息\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n查看 documents/report.pdf 的详细信息\n```\n\n**返回：**\n```\n📊 文件信息：\n\n文件名：documents/report.pdf\n大小：2.5 MB\n类型：application/pdf\nHash：FhGxK...（文件哈希值）\n修改时间：2026-03-01 15:30:00\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs stat --key documents/report.pdf\n```\n\n---\n\n## 📥 示例6：下载文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n从七牛云下载 documents/report.pdf 到本地\n```\n\n**返回：**\n```\n✅ 下载成功！\n\n文件：documents/report.pdf\n大小：2.5 MB\n保存到：/downloads/report.pdf\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key documents/report.pdf \\\n  --local /downloads/report.pdf\n```\n\n---\n\n## 🔄 示例7：移动和复制文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 temp/file.txt 移动到 archive/file.txt\n```\n\n**返回：**\n```\n✅ 文件已移动\n\n原路径：temp/file.txt\n新路径：archive/file.txt\n```\n\n### 命令行方式（需要扩展）\n\n```bash\n# 移动文件（需要扩展 Python 脚本）\n# 复制文件（需要扩展 Python 脚本）\n```\n\n---\n\n## 🖼️ 示例8：图片处理（需要 MCP）\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```\n使用 qiniu-mcp MCP 工具进行图片处理\n（需要 MCP 工具支持）\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://your-domain.com/images/photo.jpg\n处理后：http://your-domain.com/images/photo.jpg?imageView2/1/w/800/h/600|watermark/...\n```\n\n---\n\n## 🤖 示例9：自动化备份脚本\n\n### 完整脚本\n\n```bash\n#!/bin/bash\n\n# 每日备份脚本\nBACKUP_DIR=\"/backups\"\nDATE=$(date +%Y%m%d)\nBACKUP_FILE=\"backup-${DATE}.tar.gz\"\n\n# 1. 创建备份\necho \"📦 创建备份...\"\ntar -czf \"${BACKUP_DIR}/${BACKUP_FILE}\" /data\n\n# 2. 上传到七牛云\necho \"📤 上传到七牛云...\"\ncd /home/node/.openclaw/workspace/skills/qiniu-kodo\nnode scripts/qiniu_node.mjs upload \\\n  --local \"${BACKUP_DIR}/${BACKUP_FILE}\" \\\n  --key \"backups/${BACKUP_FILE}\"\n\n# 3. 清理本地旧备份（保留7天）\necho \"🗑️  清理旧备份...\"\nfind ${BACKUP_DIR} -name \"backup-*.tar.gz\" -mtime +7 -delete\n\n# 4. 清理云端旧备份（保留30天）\necho \"🗑️  清理云端旧备份...\"\npython -c \"\nfrom scripts.qiniu_python import QiniuKodo\nfrom datetime import datetime, timedelta\n\nkodo = QiniuKodo()\ncutoff = datetime.now() - timedelta(days=30)\n\nfor file in kodo.list_files(prefix='backups/'):\n    if datetime.fromtimestamp(file['mtime']) < cutoff:\n        kodo.delete(file['key'])\n        print(f'已删除: {file[\\\"key\\\"]}')\n\"\n\necho \"✅ 备份完成！\"\n```\n\n---\n\n## 📝 示例10：批量操作\n\n### 批量上传图片\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\nimport os\n\nkodo = QiniuKodo()\n\nimage_dir = \"/path/to/images\"\nuploaded = 0\n\nfor filename in os.listdir(image_dir):\n    if filename.endswith(('.jpg', '.png', '.gif')):\n        local_path = os.path.join(image_dir, filename)\n        key = f\"images/{filename}\"\n\n        try:\n            result = kodo.upload(local_path, key)\n            print(f\"✅ {filename} -> {result['url']}\")\n            uploaded += 1\n        except Exception as e:\n            print(f\"❌ {filename} 上传失败: {e}\")\n\nprint(f\"\\n✅ 共上传 {uploaded} 个文件\")\n```\n\n---\n\n## 🔧 高级用法\n\n### 使用配置文件\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\n# 使用自定义配置文件\nkodo = QiniuKodo(config_path='/path/to/custom-config.json')\n\n# 上传文件\nresult = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n```\n\n### 错误处理\n\n```python\nfrom scripts.qiniu_python import QiniuKodo\n\nkodo = QiniuKodo()\n\ntry:\n    result = kodo.upload('/path/to/file.txt', 'uploads/file.txt')\n    print(f\"上传成功: {result['url']}\")\nexcept FileNotFoundError as e:\n    print(f\"文件不存在: {e}\")\nexcept Exception as e:\n    print(f\"上传失败: {e}\")\n```\n\n---\n\n## 🎯 更多示例\n\n查看 [SKILL.md](../SKILL.md) 获取更多详细信息和 API 文档。\n\nFile v1.0.0:config/qiniu-config.example.json\n\n{\n  \"accessKey\": \"你的AccessKey\",\n  \"secretKey\": \"你的SecretKey\",\n  \"bucket\": \"你的存储桶名称\",\n  \"region\": \"z0\",\n  \"domain\": \"http://你的域名.com\",\n  \"options\": {\n    \"use_https\": true,\n    \"use_cdn\": true,\n    \"timeout\": 30,\n    \"upload_threshold\": 4194304,\n    \"chunk_size\": 4194304,\n    \"retry_times\": 3\n  }\n}","readmeExcerpt":"Skill: qiniu-kodo Owner: langhuachuanshi Summary: 七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Tags: cloud:1.0.3, kodo:1.0.3, latest:1.0.3, oss:1.0.3, qiniu:1.0.3, storage:1.0.3 Version history: v1.0.3 | 2026-03-06T17:10:15.394Z | auto Version 1.0.3 of qiniu-kodo - No file changes detected in this release. - Documentation, features, and dependencies remain unchanged. v1.0.2 |","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 进入技能目录\ncd ~/.openclaw/workspace/skills/qiniu-kodo\n\n# 运行自动安装\nbash scripts/setup.sh"},{"language":"bash","snippet":"bash scripts/setup.sh \\\n  --access-key \"YOUR_ACCESS_KEY\" \\\n  --secret-key \"YOUR_SECRET_KEY\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\""},{"language":"bash","snippet":"node scripts/qiniu_node.mjs test-connection"},{"language":"bash","snippet":"node scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\""},{"language":"bash","snippet":"node scripts/qiniu_node.mjs list --prefix \"uploads/\" --limit 100"},{"language":"bash","snippet":"node scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/save.txt\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: qiniu-kodo\ndescription: |\n  七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。\n  三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"☁️\",\n        \"requires\": { \"bins\": [\"node\", \"python3\", \"pip3\"], \"packages\": [\"qiniu\", \"qiniu-mcp-server\"] },\n        \"install\":\n          [\n            { \"id\": \"qiniu-sdk\", \"kind\": \"node\", \"package\": \"qiniu\", \"label\": \"Install qiniu Node.js SDK\" },\n            { \"id\": \"qiniu-mcp\", \"kind\": \"python\", \"package\": \"qiniu-mcp-server\", \"label\": \"Install qiniu-mcp-server\" },\n          ],\n      },\n  }\n---\n\n# ☁️ 七牛云 KODO 技能\n\n通过 **MCP 工具** / **Node.js SDK** / **qshell CLI** 管理七牛云对象存储。\n\n---\n\n## 🎯 执行策略（三层降级）\n\n| 优先级 | 工具 | 使用场景 |\n|--------|------|----------|\n| **1** | `qiniu-mcp-server` | 功能最全，优先使用 |\n| **2** | Node.js SDK | MCP 不可用时降级 |\n| **3** | qshell CLI | 最后备选 |\n\n---\n\n## 🚀 快速开始\n\n### 1. 安装依赖\n\n```bash\n# 进入技能目录\ncd ~/.openclaw/workspace/skills/qiniu-kodo\n\n# 运行自动安装\nbash scripts/setup.sh\n```\n\n### 2. 配置凭证\n\n```bash\nbash scripts/setup.sh \\\n  --access-key \"YOUR_ACCESS_KEY\" \\\n  --secret-key \"YOUR_SECRET_KEY\" \\\n  --region \"z0\" \\\n  --bucket \"mybucket\"\n```\n\n### 3. 测试连接\n\n```bash\nnode scripts/qiniu_node.mjs test-connection\n```\n\n---\n\n## 📋 使用示例\n\n### 上传文件\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local \"/path/to/file.txt\" \\\n  --key \"uploads/file.txt\"\n```\n\n### 列出文件\n\n```bash\nnode scripts/qiniu_node.mjs list --prefix \"uploads/\" --limit 100\n```\n\n### 下载文件\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key \"uploads/file.txt\" \\\n  --local \"/path/to/save.txt\"\n```\n\n### 删除文件\n\n```bash\nnode scripts/qiniu_node.mjs delete --key \"uploads/file.txt\" --force\n```\n\n### 获取文件 URL\n\n```bash\n# 公开空间\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\"\n\n# 私有空间（1小时有效）\nnode scripts/qiniu_node.mjs url --key \"uploads/file.txt\" --private --expires 3600\n```\n\n---\n\n## 🔧 Node.js SDK API\n\n| 命令 | 说明 |\n|------|------|\n| `upload --local <path> --key <key>` | 上传文件 |\n| `download --key <key> --local <path>` | 下载文件 |\n| `list [--prefix <p>] [--limit <n>]` | 列出文件 |\n| `delete --key <key> [--force]` | 删除文件 |\n| `url --key <key> [--private] [--expires <s>]` | 获取 URL |\n| `stat --key <key>` | 文件信息 |\n| `move --src-key <a> --dest-key <b>` | 移动文件 |\n| `copy --src-key <a> --dest-key <b>` | 复制文件 |\n| `test-connection` | 测试连接 |\n\n---\n\n## ⚙️ 配置文件\n\n**config/qiniu-config.json**\n\n```json\n{\n  \"accessKey\": \"YOUR_ACCESS_KEY\",\n  \"secretKey\": \"YOUR_SECRET_KEY\",\n  \"bucket\": \"mybucket\",\n  \"region\": \"z0\",\n  \"domain\": \"https://cdn.example.com\"\n}\n```\n\n**区域代码**：\n- `z0` - 华东（杭州）\n- `z1` - 华北（河北）\n- `z2` - 华南（广州）\n- `na0` - 北美（洛杉矶）\n- `as0` - 东南亚（新加坡）\n\n---\n\n## 🐛 故障排查\n\n| 问题 | 解决 |\n|------|------|\n| `Cannot find module 'qiniu'` | `npm install qiniu` |\n| `401 Unauthorized` | 检查 AccessKey/SecretKey |\n| `连接超时` | 检查区域代码和网络 |\n\n---\n\n## 📚 相关链接\n\n- [七牛云 MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [七牛云 Node.js SDK](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [qshell 工具](https://developer.qiniu.com/kodo/tools/1302/qshell)\n\n---\n\n## 📄 许可证\n\nMIT Lic"},{"path":"README.md","content":"# ☁️ 七牛云 KODO 技能\n\nOpenClaw 技能，用于管理七牛云对象存储（KODO）。\n\n## ✨ 功能\n\n- 📤 上传文件\n- 📥 下载文件\n- 📋 列出文件\n- 🗑️ 删除文件\n- 🔗 获取文件 URL（支持私有空间签名）\n- 📊 查看文件信息\n- 📁 移动/复制文件\n\n## 🚀 快速开始\n\n```bash\n# 安装依赖\nnpm install\n\n# 配置凭证\nbash scripts/setup.sh --access-key \"xxx\" --secret-key \"xxx\" --region \"z0\" --bucket \"mybucket\"\n\n# 测试连接\nnode scripts/qiniu_node.mjs test-connection\n```\n\n## 📖 使用示例\n\n```bash\n# 上传\nnode scripts/qiniu_node.mjs upload --local file.txt --key uploads/file.txt\n\n# 列出\nnode scripts/qiniu_node.mjs list --prefix uploads/\n\n# 下载\nnode scripts/qiniu_node.mjs download --key uploads/file.txt --local file.txt\n\n# 删除\nnode scripts/qiniu_node.mjs delete --key uploads/file.txt --force\n\n# 获取 URL\nnode scripts/qiniu_node.mjs url --key uploads/file.txt\n```\n\n## 🔧 架构\n\n三层降级策略：\n1. **MCP 工具** (`qiniu-mcp-server`) - 功能最全\n2. **Node.js SDK** (`qiniu`) - 稳定可靠\n3. **qshell CLI** - 官方命令行\n\n## 📄 许可证\n\nMIT"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78r3ca13npsxrn5f905res8n821ssm\",\n  \"slug\": \"qiniu-kodo\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1772817015394\n}"},{"path":"docs/EXAMPLES.md","content":"# 七牛云 KODO 技能 - 使用示例\n\n本文档包含七牛云 KODO 技能的各种使用示例。\n\n---\n\n## 📤 示例1：上传文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n帮我上传 /backups/daily-20260301.tar.gz 到七牛云\n```\n\n**AI 执行：**\n```\n优先级 1：尝试使用 qiniu-mcp MCP 工具\n优先级 2：如果 MCP 不可用，使用 Python SDK\n优先级 3：如果 SDK 也不可用，使用 qshell\n```\n\n**返回：**\n```\n✅ 上传成功！\n\n文件：daily-20260301.tar.gz\n大小：15.2 MB\nURL：http://your-domain.com/backups/daily-20260301.tar.gz\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs upload \\\n  --local /backups/daily-20260301.tar.gz \\\n  --key backups/daily-20260301.tar.gz\n```\n\n---\n\n## 📋 示例2：列出文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n列出七牛云 backups 目录下的所有文件\n```\n\n**返回：**\n```\n📋 共找到 15 个文件：\n\nbackups/backup-20260301.tar.gz  - 15.2 MB  - 2026-03-01 20:00\nbackups/backup-20260228.tar.gz  - 14.8 MB  - 2026-02-28 20:00\nbackups/backup-20260227.tar.gz  - 16.1 MB  - 2026-02-27 20:00\n...\n```\n\n### 命令行方式\n\n```bash\n# 列出所有文件\nnode scripts/qiniu_node.mjs list\n\n# 列出指定前缀的文件\nnode scripts/qiniu_node.mjs list --prefix backups/ --limit 50\n\n# JSON 格式输出\nnode scripts/qiniu_node.mjs list --prefix backups/ --format json\n```\n\n---\n\n## 🔗 示例3：获取文件 URL\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n给我 images/photo.jpg 的访问链接，1小时有效\n```\n\n**返回：**\n```\n🔗 临时访问链接（1小时有效）：\n\nhttp://your-domain.com/images/photo.jpg?e=1583097600&token=...\n```\n\n### 命令行方式\n\n```bash\n# 公开空间 URL\nnode scripts/qiniu_node.mjs url --key images/photo.jpg\n\n# 私有空间 URL（1小时有效）\nnode scripts/qiniu_node.mjs url --key documents/report.pdf --private --expires 3600\n```\n\n---\n\n## 🗑️ 示例4：删除文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n删除七牛云上的 old-backup.tar.gz\n```\n\n**AI 执行：**\n```\n1. 先确认：是否真的要删除？\n2. 用户确认后执行删除\n```\n\n**返回：**\n```\n✅ 删除成功！\n\n文件：old-backup.tar.gz\n```\n\n### 命令行方式\n\n```bash\n# 删除单个文件（需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz\n\n# 强制删除（不需要确认）\nnode scripts/qiniu_node.mjs delete --key backups/old-backup.tar.gz --force\n\n# 批量删除\ncat > delete-list.txt << EOF\nbackups/backup-20260101.tar.gz\nbackups/backup-20260102.tar.gz\nEOF\n\nnode scripts/qiniu_node.mjs batch-delete --file delete-list.txt\n```\n\n---\n\n## 📊 示例5：获取文件信息\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n查看 documents/report.pdf 的详细信息\n```\n\n**返回：**\n```\n📊 文件信息：\n\n文件名：documents/report.pdf\n大小：2.5 MB\n类型：application/pdf\nHash：FhGxK...（文件哈希值）\n修改时间：2026-03-01 15:30:00\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs stat --key documents/report.pdf\n```\n\n---\n\n## 📥 示例6：下载文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n从七牛云下载 documents/report.pdf 到本地\n```\n\n**返回：**\n```\n✅ 下载成功！\n\n文件：documents/report.pdf\n大小：2.5 MB\n保存到：/downloads/report.pdf\n```\n\n### 命令行方式\n\n```bash\nnode scripts/qiniu_node.mjs download \\\n  --key documents/report.pdf \\\n  --local /downloads/report.pdf\n```\n\n---\n\n## 🔄 示例7：移动和复制文件\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 temp/file.txt 移动到 archive/file.txt\n```\n\n**返回：**\n```\n✅ 文件已移动\n\n原路径：temp/file.txt\n新路径：archive/file.txt\n```\n\n### 命令行方式（需要扩展）\n\n```bash\n# 移动文件（需要扩展 Python 脚本）\n# 复制文件（需要扩展 Python 脚本）\n```\n\n---\n\n## 🖼️ 示例8：图片处理（需要 MCP）\n\n### 在 OpenClaw 中\n\n**用户说：**\n```\n把 images/photo.jpg 缩小到 800x600，加水印\n```\n\n**AI 执行：**\n```\n使用 qiniu-mcp MCP 工具进行图片处理\n（需要 MCP 工具支持）\n```\n\n**返回：**\n```\n✅ 图片处理完成！\n\n原图：http://yo"},{"path":"skill-card.md","content":"## Description:\n\nQiniu Kodo helps agents manage Qiniu Cloud Kodo object storage by uploading, downloading, listing, deleting, inspecting, moving, copying objects, and generating file URLs through MCP, the Node.js SDK, or qshell.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[langhuachuanshi](https://clawhub.ai/user/langhuachuanshi)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and engineers use this skill to automate Qiniu Cloud Kodo object-storage workflows from an agent, including object upload, download, listing, deletion, metadata inspection, moves, copies, and URL generation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Credential exposure from persisted Qiniu keys or shared-shell usage.\n\nMitigation: Use narrowly scoped Qiniu credentials, avoid long-lived secrets in shared shells, and inspect shell startup files and mcporter configuration before and after setup.\n\nRisk: Cloud data loss from delete or batch-delete operations.\n\nMitigation: Avoid destructive operations on production buckets unless independent backups exist and the exact bucket, prefix, and object keys have been verified.\n\nRisk: Installation behavior may modify the user environment through global installs, downloads, and shell-profile edits.\n\nMitigation: Review the setup script before installing, prefer local package installation, and back up shell startup files before allowing setup changes.\n\n## Reference(s):\n\n- [Qiniu Kodo ClawHub skill page](https://clawhub.ai/langhuachuanshi/skills/qiniu-kodo)\n- [Qiniu MCP Server](https://github.com/qiniu/qiniu-mcp-server)\n- [Qiniu Node.js SDK documentation](https://developer.qiniu.com/kodo/sdk/1289/nodejs)\n- [Qiniu qshell tool documentation](https://developer.qiniu.com/kodo/tools/1302/qshell)\n- [Usage examples](docs/EXAMPLES.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON configuration examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May propose or run Qiniu object-storage actions that depend on configured credentials, bucket, region, domain, and installed Node.js or MCP tooling.]\n\n## Skill Version(s):\n\n1.0.3 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Skill: qiniu-kodo Owner: langhuachuanshi Summary: 七牛云 KODO 对象存储技能。支持文件上传、下载、列出、删除、获取 URL 等操作。 三层架构：MCP 工具（优先）→ Node.js SDK → qshell CLI。 Tags: cloud:1.0.3, kodo:1.0.3, latest:1.0.3, oss:1.0.3, qiniu:1.0.3, storage:1.0.3 Version history: v1.0.3 | 2026-03-06T17:10:15.394Z | auto Version 1.0.3 of qiniu-kodo - No file changes detected in this release. - Documentation, features, and dependencies remain unchanged. v1.0.2 |","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":954,"uniquenessScore":53,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T20:28:31.064Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T22:48:58.126Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}