基于 @tencent-weixin/openclaw-weixin 协议实现的 NoneBot2 适配器,用于对接微信智能体(企微客服 iLink 通道)。
nb adapter install nonebot-adapter-wxclawuv add nonebot-adapter-wxclawpdm add nonebot-adapter-wxclawpoetry add nonebot-adapter-wxclawpip install nonebot-adapter-wxclaw注意: 本适配器需要支持 HTTP 客户端类型的驱动器。请参阅 NoneBot 驱动器文档 选择并安装合适的驱动器。
在 NoneBot 项目的 .env 或环境变量中配置:
DRIVER=~xxx # 需要 HTTP 客户端类型的驱动器,参阅 https://nonebot.dev/docs/advanced/driver
# 账号列表(JSON 数组)
WXCLAW_ACCOUNTS='[{"account_id": "你的bot_id", "token": "你的token", "base_url": "https://ilinkai.weixin.qq.com"}]'| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
wxclaw_accounts |
list[WxClawAccountInfo] |
[] |
账号列表 |
wxclaw_ilink_app_id |
str |
"bot" |
iLink App ID |
wxclaw_channel_version |
str |
"2.4.1" |
通道版本号 |
wxclaw_long_poll_timeout |
int |
35000 |
长轮询超时(毫秒) |
wxclaw_api_timeout |
int |
15000 |
API 请求超时(毫秒) |
wxclaw_cdn_base_url |
str |
"https://novac2c.cdn.weixin.qq.com/c2c" |
CDN 基础 URL |
wxclaw_bot_agent |
str |
"" |
Bot 标识(类似 User-Agent),为空时默认 "OpenClaw" |
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
account_id |
str |
必填 | Bot ID |
token |
str |
"" |
认证 Token(可通过 QR 登录获取) |
base_url |
str |
"https://ilinkai.weixin.qq.com" |
API 基础 URL |
enabled |
bool |
True |
是否启用 |
from nonebot import on_message
from nonebot.adapters.wxclaw import TextMessageEvent
echo = on_message()
@echo.handle()
async def handle_echo(event: TextMessageEvent):
await echo.send(event.get_message())from nonebot import on_command
from nonebot.adapters.wxclaw import Bot, ImageMessageEvent
send_img = on_command("img")
@send_img.handle()
async def handle_send_img(bot: Bot, event: ImageMessageEvent):
# 发送图片
await bot.send_image(event.from_user_id, b"<image bytes>")
# 发送文件
await bot.send_file(event.from_user_id, b"<file bytes>", "report.pdf")
# 发送视频
await bot.send_video(event.from_user_id, b"<video bytes>")适配器支持在插件中发起扫码登录,无需预先配置 token:
from nonebot import on_command
from nonebot.adapters.wxclaw import Adapter
login = on_command("login")
@login.handle()
async def handle_login():
adapter = Adapter.get_adapter() # type: ignore
async with adapter.qr_login(auto_connect=True) as session:
# session.qrcode_url 是二维码图片 URL,展示给用户扫描
print(f"请扫描二维码: {session.qrcode_url}")
# 等待扫描确认
result = await session.wait()
if result.connected:
print(f"登录成功! account_id={result.account_id}")
else:
print(f"登录失败: {result.message}")设置 auto_connect=True 后,登录成功会自动注册 Bot 并开始消息轮询。
| 类型 | 接收 | 发送 | 事件类 / 方法 | 说明 |
|---|---|---|---|---|
| 文本 | ✅ | ✅ | TextMessageEvent / bot.send_text() |
|
| 图片 | ✅ | ✅ | ImageMessageEvent / bot.send_image() |
CDN 引用可直接转发 |
| 文件 | ✅ | ✅ | FileMessageEvent / bot.send_file() |
转发需先 fetch_media() |
| 视频 | ✅ | ✅ | VideoMessageEvent / bot.send_video() |
转发需先 fetch_media() |
| 语音 | ✅ | ❌ | VoiceMessageEvent |
协议不支持发送语音 |
| 引用 | ✅ | ❌ | 消息段 type="ref" |
协议不支持发送引用 |
图片的 CDN 引用可以直接转发,无需重新上传:
@matcher.handle()
async def handle_forward(bot: Bot, event: ImageMessageEvent):
await bot.send(event, event.get_message())文件和视频的 CDN 引用不可直接转发(服务器会静默丢弃),需先通过 bot.fetch_media() 下载后再发送:
@matcher.handle()
async def handle_forward(bot: Bot, event: FileMessageEvent):
msg = await bot.fetch_media(event.get_message())
await bot.send(event, msg)fetch_media() 也可用于下载图片内容进行本地处理:
msg = await bot.fetch_media(event.get_message())
for seg in msg:
if seg.data.get("content"):
raw_bytes = seg.data["content"]from nonebot.adapters.wxclaw import MessageSegment
# 文本
MessageSegment.text("Hello")
# 图片(从 CDN 媒体引用构建)
MessageSegment.image(media=cdn_media)
# 文件
MessageSegment.file(media=cdn_media, file_name="doc.pdf")
# 视频
MessageSegment.video(media=cdn_media)所有 API 方法通过 NoneBot 的 call_api 钩子系统路由,支持中间件拦截:
| 方法 | 说明 |
|---|---|
bot.get_updates() |
长轮询获取消息 |
bot.send_message(msg=...) |
发送原始协议消息 |
bot.send_typing(to_user_id=...) |
发送正在输入状态 |
bot.get_config(user_id=...) |
获取会话配置 |
bot.get_upload_url(req=...) |
获取 CDN 上传地址 |
bot.download_media(media) |
下载并解密 CDN 媒体 |
bot.fetch_media(message) |
下载消息中所有 CDN 媒体到本地 bytes |
bot.prepare_and_upload_file(...) |
加密并上传文件到 CDN |
# 安装开发依赖
uv sync --group dev
# 运行测试
uv run pytest tests/
# 代码检查
uv run ruff check nonebot/ tests/
uv run ruff format nonebot/ tests/
# 类型检查
uv run basedpyright nonebot/本项目尚未设置许可证。