wecom-automation
WechatyフレームワークをベースにWeCom(企業向けWeChat)個人アカウントの自動化を実現するスキル。メッセージの受信、友達申請の自動承認、ナレッジベースを活用したQ&A応答、有人対応が必要な場合のアラート通知などの機能を提供します。企業向けWeComの個人ボットや自動化アシスタントの構築シナリオに最適です。
description の原文を見る
企业微信个人账号直连自动化。基于 Wechaty 框架实现企业微信消息接收、自动同意好友、知识库问答、人工介入提醒。适用于企业微信个人机器人和自动化助手场景。
SKILL.md 本文
企業微信個人アカウント直接接続自動化
Wechaty フレームワークを使用して企業微信個人アカウントを接続し、完全な AI アシスタント機能を実装します。企業微信ボット、自動化カスタマーサービス、個人アシスタントなどのシナリオに適用できます。
コア機能
1. 自動友達追加承認
- 友達リクエストイベントの監視
- 友達検証の自動承認
- パーソナライズされたウェルカムメッセージの送信
- ユーザー情報と情報源のタグ付け
2. インテリジェント Q&A(ナレッジベース基盤)
- ベクトルナレッジベースへの企業知識の保存
- セマンティック検索による質問マッチング
- LLM による専門的な返信生成
- マルチターンダイアログコンテキスト対応
3. 人的介入アラート
- 信頼度閾値による自動判定
- Telegram/飛書による人工スタッフへの通知
- 未解決問題の記録と最適化用データ収集
- カスタマーサービスへのスムーズなハンドオフ
4. メッセージタイプのサポート
- テキストメッセージ(Q&A、ダイアログ)
- 画像メッセージ(OCR、認識)
- ファイルメッセージ(DOCX、PDF など)
- 音声メッセージ(テキスト変換、音声相互作用)
- リンクメッセージ(プレビュー、要約)
- 名刺メッセージ(保存、処理)
テクニカルアーキテクチャ
┌──────────────┐
│ 企業微信 │
│ 個人アカウント│
└──────┬───────┘
│
▼
┌──────────────────┐
│ Wechaty │
│ (PadLocal) │
└──────┬───────────┘
│
▼
┌────────────────────┐
│ OpenClaw Gateway │
│ (メッセージ分散、処理)│
└──────┬─────────────┘
│
├──────────────┬──────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ ベクトル │ │ LLM API │ │ 通知サービス│
│ナレッジベース│ │(Kimi/GPT) │ │(Telegram) │
│(PG+pgvec)│ └──────────┘ └──────────┘
└──────────┘
クイックスタート
プラン選択
企業微信個人アカウント直接接続には 2 つのプランがあります。
プラン A:Wechaty + PadLocal(推奨、個人向け)
メリット:
- シンプルな設定で簡単に開始可能
- 高い安定性、公式メンテナンス
- すべてのメッセージタイプに対応
- 個人利用に適している
デメリット:
- PadLocal は有料(約 50 元/月)
- 単一アカウント制限
適用シナリオ:個人アシスタント、小規模カスタマーサービス
プラン B:企業微信内部アプリケーション API(企業向け)
メリット:
- 公式 API、無料利用
- 最高の安定性
- 大規模デプロイに対応
デメリット:
- 企業認証が必要
- 設定が相対的に複雑
- API による機能制限あり
適用シナリオ:企業カスタマーサービス、大規模アプリケーション
本スキルはプラン A(Wechaty + PadLocal)を使用します
ステップ 1:PadLocal Token の申請
- https://github.com/wechaty/wechaty にアクセス
- "PadLocal" プロトコルを選択
- アカウントを登録して Token を取得
- Token を pass に保存:
pass insert api/wechaty-padlocal
ステップ 2:依存関係のインストール
# 1. Node.js 依存関係のインストール
cd ~/clawd/skills/wecom-automation
npm install
# 2. Python 依存関係のインストール
pip3 install -r requirements.txt
# 3. 環境変数の設定
cp .env.example .env
ステップ 3:環境変数の設定
~/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)
ステップ 4:データベースの初期化
# データベースの作成
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)"
ステップ 5:ボットの起動
# 方法 1:直接実行
cd ~/clawd/skills/wecom-automation
npm start
# 方法 2:PM2 経由(推奨)
pm2 start ~/clawd/skills/wecom-automation/ecosystem.config.js
# ログの表示
pm2 logs wecom-bot
ステップ 6:QR コードをスキャンしてログイン
ボット起動後、QR コードが表示されます:
██████████████████████████████████
██ ██
██ 1. 企業微信を開く → スキャン ██
██ 2. 下記 QR コードをスキャン ██
██ してログイン ██
██ ██
██████████████████████████████████
[QR code image]
企業微信でスキャンしてログインすると、ボットが正常に動作します。
使用方法
シナリオ 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()} さん、ようこそ!
私は AI アシスタント小 a です。以下のことがお手伝いできます:
• よくある質問への回答
• アフターサービスリクエストの処理
• 注文ステータスの確認
複雑な問題がございましたら、人工スタッフにお繋ぎします。`)
// データベースにユーザーを追加
await saveUser(contact)
}
})
シナリオ 2:ナレッジベース Q&A
// 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 # Q&A 処理
│ ├── 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:QR コードをスキャンしてログインできない
# 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 | 従量課金 | 企業カスタマーサービス |
参考資料
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- aaaaqwq
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/aaaaqwq/claude-code-skills / ライセンス: MIT
関連スキル
newsblur-cli
ターミナルからNewsBlurを管理できます。フィードの閲覧、ストーリーの検索、記事の保存・共有、インテリジェンス分類器の学習、新しいフィードの発見、ワークフローの自動化がNewsBlur CLIで実現します。ユーザーがNewsBlurアカウントを操作したい場合、フィードの確認、購読管理、またはニュース読み込みに関するスクリプト構築時に活用してください。
caveman-compress
自然言語のメモリファイル(CLAUDE.md、todos、preferences)を「原始人形式」に圧縮し、入力トークンを削減します。技術的な内容、コード、URL、構造はすべて保持したまま圧縮します。圧縮版が元のファイルを上書きし、人間が読める形のバックアップはFILE.original.mdとして保存されます。トリガー:/caveman-compress FILEPATH または「compress memory file」
find-skills
日本語の意図から Agent Skills を発見する。「楽天SEOのスキル探して」「PDFを処理したい」「データ分析を自動化したい」などの日本語リクエストに対応。Claude Code (CLI)、Codex、Gemini CLI、claude.ai (Web) いずれでも動作。日本最大の Agent Skills データベース「Agent Skills by ALSEL」(11,000件超、全件日本語化、ダウンロード可能スキル8,600件超) から、ユーザーの意図に合うスキルを推薦・インストール案内する。
planning-and-task-breakdown
仕事を順序立てたタスクに分割します。仕様書や要件が明確にあり、実装可能なタスクに分解する必要がある場合に利用してください。タスクが大きすぎて着手しづらい場合、スコープを見積もる必要がある場合、または並列で作業を進められる場合に活用できます。
docx
このスキルは、ユーザーがWord文書(.docxファイル)を作成、読み込み、編集、操作したいときに使用します。以下の場合に実行してください:「Word文書」「.docx」などの記述、または目次・見出し・ページ番号・レターヘッドなどのフォーマットを含む専門的な文書の作成リクエスト。また、.docxファイルのコンテンツ抽出・再編成、文書への画像挿入・置換、Word形式での検索置換、変更履歴やコメント機能の使用、コンテンツを整形したWord文書への変換の場合も対象です。ユーザーが「レポート」「メモ」「手紙」「テンプレート」などの成果物をWord形式または.docxファイルで求める場合はこのスキルを使用してください。PDF、スプレッドシート、Google Docs、文書作成と無関係なコーディングタスクには使用しないでください。
idea-refine
アイデアを反復的に改善します。構造化された発散的思考と収束的思考を通じて、アイデアを洗練させることができます。「idea-refine」または「ideate」を使用してトリガーします。