- name
- wxwork-drive
- description
- Manage spaces, folders and files in WeChat Work WeDrive (企业微信微盘) via wiseflow-relay — create space, create folder, upload image/video, list, info, rename, move, delete, and share files via file-level share link. Standard flow 建空间 → 传文件 → file-share 发分享链接给同事. Credentials (corp_id + corp_secret) read from daemon.env and passed per-request; relay is stateless. Space/folder IDs cached locally in spaces.json.
- metadata
- {"openclaw":{"emoji":"💾","requires":{"bins":"[Truncated]"}}}
# WeChat Work WeDrive(企业微信微盘空间 + 文件管理)
经 relay 透传凭据,对微盘做完整管理:**建空间 → 建文件夹 → 上传 → 取文件分享链接(`file-share`)发给同事** 是主链路;另有列目录 / 取信息 / 重命名 / 移动 / 删除 / 空间安全设置 / 空间邀请链接等辅助接口。
> ⚠️ **分享标准用法 = `file-share`(文件级),不是 `space-share`(空间级)**。应用建的空间默认「邀请链接功能关闭」且 API 打不开(只能管理后台手动开),`space-share` 在未开启时报 `640028`。`file-share` 只要微盘权限就能用,发给同事直接看文件、无需加入空间。**默认走 `file-share`**,别白白去试 `space-share`。详见下文「典型流程」与「特殊用途接口」。
---
## 关键约束:往哪传文件
企业微信微盘的权限规则:**应用只能往「自己创建的文件夹」或「空间根目录」里传文件**,不能往他人/其他应用建的文件夹传。本应用 `space-create` 建空间后自动成为该空间超级管理员,所以根目录可传;但生产建议先 `mkdir` 建子文件夹再往里传,便于整理。整个文件夹/文件生命周期由本技能自行管理(relay 不替你记 spaceid/fileid)。
---
## 凭据与存储位置
- **企业微信凭据** `WXWORK_CORP_ID` + `WXWORK_CORP_SECRET` 存放在 `daemon.env`(实例级,朋友圈 + 微盘共用)。
- **relay 身份** `OFB_KEY` + `RELAY_BASE_URL` 同样来自 `daemon.env`(entrypoint 注入)。
- **空间/文件夹 ID 缓存** `spaces.json` 存放在本技能目录下(已 gitignore,实例级,非密):
```
skills/wxwork-drive/spaces.json
```
结构见 `spaces.example.json`:`{default_space, spaces:[{alias, spaceid, default_folderid?}]}`。`<space>` 参数统一接受 alias 或裸 spaceid。
### 凭据缺失时 Agent 行为
1. 若 `WXWORK_CORP_ID` / `WXWORK_CORP_SECRET` 未配置:**先读同目录 `REFERENCE.md`**,按其中步骤指导用户获取企业 ID + 应用 Secret(含 relay 可信 IP `123.60.18.144` 的配置、微盘权限开通)。
2. 收到值后,**交给 IT engineer** 写入 `daemon.env` 并重启实例(或按 `REFERENCE.md` 用户自助 + 重启)。
3. 若 `OFB_KEY` 未配置:同样让 IT engineer 在 `daemon.env` 配置后重启。
---
## 命令
通过 PATH 调用 wrapper,无需拼接脚本路径。
```bash
wxwork-drive <subcommand> [args...]
```
### 空间管理(写 spaces.json)
| 子命令 | 用途 |
|--------|------|
| `space-create <alias> <space_name> [--default]` | 经 relay 创建空间并登记;`--default` 设为默认 |
| `space-add <alias> <spaceid> [--default]` | 登记一个已有空间 |
| `space-ls` | 列已登记空间 |
| `space-default <alias>` | 设默认空间 |
| `space-setting <space> [flags]` | 空间安全设置(开链接免审批等,见下) |
| `space-share <space>` | 取空间邀请链接(应用建的空间默认对普通用户不可见,把链接发给同事即可加入)。**注意:邀请链接功能本身需先在「企业微信管理后台 → 微盘 → 空间安全设置」开启,API(97876)只控制「链接加入是否免审批」,不控制「链接功能是否开启」;未开启时 `space-share` 报 `640028 space setting disable share url`** |
| `file-share <fileid>` | 取**文件级**分享链接(发给同事直接看文件,不需加入空间)。不依赖空间邀请链接功能,绕过 640028。**优先用这个** |
| `folder-default <space_alias> <folderid>` | 设某空间的默认上传文件夹 |
#### `space-setting` flags
| flag | 上游字段 | 说明 |
|------|---------|------|
| `--share-url-no-approve` | `share_url_no_approve=true` | 链接加入空间免审批(**邀请同事前通常要先开这个**,否则链接发出去对方加入会被审批卡住) |
| `--share-url-default-auth N` | `share_url_no_approve_default_auth` | 邀请链接默认权限:1仅下载 / 2可编辑 / 4仅预览 / 5可上传下载 / 200自定义 |
| `--enable-watermark` | `enable_watermark=true` | 水印(仅专业版) |
| `--enable-confidential` | `enable_confidential_mode=true` | 保密模式 |
| `--default-file-scope N` | `default_file_scope` | 文件默认可查看范围:1仅成员 / 2企业内 |
| `--ban-share-external` | `ban_share_external=true` | 禁止分享到企业外 |
只把显式传入的字段带上游,未传的字段保持原状。
### 文件管理(`<space>` 接受 alias 或裸 spaceid)
| 子命令 | 用途 | 关键参数 |
|--------|------|----------|
| `mkdir <space> <file_name> [--fatherid F] [--default-folder]` | 新建文件夹 | `--fatherid` 缺省=空间根;`--default-folder` 把新文件夹记为默认上传文件夹 |
| `upload <file> <space> [--fatherid F] [--name NAME]` | 上传图片/视频 | `--fatherid` 缺省=该空间 `default_folderid` |
| `ls <space> [--fatherid F] [sort_type] [limit] [start]` | 列目录 | `--fatherid` 缺省=空间根;sort_type 1名升2名降3大小升4大小降5mtime升6mtime降 |
| `info <fileid>` | 取文件/文件夹信息 | |
| `rename <fileid> <new_name>` | 重命名 | |
| `move <fatherid> <fileid> [fileid...] [--replace]` | 移动到目标目录 | `--replace` 重名覆盖 |
| `delete <fileid> [fileid...]` | 批量删除 | |
脚本自动:
- 从 `daemon.env` 读 corp 凭据 + relay 身份
- `upload` 按类型/大小自动选 `upload-image`(≤10M 图片)或 `upload-video`(视频或 >10M,relay 侧分块)
- 每条命令输出一行 JSON 结果(供 Agent 解析链式调用)+ 人类可读摘要
### 典型流程:从零上传到自建空间,再发文件分享链接
主链路 = **建空间 → 建文件夹 → 上传 → 取文件分享链接发给同事**。同事拿到链接直接看文件,不需加入空间。
```bash
# 1. 建空间(首次)并设为默认
wxwork-drive space-create main wiseflow素材 --default
# 2. 在空间根建文件夹,并记为默认上传文件夹
wxwork-drive mkdir main 2026-07 --default-folder
# 3. 上传(自动用 default_folderid)
wxwork-drive upload ./cover.jpg main
# 4. 取文件分享链接,发给同事即可直接看文件(不依赖空间邀请链接功能)
wxwork-drive file-share <上一步 upload 返回的 fileid>
# → share_url,发给同事
```
> **为什么主链路用 `file-share` 而不是 `space-share`**:应用建的空间默认「邀请链接功能关闭」,且这个开关 API(97876)打不开,只能去企业微信管理后台手动开。`space-share` 在未开启时报 `640028`。`file-share` 是文件级分享,只要微盘权限就能用,绕过这个限制。所以默认走 `file-share`;只有要让同事加入整个空间协作时才用 `space-share`(且需先在管理后台开邀请链接功能)。
### 特殊用途接口(主链路用不到,按需调)
| 子命令 | 何时用 |
|--------|--------|
| `space-setting` | 要开链接免审批 / 水印 / 保密模式 / 禁止外分享等空间级安全设置时。注意:**它打不开「邀请链接功能」本身**(那个只能管理后台开),只控制「链接加入是否免审批」等子项 |
| `space-share` | 要让同事**加入整个空间**协作(不只是看一个文件)时。前提:已在管理后台开邀请链接功能,否则报 `640028` |
| `ls` / `info` / `rename` / `move` / `delete` | 后续整理:列目录确认、改名、移动、删除 |
---
## 返回值
每条命令最后一行 JSON 即 relay 返回的业务包络(`{ ok, ...字段, detail }`)。常用字段:
- `space-create`:`spaceid`
- `mkdir` / `upload` / `rename`:`fileid`
- `upload`:`fast_forward: true` 表示命中秒传
- `file-share`:`share_url`(文件级分享链接,发给同事直接看文件)
- `space-share`:`space_share_url`(空间邀请链接,需管理后台开邀请链接功能)
- `ls`:`detail.file_list.item[]`,每项含 `fileid / file_name / file_type(1文件夹/2文件/3文档/4表格/5收集表) / file_size / mtime`
- `info`:`detail.file_info`
- `move` / `delete`:`detail`(上游回包)
`fileid` / `spaceid` 永久有效(未删除前),可长期引用。
---
## Agent 行为约束
1. **上传目标要合法**:`fatherid` 必须是空间根(spaceid)或本应用 `mkdir` 拿到的 fileid(或该空间已设 `default_folderid`)。往他人/其他应用建的文件夹传会 `no permission` 失败。
2. **链式调用时从上一条命令的 JSON 行提取 fileid**,不要凭空捏造。
3. **优先用 spaces.json 的 alias / default**,避免每次让用户重复传 spaceid。
4. 视频上传可能耗时较长(100MB 约 1–3 分钟),**等待脚本完整返回后**再进行下一步,期间告知用户"正在上传..."。
5. **禁止**手动拼接 curl 命令替代脚本。
---
## Error Handling
| 错误 | 原因 | 处理 |
|------|------|------|
| `WXWORK_CORP_ID / WXWORK_CORP_SECRET 未配置` | daemon.env 缺凭据 | 按 `REFERENCE.md` 引导用户获取,交 IT engineer 写 daemon.env + 重启 |
| `OFB_KEY 未配置` | daemon.env 缺 OFB_KEY | 让 IT engineer 配置后重启 |
| `MISSING_CORP_CREDENTIALS`(relay 400) | 请求体缺 corp_id/corp_secret | 检查 daemon.env 是否生效(需重启) |
| `MISSING_FIELD`(relay 400) | 缺必填字段(如 file_name) | 补全参数 |
| `GETTOKEN_FAILED`(relay 502) | corp_secret 错或 corp_id 不存在 | 核对凭据;按 `REFERENCE.md` 重新获取 |
| 上游 `errcode != 0`(relay 400) | 企业微信拒绝,`detail` 里是原始 errcode/errmsg | 看 errmsg:`no privilege`→按 REFERENCE.md 开通微盘权限;`no permission`→fatherid 是他人建的文件夹,改用空间根或自己 mkdir 出来的 fileid |
---
## Notes
- relay 在转发给企业微信前会剥离 `corp_id` / `corp_secret`,不下发
- relay 按 `(corp_id, corp_secret)` 缓存 access_token,client 无需自己管 token
- `spaces.json` 只存 ID(非密),gitignore 是因为实例级、避免跨部署污染
- 接口契约详见 `docs/WXWORK-DRIVE-API.md`,上游 API 详见[企业微信微盘文档](https://developer.work.weixin.qq.com/document/path/93654)
- 空间成员/部门增删、权限、空间重命名/解散属 admin 级,本技能不覆盖;用到再让 relay 加透传路由
عرض على GitHub