UNPKG

node-red-contrib-feishu

Version:

Node-RED节点用于发送飞书消息

117 lines (106 loc) 4.31 kB
/** * 企业微信应用消息节点模块 * 该模块实现了Node-RED节点,用于发送企业微信应用消息 */ module.exports = function(RED) { /** * 企业微信应用消息节点构造函数 * @param {Object} config - 节点配置对象 */ function WecomAppNode(config) { RED.nodes.createNode(this, config); const node = this; const axios = require('axios'); // 缓存访问令牌 let accessToken = null; let tokenExpireTime = 0; /** * 获取访问令牌 * @returns {Promise<string>} 访问令牌 */ async function getAccessToken() { const now = Date.now(); if (accessToken && now < tokenExpireTime) { return accessToken; } try { const response = await axios.get( `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${config.corpId}&corpsecret=${config.agentSecret}` ); if (response.data.errcode === 0) { accessToken = response.data.access_token; tokenExpireTime = now + (response.data.expires_in * 1000) - 200000; // 提前200秒过期 return accessToken; } else { throw new Error(response.data.errmsg || '获取访问令牌失败'); } } catch (error) { throw new Error(`获取访问令牌失败: ${error.message}`); } } /** * 处理输入消息事件 */ node.on('input', async function(msg) { try { const token = await getAccessToken(); const messageType = msg.messageType || config.messageType || 'text'; let messageContent; // 构建消息内容 if (messageType === 'text') { messageContent = { msgtype: 'text', text: { content: typeof msg.payload === 'string' ? msg.payload : JSON.stringify(msg.payload) } }; } else if (messageType === 'markdown') { messageContent = { msgtype: 'markdown', markdown: { content: typeof msg.payload === 'string' ? msg.payload : JSON.stringify(msg.payload) } }; } else if (messageType === 'textcard') { messageContent = { msgtype: 'textcard', textcard: { title: msg.title || '', description: msg.description || msg.payload, url: msg.url || '' } }; } // 添加接收者信息 const sendData = { ...messageContent, touser: msg.toUser || config.toUser || '@all', toparty: msg.toParty || config.toParty || '', totag: msg.toTag || config.toTag || '', agentid: parseInt(config.agentId) }; // 发送消息 const response = await axios.post( `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`, sendData ); if (response.data.errcode === 0) { node.status({fill: 'green', shape: 'dot', text: '发送成功'}); msg.payload = response.data; node.send(msg); } else { throw new Error(response.data.errmsg || '发送失败'); } } catch (error) { node.status({fill: 'red', shape: 'ring', text: '发送失败'}); node.error(error.message, msg); } }); // 节点关闭时清除状态 node.on('close', function() { node.status({}); }); } // 注册节点类型 RED.nodes.registerType('wecom-app', WecomAppNode); };