smithtek-nodered-sms
Version:
A Node-RED node for sending SMS via ZTE USB modem.
99 lines (82 loc) • 3.52 kB
JavaScript
const fetch = require("node-fetch");
module.exports = function (RED) {
function ZteSmsResetNode(config) {
RED.nodes.createNode(this, config);
let node = this;
node.on("input", async function (msg) {
let modemIp = config.modemIp || "192.168.0.1"; // Default if not set
let password = config.password || "Admin"; // Default if not set
if (!modemIp || !password) {
node.error("Modem IP and password are required.");
return;
}
try {
await loginToModem(password, modemIp);
let deleteCount = await deleteAllSms(modemIp);
msg.payload = `Deleted ${deleteCount} messages.`;
node.send(msg);
} catch (error) {
node.error("Failed to delete SMS: " + error);
}
});
}
async function loginToModem(password, modemIp) {
let encodedPassword = Buffer.from(password).toString("base64");
let loginPayload = `isTest=false&goformId=LOGIN&password=${encodedPassword}`;
let response = await fetch(`http://${modemIp}/goform/goform_set_cmd_process`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Referer": `http://${modemIp}/index.html`
},
body: loginPayload
});
let data = await response.json();
if (data.result !== "0" && data.result !== "3") {
throw new Error("Login failed.");
}
}
async function deleteAllSms(modemIp) {
let listUrl = `http://${modemIp}/goform/goform_get_cmd_process?isTest=false&cmd=sms_data_total&page=0&data_per_page=500&mem_store=1&tags=10&order_by=order+by+id+desc`;
let response = await fetch(listUrl, {
method: "GET",
headers: {
"Referer": `http://${modemIp}/index.html`,
"Accept": "application/json, text/javascript, */*; q=0.01"
}
});
let data = await response.json();
if (!data.messages || data.messages.length === 0) {
return 0; // No messages to delete
}
let deleteCount = 0;
for (let sms of data.messages) {
let deleteUrl = `http://${modemIp}/goform/goform_set_cmd_process`;
let deletePayload = `isTest=false&goformId=DELETE_SMS&msg_id=${sms.id}¬Callback=true`;
await fetch(deleteUrl, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Referer": `http://${modemIp}/index.html`
},
body: deletePayload
});
deleteCount++;
}
return deleteCount; // Return number of deleted messages
}
RED.nodes.registerType("zte-sms-reset", ZteSmsResetNode, {
defaults: {
modemIp: { value: "192.168.0.1", required: true },
password: { value: "Admin", required: true }
},
inputs: 1,
outputs: 1,
icon: "font-awesome/fa-trash",
label: function () {
return "ZTE SMS Reset";
}
});
};