基于 OpenClaw 与微信实现 AI 自动回复接入流程
介绍如何使用 OpenClaw 框架结合 SyNodeAi 插件实现微信私聊与群聊的 AI 自动回复功能。内容涵盖架构设计、功能特性、快速接入步骤(包括插件安装、Token 获取、Webhook 配置及内网穿透)、详细配置参数说明以及群聊/私聊触发规则。通过该方案可实现 Agent 调度、多 Agent 协作及富消息处理,适用于私域客服、自动化运营等场景。

介绍如何使用 OpenClaw 框架结合 SyNodeAi 插件实现微信私聊与群聊的 AI 自动回复功能。内容涵盖架构设计、功能特性、快速接入步骤(包括插件安装、Token 获取、Webhook 配置及内网穿透)、详细配置参数说明以及群聊/私聊触发规则。通过该方案可实现 Agent 调度、多 Agent 协作及富消息处理,适用于私域客服、自动化运营等场景。

SyNodeAi OpenClaw 插件用于把微信私聊 / 群聊接入 OpenClaw,使每一条消息都能进入 Agent Runtime,触发 Tool / Skill / Workflow 调度。
在 OpenClaw 体系里,微信可以被看作:
你可以把它理解为:
WeChat = Event Source
OpenClaw = Runtime
Agent = Execution Unit
Tool / Skill = Capability Layer
WeChat ↓ Channel (SyNodeAi) ↓ OpenClaw Runtime ↓ Agent ↓ Tool / Skill / Workflow → Response → WeChat
@ 触发 / 引用触发@发送者mediaPublicUrl 本地反代rust-silk你可以用它来:
每一次对话,都会触发一次 Agent 执行。
应用场景包括:
安装或启用插件后需要重启 Gateway。
openclaw plugins install synodeai
openclaw plugins install /path/to/synodeai
openclaw plugins install --link /path/to/synodeai
OpenClaw 支持本地 .zip / .tgz / .tar.gz / .tar:
openclaw plugins install ./synodeai.tgz
openclaw plugins install synodeai
打开地址,登录微信并完成绑定,获取 token。
~/.openclaw/openclaw.json将你的配置文件复制到:
~/.openclaw/openclaw.json
{
"channels": {
"synodeai": {
"enabled": true,
"token": "<synodeai-token>",
"webhookHost": "0.0.0.0",
"webhookPort": 4399,
"webhookPath": "/webhook",
"autoQuoteReply": false,
"allowFrom": [],
"dmPolicy": "open",
"groupPolicy": "open",
"groups": {
"*": {
"trigger": { "mode": "at"
Webhook 是 SyNodeAi 将微信消息推送到你本地 OpenClaw 的入口地址,必须公网可访问。
如在本地环境使用,推荐直接用 ngrok 做内网穿透:
brew install ngrok
注册 ngrok 后获取 token,然后执行:
ngrok config add-authtoken YOUR_TOKEN
YOUR_TOKEN 在 ngrok 官网注册后即可获取。
ngrok http 4399
你会看到类似:
https://xxxx.ngrok-free.app -> http://localhost:4399
这个 https://xxxx.ngrok-free.app 就是你的公网地址。
把上一步的公网地址按下面格式填写到 SyNodeAi:
https://xxxx.ngrok-free.app/webhook
openclaw start
可以测试:
@机器人正确顺序是:登录微信(SyNodeAi)→ 安装 OpenClaw plugin(synodeai)→ 复制 json 配置文件到 ~/.openclaw/openclaw.json → 配置 ngrok,拿到公网地址在 SyNodeAi 填写 webhook → 最后启动 openclaw start。
GitHub 仓库:https://github.com/Devo919/openclaw-wechat-channel
插件配置放在 ~/.openclaw/openclaw.json 的 channels.synodeai 段落中:
{
"channels": {
"synodeai": {
"enabled": true,
"token": "<synodeai-token>",
"webhookHost": "0.0.0.0",
"webhookPort": 4399,
"webhookPath": "/webhook",
"autoQuoteReply": false,
"allowFrom": [],
"dmPolicy": "open",
"groupPolicy": "open",
"groups": {
"*": {
"trigger": { "mode": "at"
webhookHost/webhookPort/webhookPath:SyNodeAi 回调入口(需公网可达,常配合 FRP)。mediaPath:本地媒体服务的路由前缀(默认 /synodeai-media)。mediaPublicUrl:本地反代回退时的公网地址前缀(可选)。配置后会自动拼接媒体 ID;通常应与 mediaPath 对齐。s3Enabled:是否启用 S3 兼容上传。s3Endpoint/s3Region/s3Bucket/s3AccessKeyId/s3SecretAccessKey:S3 兼容服务连接参数。s3SessionToken:临时凭证可选字段。s3ForcePathStyle:是否启用 path-style(部分 S3 兼容服务需要)。s3UrlMode:public 或 presigned(默认 public)。s3PublicBaseUrl:public 模式下用于拼接可访问 URL(必填)。s3PresignExpiresSec:presigned 模式签名有效期(默认 3600 秒)。s3KeyPrefix:对象 key 前缀(默认 synodeai/outbound)。allowFrom:允许私聊触发的微信 ID(或在群里走 allowlist 规则)。voiceAutoConvert:自动将音频转为 silk(默认开启;设为 false 可关闭)。silkAutoDownload:自动下载 rust-silk(默认开启;可关闭后自行配置 voiceSilkPath / voiceDecodePath)。silkVersion:自动下载的 rust-silk 版本(latest 会自动清理旧版本)。silkBaseUrl:自定义下载源(默认 GitHub Releases)。silkInstallDir:自定义安装目录(默认 ~/.openclaw/tools/rust-silk/<version>)。silkAllowUnverified:校验文件缺失时是否允许继续(默认 false)。silkSha256:手动指定下载包 SHA256(用于私有源或校验文件缺失场景)。apiBaseUrl:SyNodeAi API 地址(默认 https://www.synodeaiapi.com)。voiceFfmpegPath/videoFfmpegPath/videoFfprobePath:自定义 ffmpeg / ffprobe 路径。voiceSilkPath/voiceSilkArgs:自定义 silk 编码器路径和参数(不使用自动下载时)。voiceSilkPipe:是否启用 ffmpeg + rust-silk 的 stdin/stdout 管道(默认关闭;失败会回退到临时文件)。
voiceDecodePath/voiceDecodeArgs/voiceDecodeOutput:自定义 silk 解码器(入站语音转写用)。mediaMaxMb:上传媒体大小上限(默认 20MB)。downloadMinDelayMs/downloadMaxDelayMs:入站媒体下载节流。autoQuoteReply:是否开启 replyToId + 纯文本 自动引用回复(默认开启;设为 可关闭)。groups 和 dms 都支持 * 默认项 + 精确项覆写:
groups["*"] / groups["<roomId>@chatroom"]dms["*"] / dms["<wxid>"]局部规则可继续搭配既有字段一起使用,例如 allowFrom、skills、systemPrompt、tools(仅群聊)。
groups[*].trigger.mode 支持:
at:只有被 @ 时触发quote:只有引用机器人消息时触发at_or_quote:@ 或引用机器人消息都触发any_message:任何消息都触发群聊默认值是 at。
groups[*].reply.mode 支持:
plain:普通回复quote_source:首条回复自动引用当前入站消息at_sender:首条文本回复自动 @ 发送者quote_and_at:首条文本回复同时引用并 @;非文本回复会自动退化为 quote_source群聊默认值会跟随 autoQuoteReply:
true:默认 quote_sourcefalse:默认 plaindms[*].trigger.mode 支持:
any_messagequotedms[*].reply.mode 支持:
plainquote_source私聊默认触发是 any_message。私聊默认回复也会跟随 autoQuoteReply 回退到 quote_source 或 plain。
requireMention: true/false 仍然可用,会分别映射到群聊 trigger.mode = "at" / "any_message"trigger / reply 配置优先级更高autoQuoteReply 现在主要用于'未显式配置 reply.mode 时'的默认值回退示例:
{
"channels": {
"synodeai": {
"groupPolicy": "open",
"groups": {
"*": {
"trigger": { "mode": "at" },
"reply": { "mode": "quote_source" }
},
"project-room@chatroom": {
"trigger": { "mode": "at_or_quote" },
"reply": { "mode": "quote_and_at" },
"skills": ["project-skill"]
SyNodeAi 现在补齐了目录、标准 allowlist 适配和状态摘要。
目录会混合这些来源:
allowFromgroupAllowFromdmsgroupsbindings[] 里命中的 SyNodeAi 群支持的目录能力:
self:查看当前账号自己的 wxid 和昵称listPeers:查看已知私聊对象listGroups:查看已知群listGroupMembers:按需读取某个群的实时成员列表其中 listGroupMembers 会 live 调用 SyNodeAi 的 getChatroomInfo,结果也会反哺后续名字解析。
标准 /allowlist 入口负责顶层两类名单:
allowFromgroupAllowFrom如果你要管理某一个群自己的 groups.<groupId>.allowFrom 覆盖,请用插件工具:
synodeai_manage_group_allowlist支持:
inspectaddremovereplaceclear示例:
{
"mode": "replace",
"groupId": "ops-room@chatroom",
"entries": ["wxid_admin_1", "wxid_admin_2"]
}
如果你就在目标群里调用,groupId 可以省略;工具会自动用当前群。
SyNodeAi 的状态页现在会额外显示:
wxid / 昵称bindings[] 数量除了 channels.synodeai 这一段插件配置,SyNodeAi 还支持配合 OpenClaw 顶层 bindings[] 使用。
可以把它理解成两层:
bindings[] 决定这个群 / 私聊归哪个 agent,或者归哪个 ACP 持久会话groups.<groupId>.bindingIdentity 决定绑定以后,机器人在这个群里显示成什么身份下面这个例子表示:ops-room@chatroom 这个群固定交给 ops agent 处理。
{
"bindings": [
{
"type": "route",
"agentId": "ops",
"match": {
"channel": "synodeai",
"accountId": "work",
"peer": { "kind": "group", "id": "ops-room@chatroom" }
}
}
],
"channels": {
"synodeai": {
"accounts": {
"work": {
"groups": {
"ops-room@chatroom": {
说明:
match.channel 写 synodeaimatch.accountId 可写具体账号,也可以写 "*"peer.kind 写 "group",peer.id 直接写 群ID@chatroombindings[] 用于描述群或私聊与 agent 的绑定关系下面这个例子表示:这个群固定进入 codex agent 的一个 ACP 持久会话。
{
"bindings": [
{
"type": "acp",
"agentId": "codex",
"match": {
"channel": "synodeai",
"accountId": "work",
"peer": { "kind": "group", "id": "repo-room@chatroom" }
},
"acp": {
"label": "repo-room",
"mode": "persistent",
"cwd": "/workspace/repo-a",
"backend": "acpx"
}
}
]
说明:
groups.<groupId>.bindingIdentity 用来描述:这个群已经绑定到 agent 后,机器人在群里应该显示成什么样。
当前只同步两项:
selfNicknameremark不会改群名。
{
"channels": {
"synodeai": {
"groups": {
"*": {
"bindingIdentity": {
"enabled": true,
"selfNickname": { "source": "agent_name" },
"remark": { "source": "agent_id" }
}
},
"repo-room@chatroom": {
"bindingIdentity": {
"remark": { "source": "name_and_id" }
}
}
}
}
默认值:
enabled = trueselfNickname.source = "agent_name"remark.source = "agent_id"可选值:
selfNickname.source: agent_name | agent_id | literalremark.source: agent_id | agent_name | name_and_id | literal当 source = "literal" 时,需要额外提供 value。
插件提供了一个仅 owner 可用的工具:synodeai_sync_group_binding。
它不会在启动时自动改微信群信息,而是采用手动同步流程:
bindings[]groups.<groupId>.bindingIdentitysynodeai_sync_group_binding工具参数:
{
"mode": "inspect",
"groupId": "repo-room@chatroom",
"accountId": "work",
"syncSelfNickname": true,
"syncRemark": true
}
三个模式的区别:
inspect:查看当前值、期望值、会改哪些字段dry_run:和 inspect 类似,但明确用于准备执行前预演apply:只在字段真的发生变化时调用 SyNodeAi API使用限制:
bindingIdentity.enabled = false 的群不能执行同步groupIdmediaPublicUrl 本地反代除了直接构造 channelData["synodeai"],现在也可以通过共享 message 工具走标准动作:
sendreplyunsend并在参数里附带一个 synodeai 对象来表达微信专属语义。
示例:在当前群里回复并做部分引用
{
"action": "reply",
"message": "收到,我接着处理",
"synodeai": {
"quote": {
"partialText": "需要继续跟进的那一段"
}
}
}
示例:撤回一条已经发出的消息
{
"action": "unsend",
"to": "ops-room@chatroom",
"messageId": "10001",
"newMessageId": "10002",
"createTime": "1710000002"
}
插件支持通过 channelData["synodeai"] 传入 SyNodeAi 专有消息语义。结构如下:
appMsg: { appmsg }:直接发送 <appmsg> XMLquoteReply: { svrid?, title?, atWxid? }:发送引用回复;未提供 svrid 时会回退到宿主 replyToIdemoji: { emojiMd5, emojiSize }:发送表情nameCard: { nickName, nameCardWxid }:发送名片miniApp: { miniAppId, displayName, pagePath, coverImgUrl, title, userName }:发送小程序revoke: { msgId, newMsgId, createTime }:撤回指定消息forward: { kind, xml, coverImgUrl? }:复用已存在消息 XML 进行二次转发
kind 支持 image | video | file | link | miniAppminiApp 转发额外需要 coverImgUrl示例:
{"channelData":{"synodeai":{"forward":{"kind":"link","xml":"<msg>...</msg>"}}}}
引用回复示例:
{"channelData":{"synodeai":{"quoteReply":{"svrid":"208008054840614808","title":"这条是引用回复","atWxid":"wxid_member_optional"}}}}
另外,普通文本回复如果带有宿主 replyToId,插件默认会自动映射为 SyNodeAi 的引用回复气泡;媒体、链接、小程序、撤回、转发等既有富消息分支不会被这条自动桥接抢占。若不希望自动引用,可在配置里设置 autoQuoteReply: false。
如果希望让模型主动发'部分引用',SyNodeAi 通道会识别回复末尾的一行隐藏指令:
[[GEWE_QUOTE_PARTIAL:要引用的原文片段]]
插件会在发送前剥离这行指令,并自动转成 quoteReply.partialText。通常配合宿主 replyToId 一起使用,用来引用当前正在回复的那条消息中的某一段文字。
入站 appmsg 现在会尽量保留复用素材,并在上下文中附带:
MsgType:原始 SyNodeAi msgTypeSyNodeAiXml:原始 XMLSyNodeAiAppMsgXml:appmsg XMLSyNodeAiAppMsgType:appmsg 的 typeSyNodeAiQuoteXml:引用消息原始 XML(当 type=57 时)SyNodeAiQuoteTitle:引用回复正文SyNodeAiQuoteType:被引用消息类型SyNodeAiQuoteSvrid:被引用消息 sidSyNodeAiQuoteFromUsrSyNodeAiQuoteChatUsrSyNodeAiQuoteDisplayNameSyNodeAiQuoteContentSyNodeAiQuoteMsgSource这意味着收到链接、文件通知、引用消息或其他未专门解析的 appmsg 后,可以直接取上下文里的 XML 和引用元数据,再走 forward / appMsg / quoteReply 能力完成复用或继续回复。
配置变更后需重启 Gateway。
默认情况下,只有已安装的插件会出现在 onboarding 列表中。 如果你希望未安装时也能在列表中展示,需要配置本地 catalog:
~/.openclaw/plugins/catalog.json
示例:
{
"entries": [
{
"name": "synodeai",
"openclaw": {
"channel": {
"id": "synodeai",
"label": "SyNodeAi",
"selectionLabel": "WeChat (SyNodeAi)",
"detailLabel": "WeChat (SyNodeAi)",
"docsPath": "/channels/synodeai",
"docsLabel": "synodeai",
"blurb": "WeChat channel via SyNodeAi API and webhook callbacks.",
"aliases": ["synodeai", "synodeai", "wechat", "wx"],
"order"
现在插件已支持 onboarding:选择 SyNodeAi 通道后会提示填写 token / appId / webhook / mediaPublicUrl 等配置。
zodopenclaw (>= 2026.1.29)ffmpeg / ffprobe(用于视频缩略图与时长)rust-silk(出站语音转 silk + 入站语音解码;支持自动下载)silk-encoder / silk-decoder 并在配置中指定路径mediaPublicUrl)
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
false