ncatbot-webhook-plugin

NcatBot 插件,对外暴露 HTTP 接口,接收外部消息转发至 QQ。

快速开始

# 安装依赖
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

健康检查,无需鉴权。

{"status": "ok", "health": "ok"}

POST /webhook

发送 QQ 消息。

请求体:

{
  "type": "text",
  "group_id": "123456",
  "msg": "Hello!"
}
字段 必填 说明
type 消息类型:text(默认)、imagefilevideo
group_id 二选一 群号
user_id 二选一 QQ 号(私聊)
msg text 时必填 文本内容
url image/file/video 时必填 资源链接

成功响应:

{"status": "ok"}

错误响应:

{"status": "error", "error": "invalid json", "code": 400}

POST /upload

上传文件到服务器,供后续消息引用。

请求: multipart/form-data,字段名不限,每个文件部分需带 filename

成功响应:

{
  "status": "ok",
  "files": ["photo.jpg"],
  "path": "photo.jpg"
}

files 为相对路径(文件 IDpath 为单文件时的快捷字段。

项目结构

├── 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 收集
Description
No description provided
Readme 155 KiB
Languages
Python 100%