把 muse.ai 的网页端能力包装成可自托管的视频创作站:导入 muse 账号 → 用账号池额度生成视频 → 在画布上编排。全部跑在本机,不依赖第三方云服务。
上游复用开源项目 muse2api(把 muse.ai 逆向封成 OpenAI 兼容 API,靠无头 Chrome + CDP 驱动网页端)。本仓库在它之上补了平台层。
┌──────────────┐ HTTP ┌─────────────────┐ HTTP ┌──────────────┐ CDP ┌────────┐ HTTPS ┌──────────┐
│ 浏览器 web/ │ ────────► │ 平台 server/ │ ────────► │ 上游 muse2api │ ────► │ Chrome │ ──────► │ muse.ai │
│ React SPA │ :8787 │ Node + SQLite │ :18610 │ FastAPI │ :19210│ 无头 │ │ 网页端 │
└──────────────┘ │ 任务/账号/作品 │ │ 账号池/生成 │ └────────┘ └──────────┘
└─────────────────┘ └──────────────┘
- 上游:负责「怎么让 muse.ai 真的生成出东西」——浏览器驱动、Cookie 会话、附件上传、结果抓取。
- 平台:负责「怎么用得顺」——登录、账号导入与额度、任务编排、画面预览、画布。
两层解耦。升级上游只需 cd upstream/muse2api && git pull,不影响平台代码。
深色创作台风格:底色 #0a0d16,薄荷绿 #0fa98a → #4fe3c1 点缀;细侧栏只保留三个入口。当前界面已按这三张原型重做。
![]() 快捷创作 · 项目栏 + 任务网格 + 底部 WORKBENCH(提示词 / 参考画面 / 时长 / 比例 / Params / Queue / Generate) |
|
![]() 无限画布 · 点状网格、玻璃节点、悬浮生成条、小地图 |
![]() muse 导入 · 账号卡片 + 周额度 + 右侧一键绑定流程 |
- Windows 10/11(也支持 Linux / macOS;启停脚本目前是 PowerShell)
- Node.js 20+(本机实测 24.13)
- Python 3.11(
upstream/muse2api) - Chrome(装在默认路径即可,上游会自动探测)
git clone https://github.com/LIUFelix2004/museAPI-video.git
cd museAPI-video
.\start.ps1 # 启动上游 + 平台
.\start.ps1 -Build # 改过前端后,先构建再启动
.\stop.ps1 # 全部停止首次运行会自动创建 Python venv、安装依赖、打包扩展,等它跑完即可。
| 入口 | 地址 |
|---|---|
| 平台 | http://127.0.0.1:8787 |
| 上游面板(调试用) | http://127.0.0.1:18610/admin?key=m2a_muse_studio_local_2026 |
默认管理员:[email protected] / admin123456
对外暴露前,务必改掉
server/.env里的ADMIN_PASSWORD和JWT_SECRET。
| 功能 | 路由 | 说明 |
|---|---|---|
| 快捷创作 | /create |
项目栏 + 任务网格 + WORKBENCH:提示词、@ 引用参考图、模型/时长/画幅、参数面板、任务队列、生成 |
| 无限画布 | /canvas |
节点拖拽、缩放平移、多选删除、双击改文本、自动保存、节点级生成 |
| muse 导入 | /accounts |
三种导入方式、额度查询、检测、保活、删除 |
登录后直接进入 /create,侧栏只有这三项。
其余页面(首页、论坛、会员、充值、邀请、团队、API 平台、设置、历史、运营后台)已下线,源码仍在
web/src/pages/。需要时在App.jsx里加回 import 和 Route 即可。
没有导入账号,平台什么都生成不了。 平台本身不产生内容,只是把你的 muse.ai 账号变成可调用的生成能力——每次点「生成」,上游都会用你导入的账号去 muse.ai 网页端跑一遍。
muse.ai 的登录态主要靠 hatch_sess,它是 HttpOnly Cookie:
- 在页面里执行
document.cookie—— 读不到它 - DevTools → Application 能看到它,但那是浏览器内部视图,网页 JS 访问不到
想拿到它,只有三条路:浏览器扩展(能读 HttpOnly)、从网络请求头里抄、或 让上游自己的浏览器登录一次。下面三种导入方式对应这三条路。
| 方式 | 是否手拷 Cookie | 需要什么 | 适合 |
|---|---|---|---|
| 一、一键绑定(推荐) | 不用 | 装一次浏览器扩展 | 日常使用,最省事 |
| 二、手动粘贴 | 要,从 Network 面板抄 | 会用 DevTools | 不想装扩展,或临时加号 |
| 三、上游面板直连 | 不用 | 上游 key | 调试,或用上游自带导号工具 |
原理:平台页面生成一次性绑定码 → 扩展在浏览器里读出 muse.ai 的全部 Cookie(含 HttpOnly)→ 提交给平台 → 平台转给上游入库。
- 打开平台 → 左侧 muse 导入 → 点右上角 「一键绑定」
- 在弹窗里展开「还没装扩展?」,点 「下载扩展包 (.zip)」
(也可以直接用仓库里的extension/目录) - 解压到一个不会被删的固定位置
- Chrome 地址栏输入
chrome://extensions - 打开右上角 「开发者模式」
- 点 「加载已解压的扩展程序」,选刚才解压出来的文件夹
- 工具栏出现扩展图标即成功
更新过扩展代码后,要回
chrome://extensions点一次「重新加载」,否则浏览器还在跑旧代码。
打开 https://muse.ai/,能看到聊天界面即可。
扩展读的是「你点绑定按钮的那个浏览器」里的登录态,不是服务器上的。 若在 A 电脑装扩展、在 B 电脑登录 muse.ai,绑不上。
两种走法任选其一:
走法 A(自动)
- 平台点 「一键绑定」 → 生成绑定码
- 点弹窗里的 「打开」(跳到
/bind/<码>) - 扩展检测到绑定码 → 自动读 Cookie → 提交 → 页面显示「绑定成功」
走法 B(手动填码,适合给第二个账号用)
-
平台点 「一键绑定」,复制 绑定码
-
点浏览器工具栏的扩展图标
-
三个框这样填:
框 填什么 平台地址 http://127.0.0.1:8787(部署在服务器就填服务器地址)绑定码 刚才复制的那个 备注名 随便,比如「主号」,可留空 -
点 「读取并绑定」
绑定码 20 分钟有效,且只能用一次。过期了就回平台重新点「一键绑定」。多账号请各自生成新码。
| 提示 | 原因 | 怎么办 |
|---|---|---|
| 没有读到 Cookie | 当前浏览器没登录 muse.ai | 先登录再试 |
| 读到 N 条但没有 hatch_sess | 登录态不对或已失效 | 重新登录 muse.ai |
| 该绑定码已使用过 | 重复提交 | 重新生成一个码 |
| 绑定码已过期 | 超过 20 分钟 | 重新生成一个码 |
| 扩展没有响应 | 扩展被禁用 / 页面没刷新 | 在 chrome://extensions 确认已启用,再刷新页面 |
不想装扩展,或只想临时加个账号时用这个。
| Cookie | 必要性 | 说明 |
|---|---|---|
hatch_sess |
必须有 | 登录会话本身,缺它平台会直接拒绝 |
hatch_vml |
强烈建议 | 决定账号剩余有效期(约 48 小时) |
hatch_gw |
可选 | 路由缓存,上游会自己重新签发 |
其他(datr、dpr、theme、wd、_fbp…) |
不需要 | 与登录态无关 |
一次复制全部,格式天然正确,最不容易出错。
- 在已登录 muse.ai 的标签页按
F12 - 切到 Network
- 按
F5刷新 - 点任意一条发往
muse.ai的请求(例如graphql) - 右侧 Headers → Request Headers
- 找到以
cookie:开头的那一行 - 右键 → Copy value
- 回到平台 → 「muse 导入」→ 「粘贴」 → 粘贴 → 起备注名 → 导入
复制出来大概长这样:
hatch_sess=eyJhbGciOi...; hatch_vml=v1%3A...; hatch_native_auth_device=...; datr=...; _fbp=...
能用,但容易出错:
- 表格里的值常被截断,
hatch_sess可能要往下滚才看得见 - 点 Value 只能一次复制一个,还得自己补
名字=前缀、拼分号 - 漏掉
hatch_vml会让有效期估算不准
如果只能从表格抄,最少要这两个,并手工拼成:hatch_sess=值; hatch_vml=值
hatch_sess(表格里可能显示成hatch_s...,800+ 字节的那行)hatch_vml(紧挨着的下一行)
平台解析比较宽松,下面这些都能吃:
- 带
Cookie:前缀 → 自动去掉 - 多行粘贴 → 自动合并成
;分隔 - 从表格复制的制表符分隔 → 一般也能识别
但只复制 Value、不带名字不行,必须有 hatch_sess= 前缀。
也可以在上游管理页直接导号:http://127.0.0.1:18610/admin
- Chrome 扩展:
upstream/muse2api/extension/,填服务地址http://127.0.0.1:18610+ Key - 油猴脚本:
upstream/muse2api/tools/muse2api_cookie_importer.user.js
这种方式导入的账号归属为空,即「公共池」,平台上所有用户共用。
| 状态 | 含义 |
|---|---|
| 可用(绿) | 最近一次检测通过 |
| 待检测(黄) | 刚导入,还没验证过 |
| 异常(红) | 检测失败,多半是 Cookie 过期 |
| 上游已删 | 上游账号池里没有了(在别处删过) |
导入后点账号卡片上的 「点此查询」(或页面顶部「刷新」的额度汇总),平台会调上游打开浏览器去 muse.ai 设置页读一次额度,返回:
- 周额度已用百分比(muse 免费版按周限额)
- 重置日期
- 额外额度(通常是「剩余 xx 亿个词元」)
顶栏 1 账号 · 剩 60% 就来自这里。多账号时显示平均值;账号页另有「额度合计」(各账号余量相加,例如三个账号剩 60/40/20% → 合计 120%)。
额度不会自动刷新——查询要开浏览器读页面,比较重。因此是手动触发 + 60 秒本地缓存。
muse 会话约 48 小时。到期后:
- 账号状态会变成「异常」
- 生成请求会返回 401
重新导入一次即可。点 「保活」 可让上游尝试续期(不保证成功,取决于上游是否重新签发)。
账号池按「最久未用」自动轮转,互不阻塞。给每个账号单独生成绑定码即可。
- 在底部 WORKBENCH 写画面描述
- 可选:点「图片」上传参考图(最多 3 张),正文里用
@引用 - 选时长(5 / 6 / 8 / 10 秒)和画幅(16:9 / 9:16 / 1:1)
- 点 「生成」
任务状态在中间网格实时刷新;完成后可预览、下载、删除。
参数面板:WORKBENCH 里的「参数」按钮,可调 Stylize / Chaos / Weird / IW / CW / SW / Seed / Quality,会拼成 --st 100 --chaos 20 这类字符串传给上游。
任务队列:点「+ 加入自动执行队列」,可按固定间隔自动重复提交同一提示词,支持暂停、恢复、上下移、清理已完成。
- 拖动节点、滚轮缩放、空格 / 中键拖动平移
Shift多选、Delete删除、双击改文本- 底部输入区写提示词 → 生成结果作为新节点出现
- 改动自动保存到浏览器本地
museAPI-video/
├── start.ps1 / stop.ps1 一键启停
├── extension/ 浏览器扩展(一键绑定)
│ ├── manifest.json
│ ├── background.js 读 muse.ai Cookie → POST /api/accounts/bind
│ ├── content.js 在 /bind/<码> 页面自动触发
│ └── popup.html/js 手动填码入口
├── upstream/muse2api/ 上游引擎(Python FastAPI,未改动)
│ ├── .env 上游配置(KEY / Chrome 路径 / 超时)
│ └── .venv/
├── server/ 平台后端(Node + SQLite)
│ ├── .env JWT / 上游地址 / 管理员
│ ├── public/ 扩展打包下载
│ ├── data/ SQLite、媒体、上传(备份就打包这个)
│ └── src/
│ ├── index.js 入口
│ ├── db.js 表结构与读写
│ ├── muse.js 上游客户端
│ ├── auth.js 登录
│ ├── worker.js 任务轮询 + 队列调度
│ └── routes/ auth / accounts / generate / queue / chat …
└── web/ 前端(React + Vite + Tailwind)
├── public/fonts/ 自托管字体
└── src/pages/ Create / Canvas / Accounts / Login / Bind
server/.env:
| 变量 | 默认 | 说明 |
|---|---|---|
PORT |
8787 | 平台端口 |
MUSE_BASE |
http://127.0.0.1:18610 |
上游地址 |
MUSE_KEY |
m2a_muse_studio_local_2026 |
上游 key(须与上游 .env 一致) |
ADMIN_EMAIL / ADMIN_PASSWORD |
[email protected] / admin123456 |
首次启动创建的管理员 |
JWT_SECRET |
随机 | 登录签名密钥,生产必换 |
upstream/muse2api/.env:
| 变量 | 默认 | 说明 |
|---|---|---|
MUSE2API_CHROMIUM |
自动探测 | Chrome 路径 |
MUSE2API_VIDEO_TIMEOUT |
900 | 视频生成超时(秒) |
MUSE2API_CONCURRENCY |
2 | 最大并发任务数 |
Q:导入成功了,但点生成提示「没有可用账号」
上游账号池为空,或账号状态是「异常」。去 muse 导入页看卡片状态,点「检测」确认。
Q:DevTools 的 Cookies 里找不到 hatch_sess
表格按字母排序,hatch_sess 在 hatch_gw、hatch_native_auth_device 下面,往下滚。若确实没有,说明这个浏览器没有登录成功。
Q:document.cookie 里没有 hatch_sess
正常。它是 HttpOnly,JS 读不到。用 Network 面板或扩展。
Q:生成一直卡在「生成中」
上游在跑浏览器,第一次启动 Chrome 会慢一些。超过 15 分钟会自动判失败并退还。若一直不动,看 upstream/muse2api/server.log。
Q:账号只用了几天就「异常」了
muse 会话约 48 小时,属正常。重新绑定即可。
Q:部署到服务器后打不开或 401
检查 server/.env 的 MUSE_BASE 是否指向上游;Nginx 反代建议放大超时并关闭 buffering:
location / {
proxy_pass http://127.0.0.1:8787;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_buffering off;
client_max_body_size 200M;
}Q:扩展旧版还能用吗
绑定通信标识已改为 museapi-video-ext。装过旧版的,请在 chrome://extensions 点一次「重新加载」,或删掉后重新加载新目录。
| 文件 | 内容 |
|---|---|
server/server.log |
平台日志(任务轮询、队列调度) |
server/server.err.log |
平台异常 |
upstream/muse2api/server.log |
上游日志(浏览器、生成) |
upstream/muse2api/server.err.log |
上游异常 |
平台数据库:server/data/studio.db(SQLite)。账号、任务、队列都在这里。
一键体检:
node scripts/acceptance.mjs # 路由 + 接口 + 鉴权边界
node scripts/test-bind.mjs # 一键绑定链路
node scripts/test-extension-logic.mjs # 扩展逻辑(沙箱执行 background.js)- 上游引擎:muse2api
- 本仓库平台层按仓库内文件约定使用;对外部署请自行遵守 muse.ai 服务条款


