wecom-automation
21
总安装量
21
周安装量
#17390
全站排名
安装命令
npx skills add https://github.com/aaaaqwq/claude-code-skills --skill wecom-automation
Agent 安装分布
gemini-cli
20
github-copilot
20
codex
20
amp
20
kimi-cli
20
cursor
20
Skill 文档
ä¼ä¸å¾®ä¿¡ä¸ªäººè´¦å·ç´è¿èªå¨å
åºäº 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
- è®¿é® https://github.com/wechaty/wechaty
- éæ© “PadLocal” åè®®
- 注åè´¦å·å¹¶è·å Token
- ä¿å Token å° passï¼
pass insert api/wechaty-padlocal
ç¬¬äºæ¥ï¼å®è£ ä¾èµ
# 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ï¼
# 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)
ç¬¬åæ¥ï¼åå§åæ°æ®åº
# åå»ºæ°æ®åº
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)"
ç¬¬äºæ¥ï¼å¯å¨æºå¨äºº
# æ¹å¼ 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ï¼æ°å¥½åèªå¨æ¬¢è¿
// 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ï¼ç¥è¯åºé®ç
// 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ï¼
// 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ï¼äººå·¥ä»å ¥æé
// 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 ææ¡£
Wechaty ææ¡£
Kimi API ææ¡£
é«çº§åè½
1. å¤è½®å¯¹è¯è®°å¿
// ä½¿ç¨ 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. æä»¶å¤ç
// æå 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. è¯é³è½¬æå
# ä½¿ç¨ 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
# ä½¿ç¨ 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
çæ§ä¸ç»´æ¤
æ¥å¿æ¥ç
# PM2 æ¥å¿
pm2 logs wecom-bot
# é误æ¥å¿
pm2 logs wecom-bot --err
# 宿¶æ¥å¿
pm2 logs wecom-bot --lines 100
æ§è½çæ§
// æ·»å èªå®ä¹ææ
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]
})
人工ä»å ¥ç»è®¡
-- æ¥çæªè§£å³é®é¢åå¸
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ï¼æ æ³æ«ç ç»å½
# æ£æ¥ Wechaty æ¥å¿
pm2 logs wecom-bot --lines 50
# é坿ºå¨äºº
pm2 restart wecom-bot
# æ¸
çç¼å
rm -rf /tmp/wechaty*
pm2 restart wecom-bot
é®é¢ 2ï¼æ¶æ¯ä¸åå¤
# æ£æ¥ç¥è¯åºè¿æ¥
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ï¼æä»¶æ æ³æ¥æ¶
# æ£æ¥ä¸´æ¶ç®å½æé
ls -la /tmp/
# å建æ¥å¿ç®å½
mkdir -p ~/clawd/skills/wecom-automation/logs
chmod 755 ~/clawd/skills/wecom-automation/logs
# æ£æ¥ç£ç空é´
df -h
å®å ¨æä½³å®è·µ
-
å¯é¥ç®¡ç
- ææå¯é¥ä½¿ç¨
passåå¨ - ç¯å¢åéå¼ç¨ï¼ä¸ç¡¬ç¼ç
- å®æè½®æ¢ Token
- ææå¯é¥ä½¿ç¨
-
æ°æ®éç§
- 客æ·ä¿¡æ¯å å¯åå¨
- å®ææ¸ çæææ¥å¿
- éµå®æ°æ®ä¿æ¤æ³è§
-
è®¿é®æ§å¶
- API æ¥å£é´æ
- IP ç½ååéå¶
- 请æ±é¢çéå¶
-
审计æ¥å¿
- è®°å½ææäººå·¥ä»å ¥
- 宿审æ¥è®¿é®æ¥å¿
- å¼å¸¸è¡ä¸ºåè¦
æ©å±åè½
1. 主å¨è¥é
// 宿æ¨é伿 ä¿¡æ¯
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. 群ç»ç®¡ç
// èªå¨éè¯·ç¨æ·å å
¥ç¾¤ç»
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. æ°æ®ç»è®¡
// æ¯æ¥çææ¥è¡¨
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 | æé | ä¼ä¸å®¢æ |