- /config rename <旧名称> <新名称> - 重命名存储桶 - 自动更新引用此存储桶的上传配置 - 禁止重命名 default 存储桶 - 检查新名称是否已存在 - /path rename <旧名称> <新名称> - 重命名预设路径 - 自动更新引用此路径的上传配置 - 检查新名称是否已存在 - /profile rename <旧名称> <新名称> - 重命名上传配置 - 检查新名称是否已存在 - 更新帮助卡片和 README.md 文档 - 支持带空格的名称(如 'IPA 上传')
575 lines
11 KiB
Markdown
575 lines
11 KiB
Markdown
# 七牛云上传 - 飞书独立应用
|
||
|
||
基于飞书交互卡片的七牛云文件上传工具,不依赖 OpenClaw。
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 创建飞书应用
|
||
|
||
1. 访问 [飞书开放平台](https://open.feishu.cn/)
|
||
2. 登录企业管理员账号
|
||
3. 点击"创建应用" → "自建应用"
|
||
4. 填写应用信息:
|
||
- 应用名称:七牛云上传助手
|
||
- 应用图标:🍙
|
||
5. 进入应用管理页面
|
||
|
||
### 2. 配置权限
|
||
|
||
在"权限管理"中添加以下权限:
|
||
|
||
```json
|
||
{
|
||
"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`](./FEISHU_SCOPES.md)
|
||
|
||
### 3. 配置事件订阅
|
||
|
||
1. 进入"事件订阅"页面
|
||
2. 选择 **"HTTP 回调"** 方式
|
||
3. 开启"启用事件订阅"
|
||
4. 填写请求地址:`https://your-domain.com/feishu/event`
|
||
5. 配置订阅事件:
|
||
- `im.message.receive_v1` - 接收消息
|
||
6. 保存后复制 Verification Token 和 Encrypt Key
|
||
|
||
> **💡 提示:** 也可以使用 WebSocket 长连接模式(不需要公网 IP),在 `.env` 中设置 `FEISHU_MODE=websocket`
|
||
|
||
### 4. 配置机器人
|
||
|
||
1. 进入"机器人"页面
|
||
2. 开启"启用机器人"
|
||
3. 配置机器人名称和头像
|
||
|
||
### 5. 安装应用
|
||
|
||
1. 进入"版本管理与发布"
|
||
2. 点击"发布应用"
|
||
3. 在飞书中搜索并添加该机器人
|
||
|
||
---
|
||
|
||
## 📦 部署
|
||
|
||
### 🐳 Docker 部署(推荐)
|
||
|
||
#### 方式 1:使用 Docker Compose(推荐)
|
||
|
||
**1. 创建 `docker-compose.yml`**
|
||
|
||
```yaml
|
||
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. 配置环境变量**
|
||
|
||
```bash
|
||
# 复制环境变量模板
|
||
cp .env.example .env
|
||
|
||
# 编辑配置(填入真实信息)
|
||
nano .env
|
||
```
|
||
|
||
**3. 启动服务**
|
||
|
||
```bash
|
||
# 构建并启动
|
||
docker-compose up -d --build
|
||
|
||
# 查看日志
|
||
docker-compose logs -f qiniu-bot
|
||
|
||
# 停止服务
|
||
docker-compose down
|
||
|
||
# 重启服务
|
||
docker-compose restart
|
||
```
|
||
|
||
---
|
||
|
||
#### 方式 2:使用 Docker 命令
|
||
|
||
**1. 准备配置文件**
|
||
|
||
```bash
|
||
# 创建配置目录
|
||
mkdir -p config
|
||
|
||
# 复制环境变量模板
|
||
cp .env.example .env
|
||
|
||
# 编辑配置
|
||
nano .env
|
||
```
|
||
|
||
**2. 构建镜像**
|
||
|
||
```bash
|
||
docker build -t qiniu-feishu-bot:latest .
|
||
```
|
||
|
||
**3. 运行容器**
|
||
|
||
```bash
|
||
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. 常用命令**
|
||
|
||
```bash
|
||
# 查看日志
|
||
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. 构建优化镜像**
|
||
|
||
```bash
|
||
docker build --no-cache -t qiniu-feishu-bot:prod .
|
||
```
|
||
|
||
**3. 部署到生产环境**
|
||
|
||
```bash
|
||
# 推送到镜像仓库(可选)
|
||
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 故障排查
|
||
|
||
**查看容器日志**
|
||
```bash
|
||
docker logs --tail 100 qiniu-bot
|
||
```
|
||
|
||
**进入容器调试**
|
||
```bash
|
||
docker exec -it qiniu-bot /bin/sh
|
||
```
|
||
|
||
**检查容器健康状态**
|
||
```bash
|
||
docker inspect --format='{{.State.Health.Status}}' qiniu-bot
|
||
```
|
||
|
||
**查看资源使用**
|
||
```bash
|
||
docker stats qiniu-bot
|
||
```
|
||
|
||
**清理未使用的镜像**
|
||
```bash
|
||
docker image prune -a
|
||
```
|
||
|
||
---
|
||
|
||
#### 🌏 国内网络问题(镜像拉取超时)
|
||
|
||
**问题:** `failed to solve: DeadlineExceeded: node:18-alpine: failed to resolve source metadata`
|
||
|
||
**解决方案 1:配置 Docker 镜像加速器**
|
||
|
||
```bash
|
||
# 配置镜像加速器
|
||
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` 第一行:
|
||
```dockerfile
|
||
# 使用阿里云镜像
|
||
FROM registry.cn-hangzhou.aliyuncs.com/library/node:18-alpine
|
||
```
|
||
|
||
**解决方案 3:手动拉取镜像**
|
||
|
||
```bash
|
||
# 先手动拉取(使用加速器)
|
||
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
|
||
|
||
```bash
|
||
# 安装依赖
|
||
npm install
|
||
|
||
# 复制环境变量
|
||
cp .env.example .env
|
||
|
||
# 编辑配置
|
||
nano .env
|
||
|
||
# 启动服务(使用 PM2)
|
||
pm2 start pm2.config.cjs
|
||
|
||
# 查看日志
|
||
pm2 logs qiniu-bot
|
||
```
|
||
|
||
### 🪟 Windows
|
||
|
||
```cmd
|
||
# 安装依赖
|
||
npm install
|
||
|
||
# 复制环境变量
|
||
copy .env.example .env
|
||
|
||
# 编辑配置
|
||
notepad .env
|
||
|
||
# 启动服务(使用 PM2)
|
||
pm2 start pm2.config.cjs
|
||
|
||
# 查看日志
|
||
pm2 logs qiniu-bot
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ 配置
|
||
|
||
### 📄 配置文件说明
|
||
|
||
项目包含以下环境变量配置文件:
|
||
|
||
| 文件 | 作用 | 包含敏感信息 | 提交到 Git |
|
||
|------|------|-------------|-----------|
|
||
| `.env.example` | 配置模板,展示所有需要的环境变量 | ❌ 否(占位符) | ✅ 应该 |
|
||
| `.env` | 当前环境配置(运行时使用) | ✅ 是 | ❌ 不应该 |
|
||
| `.env.production` | 生产环境专用配置 | ✅ 是 | ❌ 不应该 |
|
||
|
||
**快速开始:**
|
||
```bash
|
||
# 新部署时复制模板
|
||
cp .env.example .env
|
||
|
||
# 编辑配置(填入真实信息)
|
||
nano .env
|
||
```
|
||
|
||
> ⚠️ **安全提示:** `.env` 和 `.env.production` 包含敏感信息(密钥、密码等),**切勿提交到 Git**!项目已配置 `.gitignore` 自动忽略这些文件。
|
||
|
||
---
|
||
|
||
### 环境变量 (.env)
|
||
|
||
```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)
|
||
|
||
```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 <键路径> <值>` | 修改配置项 |
|
||
|
||
**示例:**
|
||
```bash
|
||
/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 <旧名称> <新名称>` | 重命名路径(自动更新引用) |
|
||
|
||
**示例:**
|
||
```bash
|
||
/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 <旧名称> <新名称>` | 重命名配置模板 |
|
||
|
||
**示例:**
|
||
```bash
|
||
/profile add 默认上传 default
|
||
/profile add IPA 上传 default ipa
|
||
/profile rename old-profile new-profile
|
||
/profile remove IPA 上传
|
||
```
|
||
|
||
### 使用流程
|
||
|
||
**方式 1:选择配置 → 发送文件**
|
||
1. 发送 `/upload`
|
||
2. 选择上传配置
|
||
3. 发送文件
|
||
4. 确认上传
|
||
|
||
**方式 2:发送文件 → 选择配置**
|
||
1. 直接发送文件
|
||
2. 选择上传配置
|
||
3. 确认上传
|
||
|
||
---
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
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 # 飞书权限配置
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 故障排查
|
||
|
||
### 上传失败
|
||
|
||
1. 检查七牛云配置是否正确
|
||
2. 确认存储桶区域代码匹配
|
||
3. 检查 AccessKey/SecretKey 权限
|
||
4. 在七牛云控制台关闭存储桶的"防覆盖"设置
|
||
|
||
### 消息无响应
|
||
|
||
1. 检查事件订阅配置
|
||
2. 确认服务器可被飞书访问(HTTP 模式需要公网 IP)
|
||
3. 查看日志:`pm2 logs qiniu-bot`
|
||
4. 检查飞书应用权限是否已授权
|
||
|
||
### 文件下载失败
|
||
|
||
确保已添加 `im:resource` 权限,该权限用于访问消息中的文件资源。
|
||
|
||
---
|
||
|
||
## 📝 许可证
|
||
|
||
MIT
|