- setConfigValue: 添加 URL 清理逻辑,移除 Markdown 链接格式和末尾斜杠 - handleConfigCommandV2: /config add 命令自动清理 domain 参数 - 防止用户从飞书卡片复制 URL 时带入 Markdown 格式 修复场景: - 用户从卡片复制域名 [https://example.com](https://example.com/) - 使用 /config set 命令设置 domain - 自动清理为纯 URL: https://example.com
七牛云上传 - 飞书独立应用
基于飞书交互卡片的七牛云文件上传工具,不依赖 OpenClaw。
🚀 快速开始
1. 创建飞书应用
- 访问 飞书开放平台
- 登录企业管理员账号
- 点击"创建应用" → "自建应用"
- 填写应用信息:
- 应用名称:七牛云上传助手
- 应用图标:🍙
- 进入应用管理页面
2. 配置权限
在"权限管理"中添加以下权限:
{
"scopes": {
"tenant": [
"im:message",
"im:message:readonly",
"im:resource",
"im:message.p2p_msg:readonly",
"cardkit:card:read",
"cardkit:card:write",
"cardkit:template:read",
"aily:file:read",
"aily:file:write"
],
"user": [
"aily:file:read",
"aily:file:write",
"im:message.p2p_msg:get_as_user"
]
}
}
| 权限代码 | 说明 |
|---|---|
im:message |
发送消息 |
im:message:readonly |
读取消息 |
im:resource |
关键:访问消息中的资源(文件) |
im:message.p2p_msg:readonly |
读取私聊消息 |
cardkit:* |
发送交互式卡片 |
aily:file:* |
文件读写 |
详细权限配置请查看 FEISHU_SCOPES.md
3. 配置事件订阅
- 进入"事件订阅"页面
- 选择 "HTTP 回调" 方式
- 开启"启用事件订阅"
- 填写请求地址:
https://your-domain.com/feishu/event - 配置订阅事件:
im.message.receive_v1- 接收消息
- 保存后复制 Verification Token 和 Encrypt Key
💡 提示: 也可以使用 WebSocket 长连接模式(不需要公网 IP),在
.env中设置FEISHU_MODE=websocket
4. 配置机器人
- 进入"机器人"页面
- 开启"启用机器人"
- 配置机器人名称和头像
5. 安装应用
- 进入"版本管理与发布"
- 点击"发布应用"
- 在飞书中搜索并添加该机器人
📦 部署
🐳 Docker 部署(推荐)
方式 1:使用 Docker Compose(推荐)
1. 创建 docker-compose.yml
version: '3.8'
services:
qiniu-bot:
build: .
container_name: qiniu-bot
restart: always
ports:
- "3030:3030"
env_file:
- .env
volumes:
- ./config:/app/config
- ./logs:/app/logs
networks:
- qiniu-network
networks:
qiniu-network:
driver: bridge
2. 配置环境变量
# 复制环境变量模板
cp .env.example .env
# 编辑配置(填入真实信息)
nano .env
3. 启动服务
# 构建并启动
docker-compose up -d --build
# 查看日志
docker-compose logs -f qiniu-bot
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
方式 2:使用 Docker 命令
1. 准备配置文件
# 创建配置目录
mkdir -p config
# 复制环境变量模板
cp .env.example .env
# 编辑配置
nano .env
2. 构建镜像
docker build -t qiniu-feishu-bot:latest .
3. 运行容器
docker run -d \
--name qiniu-bot \
--restart always \
-p 3030:3030 \
--env-file .env \
-v $(pwd)/config:/app/config \
-v $(pwd)/logs:/app/logs \
qiniu-feishu-bot:latest
4. 常用命令
# 查看日志
docker logs -f qiniu-bot
# 查看容器状态
docker ps -a | grep qiniu-bot
# 重启容器
docker restart qiniu-bot
# 停止容器
docker stop qiniu-bot
# 删除容器
docker rm qiniu-bot
# 查看容器详情
docker inspect qiniu-bot
方式 3:使用 Dockerfile 多阶段构建(生产环境)
1. 创建 .dockerignore
node_modules
npm-debug.log
.env
.env.*
.git
.gitignore
README.md
*.md
logs/
temp/
.DS_Store
2. 构建优化镜像
docker build --no-cache -t qiniu-feishu-bot:prod .
3. 部署到生产环境
# 推送到镜像仓库(可选)
docker tag qiniu-feishu-bot:prod your-registry/qiniu-bot:latest
docker push your-registry/qiniu-bot:latest
# 在服务器上拉取并运行
docker pull your-registry/qiniu-bot:latest
docker run -d \
--name qiniu-bot \
--restart always \
-p 3030:3030 \
--env-file .env \
-v /path/to/config:/app/config \
qiniu-feishu-bot:prod
🔧 Docker 故障排查
查看容器日志
docker logs --tail 100 qiniu-bot
进入容器调试
docker exec -it qiniu-bot /bin/sh
检查容器健康状态
docker inspect --format='{{.State.Health.Status}}' qiniu-bot
查看资源使用
docker stats qiniu-bot
清理未使用的镜像
docker image prune -a
🌏 国内网络问题(镜像拉取超时)
问题: failed to solve: DeadlineExceeded: node:18-alpine: failed to resolve source metadata
解决方案 1:配置 Docker 镜像加速器
# 配置镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
EOF
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证
docker info | grep "Registry Mirrors"
解决方案 2:使用国内 Node.js 镜像
修改 Dockerfile 第一行:
# 使用阿里云镜像
FROM registry.cn-hangzhou.aliyuncs.com/library/node:18-alpine
解决方案 3:手动拉取镜像
# 先手动拉取(使用加速器)
docker pull registry.cn-hangzhou.aliyuncs.com/library/node:18-alpine
# 打标签
docker tag registry.cn-hangzhou.aliyuncs.com/library/node:18-alpine node:18-alpine
# 重新构建
docker-compose up -d --build
📋 Docker 部署检查清单
.env文件已配置(包含飞书和七牛云密钥)config/目录存在且有权限logs/目录存在(用于日志持久化)- 端口 3030 未被占用
- 防火墙已开放 3030 端口(如果需要公网访问)
- 飞书开放平台事件订阅地址配置正确
🐧 Linux / 🍎 macOS
# 安装依赖
npm install
# 复制环境变量
cp .env.example .env
# 编辑配置
nano .env
# 启动服务(使用 PM2)
pm2 start pm2.config.cjs
# 查看日志
pm2 logs qiniu-bot
🪟 Windows
# 安装依赖
npm install
# 复制环境变量
copy .env.example .env
# 编辑配置
notepad .env
# 启动服务(使用 PM2)
pm2 start pm2.config.cjs
# 查看日志
pm2 logs qiniu-bot
⚙️ 配置
📄 配置文件说明
项目包含以下环境变量配置文件:
| 文件 | 作用 | 包含敏感信息 | 提交到 Git |
|---|---|---|---|
.env.example |
配置模板,展示所有需要的环境变量 | ❌ 否(占位符) | ✅ 应该 |
.env |
当前环境配置(运行时使用) | ✅ 是 | ❌ 不应该 |
.env.production |
生产环境专用配置 | ✅ 是 | ❌ 不应该 |
快速开始:
# 新部署时复制模板
cp .env.example .env
# 编辑配置(填入真实信息)
nano .env
⚠️ 安全提示:
.env和.env.production包含敏感信息(密钥、密码等),切勿提交到 Git!项目已配置.gitignore自动忽略这些文件。
环境变量 (.env)
# 飞书配置
FEISHU_APP_ID=cli_xxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxx
FEISHU_VERIFICATION_TOKEN=xxxxxxxxxxxxxx
FEISHU_ENCRYPT_KEY=xxxxxxxxxxxxxx
# 飞书事件接收模式:http (HTTP 回调) 或 websocket (WebSocket 长连接)
FEISHU_MODE=http
# 七牛云配置(可选,也可通过卡片配置)
QINIU_ACCESS_KEY=xxxxxxxxxxxxxx
QINIU_SECRET_KEY=xxxxxxxxxxxxxx
QINIU_BUCKET=your-bucket-name
QINIU_REGION=z0
QINIU_DOMAIN=https://your-cdn.com
# 服务配置
PORT=3030
NODE_ENV=production
七牛云配置 (config/qiniu-config.json)
{
"buckets": {
"default": {
"accessKey": "YOUR_ACCESS_KEY",
"secretKey": "YOUR_SECRET_KEY",
"bucket": "your-bucket-name",
"region": "z0",
"domain": "https://your-cdn-domain.com"
}
},
"uploadPaths": {
"原文件名": "",
"ipa": "/ipa/gamehall_jinxianv2.ipa"
},
"uploadProfiles": {
"默认": {
"bucket": "default",
"path": ""
},
"IPA 上传": {
"bucket": "default",
"path": "ipa"
}
}
}
💡 使用方式
常用命令
📤 上传命令
| 命令 | 说明 |
|---|---|
/upload 或 /u |
开始上传流程 |
/help 或 /qh |
查看详细帮助 |
⚙️ 存储桶配置 (/config 或 /qc)
| 命令 | 说明 |
|---|---|
/config list |
查看所有存储桶配置 |
/config add <名称> <accessKey> <secretKey> <bucket> <region> <domain> |
添加存储桶配置 |
/config remove <名称> |
删除存储桶配置 |
/config rename <旧名称> <新名称> |
重命名存储桶(自动更新引用) |
/config set <键路径> <值> |
修改配置项 |
示例:
/config add mybucket xxxxxx yyyyyy my-bucket z0 https://cdn.example.com
/config rename old-bucket new-bucket
/config remove mybucket
📁 预设路径 (/path)
| 命令 | 说明 |
|---|---|
/path list |
查看所有预设路径 |
/path add <名称> <路径> |
添加预设路径 |
/path remove <名称> |
删除预设路径 |
/path rename <旧名称> <新名称> |
重命名路径(自动更新引用) |
示例:
/path add backup /backup/
/path rename old-path new-path
/path add ipa /ipa/gamehall_jinxian2.ipa
/path remove backup
📤 上传配置模板 (/profile)
| 命令 | 说明 |
|---|---|
/profile list |
查看所有上传配置模板 |
/profile add <名称> <存储桶> [路径] |
添加上传配置模板 |
/profile remove <名称> |
删除上传配置模板 |
/profile rename <旧名称> <新名称> |
重命名配置模板 |
示例:
/profile add 默认上传 default
/profile add IPA 上传 default ipa
/profile rename old-profile new-profile
/profile remove IPA 上传
使用流程
方式 1:选择配置 → 发送文件
- 发送
/upload - 选择上传配置
- 发送文件
- 确认上传
方式 2:发送文件 → 选择配置
- 直接发送文件
- 选择上传配置
- 确认上传
📁 项目结构
qiniu-feishu-bot/
├── src/
│ ├── index.js # 主入口
│ ├── feishu-api.js # 飞书 API 封装
│ └── qiniu-uploader.js # 七牛云上传
├── config/
│ └── qiniu-config.json # 七牛云配置
├── .env # 环境变量
├── .env.example # 环境变量示例
├── .env.production # 生产环境配置
├── .gitignore
├── Dockerfile
├── package.json
├── pm2.config.cjs # PM2 配置
├── README.md # 项目说明
└── FEISHU_SCOPES.md # 飞书权限配置
🔧 故障排查
上传失败
- 检查七牛云配置是否正确
- 确认存储桶区域代码匹配
- 检查 AccessKey/SecretKey 权限
- 在七牛云控制台关闭存储桶的"防覆盖"设置
消息无响应
- 检查事件订阅配置
- 确认服务器可被飞书访问(HTTP 模式需要公网 IP)
- 查看日志:
pm2 logs qiniu-bot - 检查飞书应用权限是否已授权
文件下载失败
确保已添加 im:resource 权限,该权限用于访问消息中的文件资源。
📝 许可证
MIT
Description
Languages
JavaScript
83.6%
Batchfile
15.5%
Dockerfile
0.9%