飞书零花钱助手是一个面向家庭场景的 Web 系统,核心交互在飞书群完成,后台提供移动端优先管理页面。
- 管理员初始化与账号体系(管理员/操作用户)
- 小孩管理:姓名、头像、每日额度、余额
- 操作用户绑定可控制小孩
- 飞书群消息识别:
- 调整每日零花钱额度
- 设置额外奖励项目与金额
- 扣除消费金额(支持负数扣除)
- 设置每周统计通知时间(每周一)
- 机器人主动通知:
- 金额变动通知
- 系统操作反馈通知
- 每周统计通知 + 使用建议
- 内置 MCP 服务器:支持四类后台操作工具
- 管理后台分区导航:按“小孩/操作员/系统配置/流水/模型/模板/周报”切换
backend/ 后端 API 与业务逻辑 frontend/ 移动端优先后台页面 mcp-server/ MCP 工具服务 docs/ 需求、飞书流程、部署文档
cd backend npm install npm run dev
cd frontend npm install npm run dev
cd mcp-server npm install
set MCP_BACKEND_TOKEN=你的管理员JWT set BACKEND_URL=http://localhost:3000 npm start
使用根目录 docker-compose.yml:
# 1. 复制环境变量示例
cp .env.example .env
# 2. 启动容器(首次,完全自动初始化)
# 3. 启动容器(首次)
docker compose up -d
# 3. 初始化管理员(仅首次,容器自动生成 JWT 密钥)
curl -X POST http://localhost:45174/api/init-admin \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"your-secure-password"}'
# 4. 登录并在 UI 中配置:
# - 飞书群机器人 webhook(在管理后台)
# - AI 模型配置:DeepSeek API key(在模型管理页面)
# - 其他小孩、奖励规则等| 配置项 | 位置 | 说明 |
|---|---|---|
| 飞书 Webhook | 系统配置 API | 管理员在 UI 中设置 |
| 模型 API Key | 模型管理页面 | 支持 DeepSeek、OpenAI、Google |
| 小孩绑定 | 系统 UI | 与飞书用户关联 |
- 系统会自动生成默认推荐模型
DeepSeek(可修改)。 - DeepSeek 默认 API 地址为
https://api.deepseek.com。 - 模型配置通过“API Key + API 地址”可直接获取模型列表,再选择模型 ID(也支持手填修改)。
- 系统会自动生成默认 MCP 模板(工作总结/日报快报/周报总结/事件报告/优化建议),并保留可编辑能力。
数据和 JWT 密钥已持久化到 ./data 目录,重新部署时数据不丢失:
docker compose pull
docker compose up -d./data/
store.json # 所有业务数据(小孩、消费、配置等)
.jwt-secret # JWT 密钥(首次启动自动生成)
./config/
# 预留目录,可放置自定义配置文件
- 在 GitHub Actions 执行工作流 Build & Push Images。
- 触发构建后确认镜像已推送到 ghcr.io。
- 本项目
docker-compose.yml已固定镜像地址,常规部署无需再手动改镜像参数。
详细步骤见 docs/SYNOLOGY_DEPLOYMENT.md。
推荐使用自建应用 WS 长连接模式,服务端主动连接飞书,无需公网 IP 或域名(NAS / 内网服务器直接可用)。
- 打开飞书开放平台 https://open.feishu.cn,登录后进入开发者后台
- 点击创建自建应用,填写名称,创建完成
- 左侧菜单-添加应用能力-开启机器人能力
- 左侧菜单-权限管理-勾选并申请以下权限(见下方“权限清单”)
- 左侧菜单-事件订阅-选择长连接模式(无需填写回调 URL)
- 添加事件:
im.message.receive_v1(接收消息) - 添加事件:
card.action.trigger(卡片按钮回调,用于撤销操作)
- 添加事件:
- 页面顶部申请上线提交审核
下表为当前功能依赖的飞书权限,建议一次性全开,避免“部分功能可用、部分功能报错”。
| 权限标识(Scope) | 是否必选 | 用途 | 缺失时表现 |
|---|---|---|---|
im:message |
必选 | 接收群消息事件 | 机器人收不到指令 |
im:message:send_as_bot |
必选 | 发送反馈卡片/通知卡片 | 指令识别成功但回传失败 |
im:resource |
必选 | 上传头像图片到飞书(/im/v1/images) |
头像上传失败或无头像 |
contact:contact.base:readonly |
必选 | 读取通讯录基础信息(/contact/v3/users/:id) |
用户信息查询失败/权限报错 |
contact:user.basic.profile:readonly |
必选(本次补充) | 通过 basic_batch 获取姓名(/contact/v3/users/basic_batch) |
日志出现 code=99991672 Access denied,操作人名称无法稳定获取 |
重点:
contact:user.basic.profile:readonly是“通过 ID 获取用户姓名”接口所需权限,之前最容易漏掉。
仅在权限管理里勾选还不够,必须完成以下链路:
- 开放平台-权限管理:勾选并提交权限申请
- 开放平台-版本管理:发布新版本(测试版/正式版)
- 飞书管理后台(企业侧):管理员同意/更新应用授权
- 若群内机器人未自动更新权限:移除后重新添加机器人到群
未完成以上步骤时,后端常见日志:
Access deniedcode=99991672
Webhook 模式(备用):若服务有公网 IP,可在事件订阅页改为回调 URL 模式,填写
http://你的服务IP:45174/api/feishu/events。两种模式只选其一。
| 模式 | 特点 | 适用场景 |
|---|---|---|
| WS 长连接(推荐) | 服务主动连飞书,无需公网 IP | NAS / 内网 / Docker |
| Webhook 回调 | 飞书推送到公网 URL | 有固定 IP 或域名的服务器 |
使用 WS 长连接时,服务启动后自动建立连接,无需额外配置回调 URL。
进入后台-底部菜单机器人-向下滚动到飞书机器人设置
| 字段 | 内容 | 在哪找 |
|---|---|---|
| 飞书接入方式 | 选自建应用(WS 长连接) | - |
| 飞书 App ID | cli_ 开头约 20 位 | 开放平台-应用详情-凭证与基础信息-App ID |
| 飞书 App Secret | 与 App ID 同页 | 开放平台-应用详情-凭证与基础信息-App Secret |
| Verification Token | 约 24 位字符串(Webhook 模式需要) | 开放平台-事件订阅-加密策略-Verification Token |
| Signing Secret | 约 24 位字符串(Webhook 模式需要) | 开放平台-事件订阅-加密策略-Encrypt Key |
| 默认通知 Chat ID | oc_ 开头字符串 | 见第 4 步 |
WS 长连接模式只需 App ID 和 App Secret,Verification Token / Signing Secret 可留空。
- 在群里发送一条测试消息(如:
加20) - 后台运行日志中确认:
- 无
飞书应用消息发送失败 - 无
basic_batch ... Access denied - 无
头像上传 ... code=234007/权限错误
- 无
- 收到机器人卡片后确认:
- 变动操作人有名称(非
未知用户) - 头像正常显示
- 变动操作人有名称(非
- 将机器人加入目标飞书群:群设置-机器人-添加机器人-搜索应用名
- 进入后台机器人页,编辑已有机器人
- 确保已保存 App ID 和 App Secret 后,点击「默认通知 Chat ID」输入框旁的**「获取群列表」**按钮
- 从下拉列表中选择目标群,Chat ID 自动填入
- 点击保存即可
备用方式:在目标群内发任意消息后,页面底部「最近活跃 Chat ID(只读)」字段会自动记录,可手动复制到默认通知 Chat ID 中。
- 后台机器人页-右下角加号新增机器人
- 填写名称,勾选管理的孩子(可多选)
- 填写可控制账号 OpenID(每行一个 ou_ 开头的 ID)
- 获取方式:飞书 App-我的-关于飞书-开发者工具-个人 OpenID
- 只有填入的账号才能触发机器人;留空则任意用户均可触发
后台机器人页-向下滚动到周报通知-点击时间框选择时间-保存通知时间 每周一该时间点自动向默认 Chat ID 发送上周统计。
每个孩子可独立设置发放时刻(精确到分钟):
- 后台-底部菜单孩子-点击进入孩子详情
- 表单中找到「每日发放时」和「每日发放分」两个字段
- 填入希望的发放时刻(如 8 时 0 分 = 每天早上 8:00)
- 保存后,定时任务每分钟检查一次,到时自动发放并推送飞书通知
| 指令示例 | 说明 |
|---|---|
| 设置小明每日零花钱 12 元 | 调整每日发放额度 |
| 设置小明奖励项目家务 5 元 | 添加奖励项目 |
| 扣除小明 8 元 买零食 | 扣除消费 |
| 小明完成家务 | 触发奖励发放 |
| 设置每周统计通知 20:30 | 修改周报时间 |
注意:发消息账号必须在机器人可控制账号 OpenID 中,未绑定账号消息被自动忽略。
系统在推送金额变动通知卡片时,卡片底部会出现「↩ 撤销此操作」按钮。在 30 分钟内点击可自动反向操作(如撤销一笔 +10 元则扣除 10 元)。撤销本身也会产生新通知并再次出现撤销按钮。
机器人会向默认 Chat ID 推送:
- 每次金额变动明细(含对象、金额、类型、原因、操作人、当前余额)
- 操作结果反馈
- 每周一统计汇总(含 AI 建议)
系统自动忽略:
- 机器人自身消息
- 发送者不在可控制账号列表中(controllerOpenIds 不为空时生效)