NapCat SDK for Python - Fully typed and async ready
Project description
NapCat-SDK for Python
Type-Safe • Async-Ready • Framework-Free
Stop guessing parameter types. Let the IDE do the work.
告别查文档,享受 100% 类型覆盖 带来的极致补全体验。
✨ Features
- 🔄 协议自动同步: 基于 OpenAPI 自动构建,与 NapCat 上游定义零时差同步。
- 🧘 原生无框架: 拒绝框架"黑魔法",纯粹 Python 语法,零心智负担。
- 💎 极致类型: 100% 类型覆盖,每一个参数都有定义,享受极致 IDE 补全。
- ⚡ 完全异步: 基于
websockets+asyncio原生开发,无惧高并发。 - 🔌 双模支持: 完美支持正向 (Client) 与反向 (Server) WebSocket 连接。
- 🌐 远程 RPC: 内置透明网关,让外部应用跨语言调用 NapCat API。
- 🤖 CLI 集成: 支持 MCP、Skills、CLI,让 AI 助手实时查询 SDK 文档。
- 📦 依赖克制: 仅包含少量运行时依赖,核心基于
websockets和orjson。
📦 Installation
uv add napcat-sdk
# or
pip install napcat-sdk
🚀 Quick Start
第一次接入时,先确保你已经准备好一个可用的 NapCat 实例。
- NapCat 官网: https://napneko.github.io
- 本 SDK 通过 OneBot WebSocket 与 NapCat 通信,最常见的是正向 WebSocket 地址
ws://127.0.0.1:3001 - 如果你给 NapCat 配了 Token,后面的示例里也要带上同一个 Token
最短路径建议按这 3 步走:
- 在 NapCat 里开启 OneBot WebSocket,并确认你能拿到
ws://...地址。 - 安装 SDK。
- 运行最小示例,先让
/ping -> pong跑通。
如果你是在仓库里体验,可以直接运行:
export NAPCAT_WS_URL=ws://127.0.0.1:3001
# 如果你配置了鉴权,再取消下一行注释
# export NAPCAT_TOKEN=your-token
uv run python examples/01_forward_client.py
如果你是从 PyPI 安装、手边没有 examples/ 目录,也可以直接复制下面的 Quick Look 到你的脚本里运行。
如果你现在还没配置好 NapCat,建议先看 NapCat 文档完成 WebSocket 配置,再回来运行 SDK 示例。
🧪 示例
可运行的示例脚本都放在 examples/ 目录。建议先看 examples/README.md,再用 uv run python examples/<file>.py 运行对应示例。
第一次接入建议先跑 examples/01_forward_client.py,确认链路畅通后再看 examples/05_pattern_matching.py。
📚 指南
🤖 CLI
CLI 是自举的:只要记住入口 uv run napcat-sdk(安装后也可以直接用 napcat-sdk),其余用法都可以从命令本身继续发现。
uv run napcat-sdk --help
uv run napcat-sdk tldr
uv run napcat-sdk doc agent
uv run napcat-sdk doc agent --full --with-code
uv run napcat-sdk mcp doc
它适合做三件事:管理本地实例、查询 SDK/API 文档、给 AI agent 一次性导出大上下文文档包。
📸 Quick Look
import asyncio
import os
from napcat import GroupMessageEvent, NapCatClient, PrivateMessageEvent, Text
def require_env(name: str) -> str:
value = os.getenv(name)
if not value:
raise SystemExit(f"缺少必填环境变量:{name}")
return value
async def main() -> None:
client = NapCatClient(
ws_url=require_env("NAPCAT_WS_URL"),
token=os.getenv("NAPCAT_TOKEN"),
)
async for event in client:
match event:
case PrivateMessageEvent(sender=sender, message=[Text(text="/ping")]):
print(f"[私聊] {sender.nickname}: /ping")
await event.send_msg("pong")
case GroupMessageEvent(
group_id=gid,
sender=sender,
message=[Text(text="/ping")],
):
print(f"[群:{gid}] {sender.nickname}: /ping")
await event.reply("pong", at=True)
case _:
continue
if __name__ == "__main__":
asyncio.run(main())
📖 Usage
NapCatClient 支持直接作为异步迭代器使用,并会在迭代开始/结束时自动管理连接生命周期。
🔌 反向 WebSocket 服务端 (Server Mode)
如果你配置 NapCat 主动连接你的程序,请使用 ReverseWebSocketServer。
import asyncio
from napcat import ReverseWebSocketServer, NapCatClient, GroupMessageEvent
async def handler(client: NapCatClient):
"""每个新的 WebSocket 连接都会触发此回调"""
print(f"Bot Connected! Self ID: {client.self_id}")
# 就像 Client 模式一样处理事件
async for event in client:
if isinstance(event, GroupMessageEvent):
print(f"收到群 {event.group_id} 消息: {event.raw_message}")
await event.reply("服务端已收到")
async def main():
# 启动服务器监听 8080 端口
server = ReverseWebSocketServer(handler, host="0.0.0.0", port=8080, token="my-token")
await server.run_forever()
if __name__ == "__main__":
asyncio.run(main())
🖼️ 发送富媒体消息 (图片/At/回复)
SDK 提供了强类型的 MessageSegment,告别手动拼接 CQ 码。
from napcat import (
NapCatClient,
Text,
Image,
At,
Message,
)
async def send_rich_media(client: NapCatClient, group_id: str):
# 构建消息链:@某人 + 文本 + 图片
message: list[Message] = [
At(qq="12345678"),
Text(text=" 来看这张图:"),
Image(file="https://example.com/image.jpg"),
]
# 直接发送列表
await client.send_group_msg(group_id=group_id, message=message)
🔗 调用 OneBot API (100% 类型提示)
所有 API 方法都直接挂载在 client 上,拥有完整的参数类型检查。
async def managing_bot(client: NapCatClient):
# 获取登录号信息
login_info = await client.get_login_info()
print(f"当前登录: {login_info['nickname']}")
# 获取群成员列表
members = await client.get_group_member_list(
group_id="123456",
no_cache=True
)
for member in members:
print(f"成员: {member['card'] or member['nickname']}")
# 动态调用(针对未收录的 API)
await client.call_action("some_new_action", {"param": 1})
⚠️ 错误处理 (异常类型)
SDK 提供了明确的异常类型,方便区分错误来源:
from napcat import NapCatAPIError, NapCatProtocolError, NapCatStateError
try:
await client.get_login_info()
except NapCatAPIError as exc:
print("API 失败:", exc)
print("action=", exc.action, "retcode=", exc.retcode)
except NapCatProtocolError as exc:
print("上报数据异常:", exc)
except NapCatStateError as exc:
print("客户端状态错误:", exc)
🛠️ Development
本项目使用 uv 进行包管理。
- 克隆项目并同步环境:
git clone --recursive https://github.com/faithleysath/napcat-sdk.git
cd napcat-sdk
uv sync
corepack enable
corepack prepare pnpm@latest --activate
cd NapCatQQ
pnpm install --frozen-lockfile
cd ..
- 同步协议定义: SDK 的核心代码由 OpenAPI 规范自动生成,请运行以下命令重新生成代码:
uv run scripts/schema-codegen.py
这会自动更新 src/napcat/types/messages/generated.py、src/napcat/types/schemas.py、src/napcat/client_api.py 以及相关的 __init__.py。如果你的环境里没有全局 pnpm,请先在 NapCatQQ 中执行 corepack pnpm --filter napcat-schema run build:openapi,然后改用 uv run scripts/schema-codegen.py --no-openapi-pre-codegen。
- 如需同步
notice事件定义:
OPENAI_API_KEY=你的key uv run scripts/notice-codegen.py
uv run scripts/update-init.py
脚本默认已经配置好 Google 的 OpenAI-compatible base_url 和模型;通常只需要传 OPENAI_API_KEY。
- 运行测试:
# 运行 tests
uv run pytest src/tests -q
📄 License
MIT License © 2025 faithleysath
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file napcat_sdk-0.6.8.tar.gz.
File metadata
- Download URL: napcat_sdk-0.6.8.tar.gz
- Upload date:
- Size: 96.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e50aed7f81961b59ab7fa87fae31ad852bcf6be1ddd42afbb8f598f12db32259
|
|
| MD5 |
9abb22163cf094f7989b6ba3fb1eb5c5
|
|
| BLAKE2b-256 |
89c235fd08155ca3f224176c4b0c0ea9fed8d8ff4231b29569f160b02f1841e5
|
File details
Details for the file napcat_sdk-0.6.8-py3-none-any.whl.
File metadata
- Download URL: napcat_sdk-0.6.8-py3-none-any.whl
- Upload date:
- Size: 129.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
296e885fb1bd70d3b1ca5c6411eafaa8d23ce33498817b2b3325f3bc8ba6eaed
|
|
| MD5 |
422f6f9d9437d0038a6d60ab07c7d4fa
|
|
| BLAKE2b-256 |
ef222f7e6da1bea7d14360d086226f5781e8473b850ebb9e7f549ebe32996377
|