74 lines
2.6 KiB
JavaScript
74 lines
2.6 KiB
JavaScript
|
|
/**
|
|||
|
|
* M-DINGTALK · index-stream.js · v1.0
|
|||
|
|
* 开发者:之之(DEV-004)
|
|||
|
|
* 功能:钉钉 Stream 模式机器人主入口
|
|||
|
|
* 修改日期:2026-03-15
|
|||
|
|
*/
|
|||
|
|
require('dotenv').config();
|
|||
|
|
const { DWClient, TOPIC_ROBOT, EventAck } = require('dingtalk-stream');
|
|||
|
|
|
|||
|
|
const client = new DWClient({
|
|||
|
|
clientId: process.env.DINGTALK_APP_KEY,
|
|||
|
|
clientSecret: process.env.DINGTALK_APP_SECRET,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
client.registerCallbackListener(TOPIC_ROBOT, async (res) => {
|
|||
|
|
console.log("[DEBUG] 收到原始回调:", JSON.stringify(res).substring(0, 100));
|
|||
|
|
try {
|
|||
|
|
const msgData = res.data || res;
|
|||
|
|
const senderNick = msgData.senderNick || msgData.senderId || '未知用户';
|
|||
|
|
const content = msgData.text?.content || msgData.content?.content || '';
|
|||
|
|
const sessionWebhook = msgData.sessionWebhook;
|
|||
|
|
|
|||
|
|
console.log(`[Stream] 收到消息 | 发送者:${senderNick} | 内容:${content.trim()}`);
|
|||
|
|
|
|||
|
|
// 尝试写入 Notion SYSLOG
|
|||
|
|
try {
|
|||
|
|
const { Client } = require('@notionhq/client');
|
|||
|
|
const notion = new Client({ auth: process.env.NOTION_TOKEN });
|
|||
|
|
await notion.pages.create({
|
|||
|
|
parent: { database_id: process.env.NOTION_SYSLOG_DB_ID },
|
|||
|
|
properties: {
|
|||
|
|
'标题': {
|
|||
|
|
title: [{ text: { content: `[钉钉消息] ${senderNick}: ${content.trim().substring(0, 50)}` } }]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
console.log('[Notion] SYSLOG 写入成功');
|
|||
|
|
} catch (notionErr) {
|
|||
|
|
console.error('[Notion] 写入失败: ', notionErr.message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AI 回复
|
|||
|
|
if (process.env.LLM_API_KEY && sessionWebhook) {
|
|||
|
|
const axios = require('axios');
|
|||
|
|
const llmRes = await axios.post(
|
|||
|
|
`${process.env.LLM_BASE_URL || 'https://api.openai.com/v1'}/chat/completions`,
|
|||
|
|
{
|
|||
|
|
model: process.env.LLM_MODEL || 'gpt-4o-mini',
|
|||
|
|
messages: [
|
|||
|
|
{ role: 'system', content: process.env.BOT_SYSTEM_PROMPT || '你是之之秋秋,一个温馨聊天的钉钉机器人。' },
|
|||
|
|
{ role: 'user', content: content.replace(`@${msgData.robotCode || ''}`, '').trim() }
|
|||
|
|
],
|
|||
|
|
max_tokens: 500
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
headers: { 'Authorization': `Bearer ${process.env.LLM_API_KEY}` }
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
const reply = llmRes.data.choices[0].message.content;
|
|||
|
|
await axios.post(sessionWebhook, {
|
|||
|
|
msgtype: 'text',
|
|||
|
|
text: { content: reply }
|
|||
|
|
});
|
|||
|
|
console.log(`[Stream] 回复已发送, 长度: ${reply.length}`);
|
|||
|
|
}
|
|||
|
|
} catch (err) {
|
|||
|
|
console.error('[Stream] 处理出错: ', err.message);
|
|||
|
|
}
|
|||
|
|
return EventAck.SUCCESS;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
client.connect();
|
|||
|
|
console.log('M-DINGTALK Phase 9 - Stream 模式已启动');
|