UNPKG

@puke3615/node-red-contrib-wechat

Version:

一个支持微信的Node-Red插件

110 lines (93 loc) 3.45 kB
const ScanStatus = [ 'Unknown', 'Cancel', 'Waiting', 'Scanned', 'Confirmed', 'Timeout', ]; function onScan(node, qrcode, status) { const statusValue = ScanStatus[status]; if (['Waiting', 'Timeout'].includes(statusValue)) { node.log(`请扫码登录: ${status}\nhttps://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`); } else { node.log('扫码状态', statusValue); } } module.exports = function (RED) { function invoke(config) { const {WechatyBuilder} = require("wechaty"); RED.nodes.createNode(this, config); const node = this; let wechaty = null; const listeners = []; this.addListener = function (listener) { listeners.push(listener); }; this.sendToRoom = function (roomName, message) { node.log(`sendToRoom, roomName=${roomName}, message=${message}`); wechaty?.Room.find(roomName) .then(room => room.say(message)) .catch(node.error); } this.sendToUser = function (userName, message) { node.log(`sendToUser, userName=${userName}, message=${message}`); wechaty?.Contact.find(userName) .then(async (contact) => await contact.say(message)) .catch(node.error); } function onLogin(node, user) { node.log(`用户 ${user} 已登录`); } function onMessage(node, message) { try { const messageType = message.type(); // MessageType.Text if (messageType !== 7) { // node.log(`跳过消息类型: ${messageType}`) return; } // node.log(`收到消息: ${message}`); const text = message.text(); const talkerPayload = message.talker().payload; const sender = talkerPayload.alias || talkerPayload.name; const roomPayload = message.room()?.payload; const room = roomPayload ? (roomPayload.alias || roomPayload.topic) : ''; const msg = { sender, text, room, payload: message.toString(), }; for (let listener of listeners) { listener(msg); } } catch (e) { node.error('出错了', e); } } async function setup(node) { node.log('启动wechat节点'); wechaty = WechatyBuilder.build({ name: '/data/007c9b34-c4fa-45c5-baa0-fcc6e1e70e30', puppetOptions: { uos: true, }, }); wechaty .on('scan', (qrcode, status) => onScan(node, qrcode, status)) .on('login', user => onLogin(node, user)) .on('message', message => onMessage(node, message)); await wechaty.start(); } // 重启时关闭微信 node.on('close', function (done) { node.log('wechat is closed'); listeners.slice(0, listeners.length); wechaty = null; node.log("wechat logout finished"); done(); }); // 启动微信 setup(this).catch(node.error); } RED.nodes.registerType("wechat", invoke); };