# 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 ` 或 `X-API-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 收集