Pular para o conteúdo principal

Como Enviar Notificações pelo WhatsApp com Node.js Como Enviar Notificações pelo WhatsApp com Node.js

Como Enviar Notificações pelo WhatsApp com Node.js

Envie alertas, lembretes e atualizações pelo WhatsApp a partir de qualquer app Node.js. O whatsmeow-node fica conectado em background — basta chamar sendMessage() sempre que precisar notificar alguém.

Pré-requisitos

  • Uma sessão pareada do whatsmeow-node (Como Parear)
  • O número de telefone do destinatário (como JID: 5512345678@s.whatsapp.net)

Passo 1: Configurar uma Conexão Persistente

import { createClient } from "@whatsmeow-node/whatsmeow-node";

const client = createClient({ store: "session.db" });

async function start() {
const { jid } = await client.init();
if (!jid) {
console.error("Not paired! See: How to Pair WhatsApp");
process.exit(1);
}
await client.connect();
await client.sendPresence("available");
console.log("Notification service is ready");
}

start().catch(console.error);

O client fica conectado e pronto para enviar mensagens a qualquer momento.

Passo 2: Enviar uma Notificação

async function notify(phone: string, message: string) {
const jid = `${phone}@s.whatsapp.net`;
await client.sendMessage(jid, { conversation: message });
}

// Example: order update
await notify("5512345678", "Your order #1234 has shipped! Track it at https://example.com/track/1234");

Passo 3: Disparar a partir de um Endpoint HTTP

Encapsule a notificação em uma rota Express para que outros serviços possam acioná-la:

import express from "express";

const app = express();
app.use(express.json());

app.post("/notify", async (req, res) => {
const { phone, message } = req.body;

if (!phone || !message) {
return res.status(400).json({ error: "phone and message are required" });
}

try {
const jid = `${phone}@s.whatsapp.net`;
const resp = await client.sendMessage(jid, { conversation: message });
res.json({ sent: true, id: resp.id });
} catch (err) {
res.status(500).json({ error: "Failed to send" });
}
});

app.listen(3000, () => console.log("Notification API on :3000"));

Agora qualquer serviço pode enviar uma notificação:

curl -X POST http://localhost:3000/notify \
-H "Content-Type: application/json" \
-d '{"phone": "5512345678", "message": "Your appointment is in 1 hour"}'

Passo 4: Enviar para Múltiplos Destinatários

async function broadcast(phones: string[], message: string) {
for (const phone of phones) {
const jid = `${phone}@s.whatsapp.net`;
await client.sendMessage(jid, { conversation: message });

// Wait between sends to avoid rate limiting
await new Promise((r) => setTimeout(r, 2000));
}
}

await broadcast(
["5512345678", "5598765432", "5511223344"],
"Reminder: team meeting at 3 PM today",
);
Rate limiting

O WhatsApp limita a taxa de envio. Espaçe as mensagens de 1 a 3 segundos para envios em massa. Enviar rápido demais pode restringir temporariamente sua conta. Veja Rate Limiting.

Padrões de Notificação

Lembrete de consulta

await notify(phone, `Reminder: your appointment with Dr. Smith is tomorrow at 10:00 AM.

Reply CONFIRM to confirm or CANCEL to cancel.`);

Atualização de pedido

await notify(phone, `Order #${orderId} update: ${status}

${status === "shipped" ? `Track: ${trackingUrl}` : ""}`);

Alerta do sistema

await notify(adminPhone, `⚠ Server alert: CPU usage at ${cpuPercent}% on ${hostname}`);

Notificação para grupo

// Send to a group instead of an individual
const groupJid = "120363XXXXX@g.us";
await client.sendMessage(groupJid, {
conversation: "Deploy complete: v2.1.0 is live",
});

Exemplo Completo

Um serviço de notificações com API HTTP:

import { createClient } from "@whatsmeow-node/whatsmeow-node";
import express from "express";

const client = createClient({ store: "session.db" });
const app = express();
app.use(express.json());

app.post("/notify", async (req, res) => {
const { phone, message } = req.body;
if (!phone || !message) {
return res.status(400).json({ error: "phone and message are required" });
}

try {
const jid = `${phone}@s.whatsapp.net`;
const resp = await client.sendMessage(jid, { conversation: message });
res.json({ sent: true, id: resp.id });
} catch (err) {
console.error("Send failed:", err);
res.status(500).json({ error: "Failed to send" });
}
});

app.post("/broadcast", async (req, res) => {
const { phones, message } = req.body;
if (!phones?.length || !message) {
return res.status(400).json({ error: "phones[] and message are required" });
}

// Send in background
(async () => {
for (const phone of phones) {
try {
const jid = `${phone}@s.whatsapp.net`;
await client.sendMessage(jid, { conversation: message });
} catch (err) {
console.error(`Failed to send to ${phone}:`, err);
}
await new Promise((r) => setTimeout(r, 2000));
}
console.log(`Broadcast complete: ${phones.length} recipients`);
})();

res.json({ queued: true, count: phones.length });
});

async function main() {
const { jid } = await client.init();
if (!jid) {
console.error("Not paired!");
process.exit(1);
}
await client.connect();
await client.sendPresence("available");

app.listen(3000, () => console.log("Notification API on :3000"));

process.on("SIGINT", async () => {
await client.sendPresence("unavailable");
await client.disconnect();
client.close();
process.exit(0);
});
}

main().catch(console.error);

Erros Comuns

Não faça spam

Enviar mensagens em massa não solicitadas viola os Termos de Serviço do WhatsApp e pode resultar no banimento da sua conta. Envie notificações apenas para usuários que optaram por recebê-las.

Rate limiting

Espaçe os envios com delay de 1 a 3 segundos. Veja Rate Limiting para detalhes.

Mantenha a conexão ativa

O client precisa estar conectado para enviar mensagens. Se o processo encerrar, será necessário reconectar. Em produção, use um gerenciador de processos como PM2 ou rode como serviço systemd.