@puke3615/node-red-contrib-wechat
Version:
一个支持微信的Node-Red插件
110 lines (93 loc) • 3.45 kB
JavaScript
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);
};