home / skills / aaaaqwq / agi-super-skills / wechat-channel

wechat-channel skill

/skills/messaging/wechat-channel

This skill enables seamless two-way messaging between WeChat and OpenClaw by coordinating Wechaty Bridge, webhook receiver, and message sender.

npx playbooks add skill aaaaqwq/agi-super-skills --skill wechat-channel

Review the files below or copy the command above to add this skill to your agents.

Files (6)
SKILL.md
7.0 KB
---
name: wechat-channel
description: 微信 (WeChat) 与 OpenClaw 的双向集成通道。基于 Wechaty + PadLocal 实现微信消息的接收和发送,支持私聊、群聊、@提及检测、图片/文件传输。当需要通过微信与 AI 助手交互、接收微信消息触发 AI 响应、或从 OpenClaw 发送消息到微信时使用此技能。
allowed-tools: Bash, Read, Write, Edit
---

# 微信 Channel 集成

将微信接入 OpenClaw,实现双向消息通道。

## 架构概述

```
┌─────────────┐     ┌──────────────────┐     ┌─────────────┐
│   微信用户   │ ←→  │  Wechaty Bridge  │ ←→  │  OpenClaw   │
│  (私聊/群聊) │     │  (PadLocal协议)   │     │   Gateway   │
└─────────────┘     └──────────────────┘     └─────────────┘
                           ↓
                    ┌──────────────────┐
                    │   消息格式转换    │
                    │   - 文本/图片/文件 │
                    │   - @提及检测     │
                    │   - 群聊/私聊路由  │
                    └──────────────────┘
```

## 核心组件

### 1. Wechaty Bridge (消息桥接服务)

独立运行的 Node.js 服务,负责:
- 微信登录(扫码)
- 消息收发
- 联系人/群组管理
- 与 OpenClaw Gateway 通信

### 2. OpenClaw Webhook 接收器

接收来自 Wechaty Bridge 的消息,转发给 AI Agent。

### 3. 消息发送 API

OpenClaw Agent 通过 HTTP API 发送消息到微信。

## 快速开始

### 前置条件

- Node.js >= 18
- PadLocal Token(付费服务,约 ¥200/月)
- OpenClaw Gateway 运行中

### 1. 安装依赖

```bash
cd /home/aa/clawd/skills/wechat-channel
npm init -y
npm install wechaty wechaty-puppet-padlocal axios dotenv
```

### 2. 配置环境变量

```bash
cp .env.example .env
# 编辑 .env 填入配置
```

### 3. 启动服务

```bash
node scripts/wechat-bridge.js
# 扫描终端显示的二维码登录
```

## 配置说明

### 环境变量 (.env)

```env
# PadLocal Token (必需)
# 获取方式: https://pad-local.com
PADLOCAL_TOKEN=YOUR_PADLOCAL_TOKEN

# OpenClaw Gateway 配置
OPENCLAW_GATEWAY_URL=http://127.0.0.1:18789
OPENCLAW_WEBHOOK_SECRET=your_webhook_secret

# 微信 Bot 配置
WECHAT_BOT_NAME=OpenClaw助手

# 安全配置
# 允许的用户微信ID (逗号分隔,留空允许所有)
ALLOWED_USERS=wxid_xxx,wxid_yyy
# 允许的群聊ID (逗号分隔,留空允许所有)
ALLOWED_GROUPS=xxx@chatroom,yyy@chatroom

# 群聊行为
# 是否需要@才响应群消息
REQUIRE_MENTION_IN_GROUP=true

# 日志级别
LOG_LEVEL=info
```

### OpenClaw 配置 (openclaw.json)

```json
{
  "channels": {
    "wechat": {
      "enabled": true,
      "webhookUrl": "http://localhost:3001/webhook",
      "webhookSecret": "your_webhook_secret",
      "dmPolicy": "allowlist",
      "allowFrom": ["wxid_xxx", "wxid_yyy"],
      "groups": {
        "xxx@chatroom": {
          "name": "工作群",
          "requireMention": true
        }
      }
    }
  }
}
```

## 消息格式

### 接收消息 (Webhook Payload)

```json
{
  "type": "message",
  "channel": "wechat",
  "messageId": "msg_123456",
  "from": {
    "id": "wxid_sender",
    "name": "张三",
    "alias": "zhangsan"
  },
  "chat": {
    "id": "wxid_sender",
    "type": "private"
  },
  "text": "你好,帮我查一下天气",
  "timestamp": 1706745600000,
  "mentions": [],
  "replyTo": null
}
```

### 群聊消息

```json
{
  "type": "message",
  "channel": "wechat",
  "messageId": "msg_789012",
  "from": {
    "id": "wxid_sender",
    "name": "张三"
  },
  "chat": {
    "id": "xxx@chatroom",
    "type": "group",
    "name": "工作群"
  },
  "text": "@OpenClaw助手 帮我总结一下今天的会议",
  "mentions": ["bot_wxid"],
  "isMentioned": true
}
```

### 发送消息 (API)

```bash
# 发送文本
curl -X POST http://localhost:3001/api/send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_SECRET" \
  -d '{
    "to": "wxid_receiver",
    "type": "text",
    "content": "收到,正在处理..."
  }'

# 发送图片
curl -X POST http://localhost:3001/api/send \
  -H "Content-Type: application/json" \
  -d '{
    "to": "wxid_receiver",
    "type": "image",
    "url": "https://example.com/image.png"
  }'

# 发送文件
curl -X POST http://localhost:3001/api/send \
  -d '{
    "to": "wxid_receiver",
    "type": "file",
    "path": "/path/to/file.pdf",
    "filename": "report.pdf"
  }'
```

## 安全策略

### 私聊策略 (dmPolicy)

| 策略 | 说明 |
|------|------|
| `open` | 允许所有人私聊(危险) |
| `allowlist` | 仅允许 allowFrom 列表中的用户 |
| `pairing` | 需要配对审批 |

### 群聊策略

| 配置 | 说明 |
|------|------|
| `requireMention: true` | 必须@机器人才响应 |
| `allowFrom` | 群内允许触发的用户列表 |

## 使用场景

### 1. 个人助手

```
用户: 帮我查一下明天北京的天气
Bot: 明天北京天气:晴,温度 -5°C ~ 5°C,建议穿羽绒服。
```

### 2. 群聊助手

```
用户: @OpenClaw助手 总结一下刚才的讨论
Bot: 刚才讨论的要点:
1. 项目进度需要加快
2. 下周三前完成设计稿
3. 周五进行代码评审
```

### 3. 自动化通知

```javascript
// 从 OpenClaw Agent 发送通知
await sendWechatMessage({
  to: 'xxx@chatroom',
  text: '⚠️ 服务器 CPU 使用率超过 90%,请检查!'
});
```

## 故障排查

### 登录问题

**问题**: 扫码后无法登录
**解决**: 
1. 检查 PadLocal Token 是否有效
2. 确认微信账号未被限制
3. 尝试重新获取 Token

### 消息收发问题

**问题**: 消息发送失败
**解决**:
1. 检查网络连接
2. 确认目标用户/群组 ID 正确
3. 查看日志中的错误信息

### 连接断开

**问题**: 服务运行一段时间后断开
**解决**:
1. 使用 PM2 管理进程,自动重启
2. 检查 PadLocal 服务状态
3. 实现心跳检测和重连机制

## 限制说明

### PadLocal 限制

- 需要付费 Token(约 ¥200/月)
- 单 Token 只能登录一个微信号
- 可能受微信风控影响

### 微信平台限制

- 发送频率限制(建议间隔 1-2 秒)
- 群聊人数限制
- 文件大小限制(约 100MB)
- 不支持小程序消息

### 功能限制

- 不支持语音消息转文字(需额外集成)
- 不支持视频号内容
- 红包、转账等敏感功能不可用

## 相关文件

- `scripts/wechat-bridge.js` - 主服务代码
- `scripts/message-handler.js` - 消息处理逻辑
- `.env.example` - 环境变量模板
- `references/wechaty-api.md` - Wechaty API 参考

## TODO

- [ ] 获取 PadLocal Token
- [ ] 配置 OpenClaw Webhook 接收
- [ ] 测试私聊消息收发
- [ ] 测试群聊 @提及
- [ ] 配置安全策略
- [ ] 部署为系统服务
- [ ] 实现断线重连
- [ ] 添加消息队列(高并发场景)

Overview

This skill provides a bi-directional WeChat channel that integrates WeChat with OpenClaw using Wechaty and PadLocal. It enables receiving and sending WeChat messages (private and group), detects @ mentions, and transfers images and files. Use it to let AI agents interact via WeChat or to push notifications from OpenClaw into WeChat.

How this skill works

A Node.js Wechaty Bridge logs into WeChat (PadLocal puppet), listens for messages, and forwards normalized webhook payloads to the OpenClaw Gateway. OpenClaw agents respond via an HTTP send API to post text, images, or files back to WeChat. The bridge handles routing for private vs group chats and supports mention detection and basic message format conversion.

When to use it

  • Expose an AI assistant to users on WeChat for private Q&A or productivity tasks
  • Enable group chat workflows where the bot responds only when @mentioned
  • Send operational alerts and automated notifications from OpenClaw into WeChat groups or DMs
  • Prototype conversational automation that includes images or file attachments
  • Route incoming WeChat messages into AI pipelines for processing and enrichment

Best practices

  • Use allowlist dmPolicy and group allowFrom to limit who can trigger the bot
  • Require @ mentions in busy groups to avoid noisy responses
  • Throttle outbound messages to respect WeChat rate limits (1–2s between sends)
  • Run the bridge under a process manager (PM2/systemd) and implement heartbeat/reconnect logic
  • Store PadLocal token and webhook secrets securely via environment variables; never hardcode credentials

Example use cases

  • Personal AI assistant on WeChat that answers scheduling, weather, or knowledge queries
  • Meeting summarization in a group: users @ the bot and receive concise action points
  • Automated incident notifications: OpenClaw sends server alerts to a designated group chat
  • File distribution: agents send generated reports or images into DMs or group chats on demand
  • Controlled testing: use allowlist to pilot the bot with a small team before wider rollout

FAQ

Do I need a paid PadLocal token?

Yes. PadLocal requires a paid token and a single token can log one WeChat account; obtain and configure it via PADLOCAL_TOKEN.

How do I restrict who can message the bot?

Set dmPolicy to allowlist and populate allowFrom with permitted user IDs; configure group allowFrom and requireMention to control group triggers.

What message types are supported?

Text, images, and files are supported out of the box. Voice-to-text and video features are not supported without extra integration.

How do I handle reconnects and uptime?

Run the bridge with PM2 or systemd, enable logging, implement heartbeats and auto-reconnect, and monitor PadLocal service status.