wecom-automation
$
npx mdskill add aAAaqwq/AGI-Super-Team/wecom-automationAutomate WeChat Enterprise personal accounts with Wechaty.
- Handles friend requests, knowledge Q&A, and human handoffs.
- Depends on Wechaty, vector databases, and LLM APIs.
- Uses confidence thresholds to trigger human intervention.
- Delivers results via text, images, files, and voice.
SKILL.md
.github/skills/wecom-automationView on GitHub ↗
---
name: wecom-automation
description: 企业微信个人账号直连自动化。基于 Wechaty 框架实现企业微信消息接收、自动同意好友、知识库问答、人工介入提醒。适用于企业微信个人机器人和自动化助手场景。
allowed-tools: Bash, Read, Write, Edit, Exec, mcporter__*
---
# 企业微信个人账号直连自动化
基于 Wechaty 框架连接企业微信个人账号,实现完整的 AI 助手功能。适用于企业微信机器人、自动化客服、个人助手等场景。
## 核心功能
### 1. 自动同意好友添加
- 监听好友请求事件
- 自动通过好友验证
- 发送个性化欢迎消息
- 标注用户信息和来源
### 2. 智能问答(基于知识库)
- 向量知识库存储企业知识
- 语义搜索匹配问题
- LLM 生成专业回复
- 支持多轮对话上下文
### 3. 人工介入提醒
- 置信度阈值自动判断
- 通过 Telegram/飞书通知人工
- 记录未解决问题用于优化
- 平滑转接到人工客服
### 4. 消息类型支持
- 文本消息(问答、对话)
- 图片消息(OCR、识别)
- 文件消息(DOCX、PDF 等)
- 语音消息(转文字、语音交互)
- 链接消息(预览、摘要)
- 名片消息(保存、处理)
## 技术架构
```
┌──────────────┐
│ 企业微信 │
│ 个人账号 │
└──────┬───────┘
│
▼
┌──────────────────┐
│ Wechaty │
│ (PadLocal) │
└──────┬───────────┘
│
▼
┌────────────────────┐
│ OpenClaw Gateway │
│ (消息分发、处理) │
└──────┬─────────────┘
│
├──────────────┬──────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 向量知识库 │ │ LLM API │ │ 通知服务 │
│(PG+pgvec)│ │ (Kimi/GPT)│ │(Telegram)│
└──────────┘ └──────────┘ └──────────┘
```
## 快速开始
### 方案选择
企业微信个人账号直连有两种方案:
#### 方案 A:Wechaty + PadLocal(推荐,适合个人)
**优点**:
- 配置简单,快速上手
- 稳定性高,官方维护
- 支持所有消息类型
- 适合个人使用
**缺点**:
- PadLocal 需要付费(约 50 元/月)
- 单账号限制
**适用场景**:个人助手、小规模客服
#### 方案 B:企业微信内部应用 API(适合企业)
**优点**:
- 官方 API,免费使用
- 稳定性最高
- 支持大规模部署
**缺点**:
- 需要企业认证
- 配置相对复杂
- 功能受限于 API
**适用场景**:企业客服、大规模应用
**本技能使用方案 A(Wechaty + PadLocal)**
### 第一步:申请 PadLocal Token
1. 访问 https://github.com/wechaty/wechaty
2. 选择 "PadLocal" 协议
3. 注册账号并获取 Token
4. 保存 Token 到 pass:
```bash
pass insert api/wechaty-padlocal
```
### 第二步:安装依赖
```bash
# 1. 安装 Node.js 依赖
cd ~/clawd/skills/wecom-automation
npm install
# 2. 安装 Python 依赖
pip3 install -r requirements.txt
# 3. 配置环境变量
cp .env.example .env
```
### 第三步:配置环境变量
编辑 `~/clawd/skills/wecom-automation/.env`:
```env
# Wechaty 配置
WECHATY_PUPPET=padlocal
WECHATY_TOKEN=$(pass show api/wechaty-padlocal)
WECHATY_LOG_LEVEL=info
# 企业微信账号配置
WECOM_NAME="企业微信机器人"
WECOM_QR_CODE_PATH=/tmp/wecom_qrcode.png
# 知识库配置
KB_DB_URL=postgresql://postgres@localhost/wecom_kb
KB_SIMILARITY_THRESHOLD=0.7
KB_TOP_K=3
# LLM 配置
LLM_PROVIDER=kimi
LLM_API_KEY=$(pass show api/kimi)
LLM_API_BASE=https://api.moonshot.cn/v1
LLM_MODEL=moonshot-v1-8k
# 人工介入通知
NOTIFICATION_CHANNEL=telegram:8518085684
NOTIFICATION_ENABLED=true
# OpenClaw Gateway 配置
GATEWAY_URL=http://localhost:8080
GATEWAY_TOKEN=$(pass show api/openclaw-gateway)
```
### 第四步:初始化数据库
```bash
# 创建数据库
sudo -u postgres createdb wecom_kb
# 初始化表结构
psql wecom_kb < ~/clawd/skills/wecom-automation/schema.sql
# 导入示例知识库
python3 ~/clawd/skills/wecom-automation/scripts/import_kb.py \
--input ~/clawd/skills/wecom-automation/knowledge/sample.md \
--category "常见问题" \
--key "$(pass show api/kimi)"
```
### 第五步:启动机器人
```bash
# 方式 1:直接运行
cd ~/clawd/skills/wecom-automation
npm start
# 方式 2:通过 PM2(推荐)
pm2 start ~/clawd/skills/wecom-automation/ecosystem.config.js
# 查看日志
pm2 logs wecom-bot
```
### 第六步:扫码登录
启动机器人后会显示二维码:
```
██████████████████████████████████
██ ██
██ 1. 打开企业微信 → 扫一扫 ██
██ 2. 扫描下方二维码登录 ██
██ ██
██████████████████████████████████
[二维码图片]
```
使用企业微信扫码登录后,机器人即可正常工作。
## 使用方法
### 场景 1:新好友自动欢迎
```javascript
// workflows/on_friend_add.js
const { Contact } = require('wechaty')
bot.on('friendship', async friendship => {
if (friendship.type() === Friendship.Type.Receive) {
const contact = friendship.contact()
// 自动通过好友请求
await friendship.accept()
// 发送欢迎消息
await contact.say(`👋 欢迎来到${contact.name()}!
我是智能助手小a,可以帮您:
• 解答常见问题
• 处理售后请求
• 查询订单状态
如有复杂问题,我会转接人工客服为您服务。`)
// 添加到数据库
await saveUser(contact)
}
})
```
### 场景 2:知识库问答
```javascript
// workflows/answer_question.js
const { Message } = require('wechaty')
bot.on('message', async msg => {
if (msg.type() === Message.Type.Text) {
const text = msg.text()
const from = msg.from()
// 搜索知识库
const results = await searchKnowledge(text)
// 生成答案
const answer = await generateAnswer(text, results)
// 判断是否需要人工介入
if (answer.confidence < 0.7) {
await escalateToHuman(from, text, answer)
} else {
await msg.say(answer.text)
}
}
})
```
### 场景 3:文件处理(DOCX/PDF)
```javascript
// workflows/handle_file.js
const { Message } = require('wechaty')
bot.on('message', async msg => {
if (msg.type() === Message.Type.Attachment) {
const file = await msg.toFileBox()
// 下载文件
const filePath = `/tmp/${file.name}`
await file.toFile(filePath)
// 处理文件(提取内容、分析等)
const content = await extractFileContent(filePath)
// 发送回复
await msg.say(`✅ 已收到文件:${file.name}\n\n正在处理...`)
// 处理后回复
await processAndReply(msg, content)
}
})
```
### 场景 4:人工介入提醒
```javascript
// workflows/escalate.js
async function escalateToHuman(contact, question, answer) {
// 1. 发送用户消息
await contact.say('⏳ 已为您转接人工客服,请稍候...')
// 2. 通过 Telegram 通知人工客服
const notification = `🚨 需要人工介入
用户:${contact.name()}
问题:${question}
时间:${new Date().toLocaleString()}
请及时处理。`
await sendTelegramNotification(notification)
// 3. 记录未解决问题
await saveUnknownQuestion(contact, question)
}
```
## 目录结构
```
~/clawd/skills/wecom-automation/
├── SKILL.md # 本文件
├── package.json # Node.js 依赖
├── requirements.txt # Python 依赖
├── ecosystem.config.js # PM2 配置
├── .env.example # 环境变量模板
├── schema.sql # 数据库表结构
├── bot.js # Wechaty 机器人主文件
├── config/
│ ├── knowledge.js # 知识库配置
│ └── escalation.js # 人工介入规则
├── workflows/
│ ├── on_friend_add.js # 好友添加处理
│ ├── answer_question.js # 问答处理
│ ├── handle_file.js # 文件处理
│ └── escalate.js # 人工介入
├── lib/
│ ├── knowledge.js # 知识库操作
│ ├── llm.js # LLM 调用
│ ├── notification.js # 通知服务
│ └── database.js # 数据库操作
└── knowledge/
└── sample.md # 示例知识文档
```
## API 参考文档
### 企业微信 API 文档
- [企业微信 API 总览](https://developer.work.weixin.qq.com/document/path/90665)
- [消息发送](https://developer.work.weixin.qq.com/document/path/90236)
- [成员管理](https://developer.work.weixin.qq.com/document/path/90198)
### Wechaty 文档
- [Wechaty 官方文档](https://wechaty.js.org)
- [PadLocal 协议](https://github.com/wechaty/puppet-service)
- [消息类型](https://wechaty.js.org/docs/api/message)
### Kimi API 文档
- [Kimi API 总览](https://platform.moonshot.cn/docs)
- [Embedding API](https://platform.moonshot.cn/docs/api/embedding)
- [Chat API](https://platform.moonshot.cn/docs/api/chat)
## 高级功能
### 1. 多轮对话记忆
```javascript
// 使用 Redis 存储会话上下文
const redis = require('redis')
const client = redis.createClient()
async function getConversationHistory(userId) {
const history = await client.get(`conv:${userId}`)
return history ? JSON.parse(history) : []
}
async function appendMessage(userId, role, content) {
const history = await getConversationHistory(userId)
history.push({ role, content, timestamp: Date.now() })
await client.set(`conv:${userId}`, JSON.stringify(history))
}
```
### 2. 文件处理
```javascript
// 提取 DOCX 内容
const docx = require('docx')
async function extractDocx(filePath) {
const doc = await docx.Document.read(filePath)
const text = doc.paragraphs.map(p => p.text).join('\n')
return text
}
// 提取 PDF 内容
const pdf = require('pdf-parse')
async function extractPdf(filePath) {
const data = await fs.readFile(filePath)
const result = await pdf(data)
return result.text
}
```
### 3. 语音转文字
```python
# 使用 Whisper API
import openai
def transcribe_audio(audio_path):
with open(audio_path, "rb") as audio:
transcript = openai.Audio.transcribe(
model="whisper-1",
file=audio
)
return transcript["text"]
```
### 4. 图片 OCR
```python
# 使用 Kimi Vision
import openai
def ocr_image(image_path):
with open(image_path, "rb") as image:
result = openai.chat.completions.create(
model="gemini-2.5-pro",
messages=[{
"role": "user",
"content": "识别图片中的文字"
}],
image=image
)
return result.choices[0].message.content
```
## 监控与维护
### 日志查看
```bash
# PM2 日志
pm2 logs wecom-bot
# 错误日志
pm2 logs wecom-bot --err
# 实时日志
pm2 logs wecom-bot --lines 100
```
### 性能监控
```javascript
// 添加自定义指标
const prometheus = require('prom-client')
const messageCounter = new prometheus.Counter({
name: 'wecom_messages_total',
help: 'Total messages received',
labelNames: ['type']
})
const answerLatency = new prometheus.Histogram({
name: 'wecom_answer_latency_seconds',
help: 'Answer generation latency',
buckets: [0.1, 0.5, 1, 2, 5, 10]
})
```
### 人工介入统计
```sql
-- 查看未解决问题分布
SELECT
COUNT(*) as count,
SUBSTRING(question, 1, 30) as question_preview
FROM unknown_questions
GROUP BY question_preview
ORDER BY count DESC
LIMIT 10;
-- 查看每日介入次数
SELECT
DATE(created_at) as date,
COUNT(*) as escalations
FROM escalation_log
GROUP BY DATE(created_at)
ORDER BY date DESC
LIMIT 7;
```
## 故障排查
### 问题 1:无法扫码登录
```bash
# 检查 Wechaty 日志
pm2 logs wecom-bot --lines 50
# 重启机器人
pm2 restart wecom-bot
# 清理缓存
rm -rf /tmp/wechaty*
pm2 restart wecom-bot
```
### 问题 2:消息不回复
```bash
# 检查知识库连接
psql wecom_kb -c "SELECT COUNT(*) FROM knowledge_chunks;"
# 测试 LLM API
curl -X POST https://api.moonshot.cn/v1/chat/completions \
-H "Authorization: Bearer $KIMI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"moonshot-v1-8k","messages":[{"role":"user","content":"测试"}]}'
# 检查环境变量
cat ~/clawd/skills/wecom-automation/.env | grep -E "^(LLM|KB|NOTIFICATION)"
```
### 问题 3:文件无法接收
```bash
# 检查临时目录权限
ls -la /tmp/
# 创建日志目录
mkdir -p ~/clawd/skills/wecom-automation/logs
chmod 755 ~/clawd/skills/wecom-automation/logs
# 检查磁盘空间
df -h
```
## 安全最佳实践
1. **密钥管理**
- 所有密钥使用 `pass` 存储
- 环境变量引用,不硬编码
- 定期轮换 Token
2. **数据隐私**
- 客户信息加密存储
- 定期清理敏感日志
- 遵守数据保护法规
3. **访问控制**
- API 接口鉴权
- IP 白名单限制
- 请求频率限制
4. **审计日志**
- 记录所有人工介入
- 定期审查访问日志
- 异常行为告警
## 扩展功能
### 1. 主动营销
```javascript
// 定期推送优惠信息
const schedule = require('node-schedule')
schedule.scheduleJob('0 10 * * 1-5', async () => {
const users = await getActiveUsers(7)
for (const user of users) {
await user.say('🎉 今日特惠:...')
}
})
```
### 2. 群组管理
```javascript
// 自动邀请用户加入群组
bot.on('friendship', async friendship => {
const contact = friendship.contact()
const room = await bot.Room.find({ topic: '客户群' })
if (room) {
await room.add(contact)
await contact.say('已邀请您加入客户群')
}
})
```
### 3. 数据统计
```javascript
// 每日生成报表
async function generateDailyReport() {
const stats = {
newUsers: await countNewUsers(),
questions: await countQuestions(),
escalations: await countEscalations()
}
await sendReportToAdmin(stats)
}
```
## 相关技能
- **wecom-cs-automation**: 企业微信客服 API 方式
- **feishu-automation**: 飞书平台自动化
- **notion-automation**: Notion 知识库集成
- **telegram-automation**: Telegram 通知集成
## 成本对比
| 方案 | 月成本 | 适用场景 |
|------|--------|---------|
| **Wechaty + PadLocal** | ~50元 | 个人、小团队 |
| **企业微信内部应用** | 免费 | 企业、大规模 |
| **企业微信客服 API** | 按量 | 企业客服 |
## 参考资源
- [Wechaty GitHub](https://github.com/wechaty/wechaty)
- [PadLocal 官网](https://github.com/wechaty/puppet-service)
- [企业微信开发者中心](https://developer.work.weixin.qq.com/)
- [PostgreSQL pgvector](https://github.com/pgvector/pgvector)
More from aAAaqwq/AGI-Super-Team
- a-fund-monitor监控 A 股基金实时估值与盘后净值,自动判断交易日并生成提醒或分析。
- account-executive>
- add-leadAdd company/person/relationship to CRM
- adsComprehensive ad account analysis across all major platforms (Google, Meta
- ads-agentAI-агент для управления Facebook рекламой. Вызывай для анализа, оптимизации, создания кампаний и отчётов.
- afrexai-compliance-auditRun internal compliance audits against major governance and security
- afrexai-personal-financeComplete personal finance system — budgeting, debt payoff, investing, tax optimization, net worth tracking, and financial independence planning. Use when managing money, building wealth, paying off debt, planning retirement, or optimizing taxes. Zero dependencies.
- after-salesUse when managing post-purchase experience, building customer loyalty, or increasing repeat purchases
- agent-contactsAI agent contacts — add, list, remove MCP contacts. Use when someone gives an agent URL, or when you need to view/remove contacts.
- agent-model-switcher批量查看和切换子 agent 的模型配置,用于统一调整多 agent 的 provider/model 设置。