Skill: liuboacean/mubu-integration (version 1.0.3)

--- name: mubu-integration description: 幕布笔记集成，支持登录认证、文档管理、文件夹操作、大纲导出等功能。触发词：幕布、mubu、大纲笔记、思维导图导出、幕布同步 --- # 幕布集成 Skill 幕布（mubu.com）是一款极简大纲笔记工具，支持一键生成思维导图。本 Skill 提供 API 集成能力。 ## 功能概览 | 功能 | 接口 | 说明 | |------|------|------| | 用户登录 | `POST /user/phone_login` | 手机号密码登录获取 Token | | Token 刷新 | 自动处理 | access_token 2小时过期，refresh_token 30天 | | 创建文件夹 | `POST /list/create_folder` | 在指定位置创建文件夹 | | 创建文档 | `POST /list/create_doc` | 创建新的大纲文档 | | 获取列表 | `GET /list/list` | 获取文件夹下的文档列表 | | 获取文档 | `GET /doc/get` | 获取文档详细内容 | | 更新文档 | `POST /doc/save` | 保存/更新文档内容 | | 删除文档 | `POST /list/delete` | 删除文档或文件夹 | | 移动文档 | `POST /list/move` | 移动文档到其他文件夹 | | 导出 Markdown | 本地转换 | 将大纲结构转换为 Markdown | ## API 基础信息 - **Base URL**: `https://api2.mubu.com/v3/api` - **认证方式**: JWT Token，通过请求头 `jwt-token` 传递 - **Content-Type**: `application/json;charset=UTF-8` ## 环境变量配置 在使用前，需要配置以下环境变量： ```bash export MUBU_PHONE="your_phone_number" # 幕布账号手机号 export MUBU_PASSWORD="your_password" # 幕布账号密码 ``` 或者直接在脚本中配置。 --- ## 使用说明 ### 1. 认证流程 ```python import requests import json def login(phone, password): """幕布登录获取 Token""" url = "https://api2.mubu.com/v3/api/user/phone_login" headers = { "Content-Type": "application/json;charset=UTF-8", "Origin": "https://mubu.com", "Referer": "https://mubu.com/", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" } data = { "phone": phone, "password": password, "callbackType": 0 } response = requests.post(url, headers=headers, json=data) result = response.json() if result.get("code") == 0: return { "token": result["data"]["token"], "user_id": result["data"]["user"]["id"], "username": result["data"]["user"]["name"] } else: raise Exception(f"登录失败: {result.get('msg')}") ``` ### 2. 创建文件夹 ```python def create_folder(token, name, parent_id="0"): """创建文件夹 Args: token: JWT Token name: 文件夹名称 parent_id: 父文件夹ID，根目录为 "0" Returns: 新创建的文件夹ID """ url = "https://api2.mubu.com/v3/api/list/create_folder" headers = { "Content-Type": "application/json;charset=UTF-8", "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } data = { "folderId": parent_id, "name": name } response = requests.post(url, headers=headers, json=data) result = response.json() if result.get("code") == 0: return result["data"]["folder"]["id"] else: raise Exception(f"创建文件夹失败: {result.get('msg')}") ``` ### 3. 创建文档 ```python def create_doc(token, name, folder_id="0", content=""): """创建文档 Args: token: JWT Token name: 文档名称 folder_id: 所在文件夹ID，根目录为 "0" content: 文档初始内容（大纲结构） Returns: 新创建的文档ID """ url = "https://api2.mubu.com/v3/api/list/create_doc" headers = { "Content-Type": "application/json;charset=UTF-8", "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } data = { "folderId": folder_id, "name": name, "content": content } response = requests.post(url, headers=headers, json=data) result = response.json() if result.get("code") == 0: return result["data"]["doc"]["id"] else: raise Exception(f"创建文档失败: {result.get('msg')}") ``` ### 4. 获取文档列表 ```python def get_list(token, folder_id="0"): """获取文件夹下的文档列表 Args: token: JWT Token folder_id: 文件夹ID，根目录为 "0" Returns: 文档和文件夹列表 """ url = f"https://api2.mubu.com/v3/api/list/list?folderId={folder_id}" headers = { "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } response = requests.get(url, headers=headers) result = response.json() if result.get("code") == 0: return result["data"] else: raise Exception(f"获取列表失败: {result.get('msg')}") ``` ### 5. 获取文档内容 ```python def get_doc(token, doc_id): """获取文档详细内容 Args: token: JWT Token doc_id: 文档ID Returns: 文档详细内容（包含大纲结构） """ url = f"https://api2.mubu.com/v3/api/doc/get?id={doc_id}" headers = { "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } response = requests.get(url, headers=headers) result = response.json() if result.get("code") == 0: return result["data"] else: raise Exception(f"获取文档失败: {result.get('msg')}") ``` ### 6. 保存文档 ```python def save_doc(token, doc_id, content, name=None): """保存/更新文档内容 Args: token: JWT Token doc_id: 文档ID content: 文档内容（JSON格式的大纲结构） name: 可选，更新文档名称 """ url = "https://api2.mubu.com/v3/api/doc/save" headers = { "Content-Type": "application/json;charset=UTF-8", "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } data = { "id": doc_id, "content": content } if name: data["name"] = name response = requests.post(url, headers=headers, json=data) result = response.json() if result.get("code") != 0: raise Exception(f"保存文档失败: {result.get('msg')}") ``` ### 7. 删除文档/文件夹 ```python def delete_item(token, item_id): """删除文档或文件夹 Args: token: JWT Token item_id: 文档或文件夹ID """ url = "https://api2.mubu.com/v3/api/list/delete" headers = { "Content-Type": "application/json;charset=UTF-8", "jwt-token": token, "Origin": "https://mubu.com", "Referer": "https://mubu.com/" } data = {"id": item_id} response = requests.post(url, headers=headers, json=data) result = response.json() if result.get("code") != 0: raise Exception(f"删除失败: {result.get('msg')}") ``` --- ## 大纲内容格式 幕布文档内容使用特定的 JSON 格式表示大纲结构： ```json { "node": { "id": "root", "text": "文档标题", "children": [ { "id": "node_1", "text": "一级标题", "children": [ { "id": "node_1_1", "text": "二级标题", "children": [] } ] }, { "id": "node_2", "text": "另一个一级标题", "children": [] } ] } } ``` --- ## Token 管理建议 由于幕布的 Token 有效期限制（access_token 2小时，refresh_token 30天），建议： 1. **本地缓存**: 将 Token 保存到本地文件（如 `~/.mubu_token`） 2. **自动刷新**: 在 Token 快过期时自动刷新 3. **错误重试**: 遇到 401 错误时重新登录 ```python import os import time import json TOKEN_FILE = os.path.expanduser("~/.mubu_token") def save_token(token_data): """保存 Token 到本地""" token_data["expires_at"] = time.time() + 7200 # 2小时后过期 with open(TOKEN_FILE, "w") as f: json.dump(token_data, f) def load_token(): """从本地加载 Token""" if os.path.exists(TOKEN_FILE): with open(TOKEN_FILE, "r") as f: return json.load(f) return None def is_token_valid(token_data): """检查 Token 是否有效""" if not token_data: return False return time.time() < token_data.get("expires_at", 0) ``` --- ## 导出 Markdown 将幕布大纲转换为 Markdown 格式： ```python def node_to_markdown(node, level=0): """将幕布节点转换为 Markdown""" lines = [] indent = " " * level bullet = "- " if level > 0 else "" lines.append(f"{indent}{bullet}{node['text']}") for child in node.get("children", []): lines.extend(node_to_markdown(child, level + 1)) return lines def export_markdown(doc_data): """导出文档为 Markdown""" root = doc_data.get("node", {}) lines = node_to_markdown(root) return "\n".join(lines) ``` --- ## 注意事项 1. **非官方 API**: 幕布未提供官方开放平台，此 Skill 基于逆向分析实现 2. **稳定性**: API 可能随版本更新而变化，如遇问题请反馈 3. **频率限制**: 请勿频繁调用，避免触发限流 4. **数据安全**: Token 存储在本地，请勿泄露 --- ## Agent 使用指引 当用户提到幕布、mubu、大纲笔记相关操作时，使用本 Skill 的脚本完成操作。 ### 前置检查 1. 确认系统已安装 Python 3 和 requests 库： ```bash python3 -c "import requests; print('OK')" ``` 如果缺少 requests：`pip3 install requests` 2. 确认环境变量已配置： - `MUBU_PHONE` — 幕布手机号 - `MUBU_PASSWORD` — 幕布密码 - 如未配置，需提示用户先设置 ### 脚本路径 ``` ~/.workbuddy/skills/mubu-integration/scripts/mubu_api.py ``` ### 常用命令速查 | 用户意图 | 执行命令 | |---------|---------| | 登录幕布 | `python3 scripts/mubu_api.py login` | | 查看文档列表 | `python3 scripts/mubu_api.py list` | | 查看某文件夹 | `python3 scripts/mubu_api.py list --folder <folder_id>` | | 创建文件夹 | `python3 scripts/mubu_api.py mkdir "文件夹名"` | | 创建文档 | `python3 scripts/mubu_api.py create "文档名" --folder <folder_id>` | | 获取文档内容 | `python3 scripts/mubu_api.py get <doc_id>` | | 导出为 Markdown | `python3 scripts/mubu_api.py get <doc_id> --export markdown` | | 从文件保存文档 | `python3 scripts/mubu_api.py save <doc_id> --file content.md` | | 删除文档 | `python3 scripts/mubu_api.py delete <id>` | ### 典型工作流 **场景 1：用户说"把这份大纲同步到幕布"** 1. 确认内容来源（文件或对话中直接提供） 2. 如果是 Markdown，直接用脚本创建文档并导入 3. 返回新文档 ID 和链接 **场景 2：用户说"导出我的幕布笔记"** 1. 先列出文档列表让用户选择，或按名称搜索 2. 获取文档内容 3. 转换为 Markdown 格式返回 **场景 3：用户说"在幕布建一个项目文件夹"** 1. 确认文件夹名称和层级结构 2. 批量创建文件夹 3. 返回创建结果 --- ## 工作流示例 ### 示例 1: 从 Markdown 创建幕布文档 ``` 用户: 把这份 Markdown 大纲同步到幕布 ``` 执行步骤： 1. 解析 Markdown 结构 2. 转换为幕布 JSON 格式 3. 登录获取 Token 4. 创建文档并保存内容 ### 示例 2: 导出幕布文档为 Markdown ``` 用户: 导出我的"读书笔记"文档 ``` 执行步骤： 1. 登录获取 Token 2. 搜索文档 3. 获取文档内容 4. 转换为 Markdown 并返回 ### 示例 3: 批量创建文件夹结构 ``` 用户: 在幕布创建项目文档结构：需求分析、设计文档、开发日志、测试报告 ``` 执行步骤： 1. 登录获取 Token 2. 创建项目文件夹 3. 批量创建子文件夹 4. 返回创建结果


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)