npx skills add ...
npx skills add reason-machines/hermes-skills --skill openclaw-wechat-integration
Connect OpenClaw AI agents to personal WeChat accounts for messaging, group chats, and automation
npx skills add reason-machines/hermes-skills --skill openclaw-wechat-integration
Skill by ara.so — Hermes Skills collection.
This skill provides expertise in using the openclaw-wechat plugin to connect OpenClaw AI agents to personal WeChat accounts, enabling automated messaging, group chat interactions, and multi-account management.
openclaw-wechat is a WeChat channel plugin for OpenClaw that enables:
The configuration is stored in ~/.openclaw/openclaw.json:
| Option | Required | Default | Description |
|---|---|---|---|
enabled | Yes | false | Enable/disable the WeChat channel |
apiKey | Yes | - | API key from service provider |
proxyUrl | Yes | - | Proxy service URL for WeChat protocol |
webhookHost | Cloud only | - | Public IP or domain for webhooks |
webhookPort | No | 18790 | Port for webhook listener |
webhookPath | No | /webhook/wechat | Webhook endpoint path |
deviceType | No | "ipad" | Device type: "ipad" or "mac" |
Start the gateway to initiate login:
The terminal will display a QR code. Scan it with your WeChat mobile app to authenticate.
Check logs for connection status:
Configure multiple accounts with distinct API keys:
Important: Each account must use a unique webhookPort to avoid conflicts.
The plugin automatically receives messages via webhooks. Ensure your webhook endpoint is accessible:
When building OpenClaw skills that send WeChat messages:
Create /etc/systemd/system/openclaw-gateway.service:
Enable and start:
Symptoms: Gateway starts but no messages arrive.
Solutions:
Symptoms: Gateway starts but no QR code appears.
Solutions:
Symptoms: Bot stops responding, shows login errors.
Solutions:
Scan QR code again with WeChat
Check WeChat account status (ensure not blocked)
Symptoms: Second account fails to start.
Solution: Ensure each account has a unique webhookPort:
Symptoms: Cannot connect to proxy server.
Solutions:
openclaw config set channels.wechat.proxyUrl "http://your-proxy-server:3000"openclaw config set channels.wechat.webhookHost "your-server-ip"openclaw config set channels.wechat.enabled true{
"channels": {
"wechat": {
"enabled": true,
"apiKey": "wc_live_xxxxxxxxxxxxxxxx",
"proxyUrl": "http://your-proxy:3000",
"webhookHost": "1.2.3.4",
"webhookPort": 18790,
"webhookPath": "/webhook/wechat",
"deviceType": "ipad"
}
}
}openclaw gateway startopenclaw gateway statusopenclaw gateway statusopenclaw gateway logs{
"channels": {
"wechat": {
"accounts": {
"work": {
"apiKey": "wc_live_work_xxx",
"webhookHost": "1.2.3.4",
"webhookPort": 18790,
"deviceType": "ipad"
},
"personal": {
"apiKey": "wc_live_personal_xxx",
"webhookHost": "1.2.3.4",
"webhookPort": 18791,
"deviceType": "mac"
}
}
}
}
}// OpenClaw automatically handles incoming messages
// Configure message handlers in your OpenClaw skills
// Example skill handler (conceptual)
export async function onMessage(context: MessageContext) {
const { message, channel } = context;
if (channel === 'wechat') {
console.log('WeChat message:', message.text);
console.log('From:', message.sender);
console.log('Chat type:', message.isGroup ? 'group' : 'private');
}
}// Example: Sending a text message
await context.send({
channel: 'wechat',
to: 'wxid_xxxxxxxxxx',
text: 'Hello from OpenClaw!'
});
// Example: Sending to a group
await context.send({
channel: 'wechat',
to: 'group_id',
text: 'Message to group',
isGroup: true
});// Receiving images
export async function onMessage(context: MessageContext) {
if (context.message.type === 'image') {
const imageUrl = context.message.imageUrl;
// Process image
}
}
// Sending images
await context.send({
channel: 'wechat',
to: 'wxid_xxxxxxxxxx',
type: 'image',
imageUrl: 'https://example.com/image.png'
});# Example: UFW on Ubuntu
sudo ufw allow 18790/tcp# Test from external machine
curl http://YOUR_SERVER_IP:18790/webhook/wechat[Unit]
Description=OpenClaw Gateway Service
After=network.target
[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=/home/YOUR_USER
ExecStart=/usr/local/bin/openclaw gateway start
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetsudo systemctl enable openclaw-gateway
sudo systemctl start openclaw-gateway
sudo systemctl status openclaw-gatewayFROM node:18-alpine
WORKDIR /app
# Install OpenClaw
RUN npm install -g openclaw
# Install plugin
RUN openclaw plugins install @canghe/openclaw-wechat
# Expose webhook port
EXPOSE 18790
# Configure via environment
ENV OPENCLAW_CONFIG_PATH=/app/config/openclaw.json
CMD ["openclaw", "gateway", "start"]openclaw config get channels.wechat.webhookHost
# Should return your public IP# From external network
telnet YOUR_SERVER_IP 18790openclaw gateway logs --tail 100curl -X POST http://YOUR_SERVER_IP:18790/webhook/wechat \
-H "Content-Type: application/json" \
-d '{"test": true}'curl http://your-proxy-server:3000/healthopenclaw config get channels.wechat.apiKeyrm -rf ~/.openclaw/sessions/wechat
openclaw gateway restartopenclaw gateway restart{
"channels": {
"wechat": {
"accounts": {
"account1": {
"webhookPort": 18790
},
"account2": {
"webhookPort": 18791
}
}
}
}
}curl http://your-proxy-server:3000ping your-proxy-serveropenclaw config set channels.wechat.proxyUrl "http://new-proxy:3000"# View current configuration
openclaw config list
# Start gateway in foreground
openclaw gateway start
# Start gateway in background
openclaw gateway start --daemon
# Stop gateway
openclaw gateway stop
# Restart gateway
openclaw gateway restart
# View logs
openclaw gateway logs
# View real-time logs
openclaw gateway logs --follow
# Check gateway status
openclaw gateway status
# Uninstall plugin
openclaw plugins uninstall wechatexport WECHAT_API_KEY="wc_live_xxxxxxxxxxxxxxxx"
openclaw config set channels.wechat.apiKey "$WECHAT_API_KEY"openclaw config set logging.rotation.enabled true
openclaw config set logging.rotation.maxSize "100M"tar -czf openclaw-backup-$(date +%Y%m%d).tar.gz ~/.openclaw/sessionssudo ufw default deny incoming
sudo ufw allow 18790/tcp
sudo ufw enable