Files
qiniu-feishu-bot/README.md
饭团 79112210d4 feat: 添加 rename 重命名功能
- /config rename <旧名称> <新名称> - 重命名存储桶
  - 自动更新引用此存储桶的上传配置
  - 禁止重命名 default 存储桶
  - 检查新名称是否已存在

- /path rename <旧名称> <新名称> - 重命名预设路径
  - 自动更新引用此路径的上传配置
  - 检查新名称是否已存在

- /profile rename <旧名称> <新名称> - 重命名上传配置
  - 检查新名称是否已存在

- 更新帮助卡片和 README.md 文档
- 支持带空格的名称(如 'IPA 上传')
2026-03-15 00:36:03 +08:00

575 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 七牛云上传 - 飞书独立应用
基于飞书交互卡片的七牛云文件上传工具,不依赖 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