121 lines
3.5 KiB
JavaScript
121 lines
3.5 KiB
JavaScript
const { login, start } = require('weixin-agent-sdk');
|
|
const axios = require('axios');
|
|
|
|
const NANOBOT_BRIDGE_URL = process.env.NANOBOT_BRIDGE_URL || 'http://127.0.0.1:5000/chat';
|
|
const BASE_URL = NANOBOT_BRIDGE_URL.replace('/chat', '');
|
|
|
|
console.log('🔌 WeChat-Nanobot Bridge');
|
|
console.log(' 桥接地址:', NANOBOT_BRIDGE_URL);
|
|
console.log(' 支持命令: /clear, /context, /reset, /stats');
|
|
|
|
// 命令处理
|
|
async function handleCommand(text, conversationId) {
|
|
const cmd = text.trim().toLowerCase();
|
|
|
|
switch (cmd) {
|
|
case '/clear':
|
|
try {
|
|
await axios.post(`${BASE_URL}/clear`, { conversationId });
|
|
return { text: '✅ 会话历史已清空' };
|
|
} catch (e) {
|
|
return { text: '❌ 清空失败: ' + e.message };
|
|
}
|
|
|
|
case '/context':
|
|
case '/history':
|
|
try {
|
|
const res = await axios.post(`${BASE_URL}/context`, { conversationId });
|
|
const data = res.data;
|
|
if (data.status === 'ok') {
|
|
let msg = `📜 历史记录 (${data.message_count}条):\n`;
|
|
data.history.slice(-5).forEach((h, i) => {
|
|
const role = h.role === 'user' ? '👤' : '🤖';
|
|
msg += `${role} ${h.content.substring(0, 50)}${h.content.length > 50 ? '...' : ''}\n`;
|
|
});
|
|
return { text: msg };
|
|
}
|
|
} catch (e) {
|
|
return { text: '❌ 获取历史失败: ' + e.message };
|
|
}
|
|
|
|
case '/reset':
|
|
try {
|
|
await axios.post(`${BASE_URL}/reset`, { conversationId });
|
|
return { text: '✅ 会话已完全重置' };
|
|
} catch (e) {
|
|
return { text: '❌ 重置失败: ' + e.message };
|
|
}
|
|
|
|
case '/stats':
|
|
case '/status':
|
|
try {
|
|
const res = await axios.get(`${BASE_URL}/stats`);
|
|
const data = res.data;
|
|
if (data.status === 'ok') {
|
|
return { text: `📊 服务状态:\n会话数: ${data.stats.total_sessions}\n消息数: ${data.stats.total_messages}` };
|
|
}
|
|
} catch (e) {
|
|
return { text: '❌ 获取状态失败: ' + e.message };
|
|
}
|
|
|
|
case '/help':
|
|
case '/?':
|
|
return { text: `🤖 可用命令:
|
|
/clear - 清空当前会话历史
|
|
/context - 查看会话历史
|
|
/reset - 完全重置会话
|
|
/stats - 查看服务统计
|
|
/help - 显示此帮助` };
|
|
|
|
default:
|
|
return null; // 不是命令,继续正常处理
|
|
}
|
|
}
|
|
|
|
const agent = {
|
|
async chat(request) {
|
|
try {
|
|
const { conversationId, text, media } = request;
|
|
console.log(`\n📨 [${conversationId}] ${text.substring(0, 50)}...`);
|
|
|
|
// 检查是否是命令
|
|
const cmdResult = await handleCommand(text, conversationId);
|
|
if (cmdResult) {
|
|
console.log(`📤 命令回复: ${cmdResult.text.substring(0, 50)}...`);
|
|
return cmdResult;
|
|
}
|
|
|
|
// 正常消息处理
|
|
const response = await axios.post(NANOBOT_BRIDGE_URL, {
|
|
conversationId,
|
|
text,
|
|
media
|
|
}, {
|
|
timeout: 70000
|
|
});
|
|
|
|
console.log(`📤 回复: ${response.data.text.substring(0, 50)}...`);
|
|
|
|
return {
|
|
text: response.data.text,
|
|
media: response.data.media
|
|
};
|
|
} catch (error) {
|
|
console.error('❌ 错误:', error.message);
|
|
return { text: '服务暂时不可用,请稍后再试' };
|
|
}
|
|
}
|
|
};
|
|
|
|
(async () => {
|
|
console.log('\n📱 准备登录微信...');
|
|
console.log(' 请扫描屏幕上显示的二维码');
|
|
console.log('');
|
|
|
|
await login();
|
|
console.log('✅ 登录成功!');
|
|
console.log('🚀 启动消息处理...\n');
|
|
|
|
await start(agent);
|
|
})();
|