Files
webhook/README.md

116 lines
2.8 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.
# ncatbot-webhook-plugin
NcatBot 插件,对外暴露 HTTP 接口,接收外部消息转发至 QQ。
## 快速开始
```bash
# 安装依赖
uv sync
# 复制环境变量并填写
cp .env.example .env
# 编辑 .env至少设置 WEBHOOK_API_KEY
# 启动
uv run python -m ncatbot
```
## 环境变量
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
| `WEBHOOK_API_KEY` | 否 | 自动生成 | API 鉴权密钥,未设置时自动生成 UUIDv4 并打印到启动日志 |
| `WEBHOOK_HOST` | 否 | `0.0.0.0` | 监听地址 |
| `WEBHOOK_PORT` | 否 | `8081` | 监听端口 |
| `UPLOAD_DIR` | 否 | `./uploads` | 上传文件保存目录 |
| `MAX_UPLOAD_SIZE` | 否 | `20971520` | 单文件最大字节数(默认 20 MB |
| `ALLOWED_EXTENSIONS` | 否 | 空(不限) | 允许的扩展名,逗号分隔,如 `jpg,png,pdf` |
| `QQ_API_TIMEOUT` | 否 | `10` | QQ API 超时秒数 |
| `QQ_API_MAX_RETRIES` | 否 | `2` | QQ API 失败重试次数 |
## 接口说明
所有接口均需通过 `Authorization: Bearer <KEY>``X-API-Key: <KEY>` 鉴权。
### GET /healthz
健康检查,无需鉴权。
```json
{"status": "ok", "health": "ok"}
```
### POST /webhook
发送 QQ 消息。
**请求体:**
```json
{
"type": "text",
"group_id": "123456",
"msg": "Hello!"
}
```
| 字段 | 必填 | 说明 |
|---|---|---|
| `type` | 否 | 消息类型:`text`(默认)、`image``file``video` |
| `group_id` | 二选一 | 群号 |
| `user_id` | 二选一 | QQ 号(私聊) |
| `msg` | text 时必填 | 文本内容 |
| `url` | image/file/video 时必填 | 资源链接 |
**成功响应:**
```json
{"status": "ok"}
```
**错误响应:**
```json
{"status": "error", "error": "invalid json", "code": 400}
```
### POST /upload
上传文件到服务器,供后续消息引用。
**请求:** `multipart/form-data`,字段名不限,每个文件部分需带 `filename`
**成功响应:**
```json
{
"status": "ok",
"files": ["photo.jpg"],
"path": "photo.jpg"
}
```
`files` 为相对路径(文件 ID`path` 为单文件时的快捷字段。
## 项目结构
```
├── main.py # 入口,组装并启动服务
├── config.py # 配置(环境变量)
├── middleware.py # 鉴权 & 请求 ID 中间件
├── response.py # 统一响应格式
├── handlers/
│ ├── health.py # /healthz
│ ├── message.py # /webhook 消息发送
│ └── upload.py # /upload 文件上传
├── .env.example # 环境变量模板
└── pyproject.toml # 依赖声明
```
## 内网部署建议
- 放在 Nginx/Caddy 后面,启用 HTTPS 和限流
- 用 systemd 管理进程,配置 `EnvironmentFile=.env`
- 日志默认输出到 stdout可由 systemd/journald 收集