node-red-contrib-feishu
Version:
Node-RED节点用于发送飞书消息
117 lines (106 loc) • 4.31 kB
JavaScript
/**
* 企业微信应用消息节点模块
* 该模块实现了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);
};