Enviar mensajes de WhatsApp desde archivos CSV usando Node Js

4 de julio de 2024

¿Quieres que la comunicación de tu negocio en WhatsApp sea más efectiva? Este tutorial te mostrará cómo enviar mensajes a números de teléfono almacenados en un archivo CSV usando Node.js, la librería Axios y la Wassenger API. Aprenderás a leer números de teléfono y mensajes del archivo CSV y enviarlos automáticamente con Wassenger.

Este artículo te ofrece una vista rápida de las funciones de la Wassenger API.

🫣 ¿No quieres usar programación? ¡No hay problema! Explora nuestra nueva función de Campañas de WhatsApp sin código. ¡Importa tus contactos, define un mensaje, establece una fecha de envío y relájate! 🥳 🥳

Consulta más casos de uso y ejemplos de código listos para usar para ver cómo puedes mejorar tu estrategia de marketing en WhatsApp.

Requisitos previos

🤩 🤖 Wassenger es una plataforma de comunicación y solución API completa para WhatsApp. Explora más de 100 casos de uso de la API y automatiza cualquier cosa en WhatsApp registrándote para una prueba gratuita y comienza en minutos**!**

Instalar los paquetes requeridos

Primero, crea un nuevo directorio para tu proyecto y navega a él en tu terminal. Luego, ejecuta los siguientes comandos para crear un nuevo archivo package.json e instalar las librerías necesarias:

npm init -y
npm install axios csv-parse

Crear el archivo CSV

Crea un nuevo archivo llamado numbers.csv en el directorio de tu proyecto con dos columnas:

  1. Primera columna: número de teléfono en formato E164 con el prefijo del país.
  2. Segunda columna: mensaje de texto a enviar al número de teléfono objetivo.

El documento de la hoja de cálculo debería verse así:

El documento equivalente de la hoja de cálculo exportado como CSV debería verse así:

(+1234567890,
  '👋 Welcome to {{your-business-name}}! Thanks for signing up.We are just a message away!' +
    1234567890,
  "💐 Your order has been shipped.Tracking number is {{tracking-number}}.Don't hesitate to reach out to if you need help! 🤗");

Puedes exportar cualquier documento de Office Excel o Google Sheets como archivo CSV siguiendo estas instrucciones:

Crear un archivo con el código

Enviar mensajes de texto

Crea un nuevo archivo llamado send_messages.js en el directorio de tu proyecto y añade el siguiente código:

const axios = require('axios');
const fs = require('fs/promises');
const { parse } = require('csv-parse/sync');
// Set local path of the CSV file
// You can export any Excel/Google Sheets document as CSV
const csvFile = 'file.csv';
// Replace this with your Wassenger API token
// Get your API token here: https://app.wassenger.com/apikeys
const token = 'ENTER API KEY HERE';
// Optionally specify the target WhatsApp device ID connected to Wassenger
// you want to use for messages delivery(24 characters hexadecimal value)
const device = 'DEVICE ID GOES HERE';
// Set the download URL of the file to be sent.
// The file must be publicly accessible from the Internet and return the file binary content
// You can also upload a local file in Google Drive and make the file publicly available for download
// Accepted file formats are: images(JPEG, WEBP, PNG), video(MP4), audio(MP3, OGG) and documents(PDF, XLSX, DOCX, ZIP...)
const fileUrl = 'https://picsum.photos/seed/picsum/600/500';
// Define the headers for the API request
const headers = {
  'Content-Type': 'application/json',
  Authorization: `${token}`
};
// Define the URL for the Wassenger API
const url = 'https://api.wassenger.com/v1/messages';
const normalizePhone = phone => {
  return `+${phone.replace(/\D/g, '')}`;
};
const sendMessage = async (phone, message) => {
  const body = { device, phone, message: message.trim() };
  try {
    const response = await axios.post(url, body, { headers });
    console.log(`=> Message created: ${phone}`);
  } catch (error) {
    console.error(
      'Failed to create message to ${phone}:',
      error.response ? error.response.data : error
    );
  }
};
const main = async () => {
  try {
    console.log('=> Reading CSV file...');
    const data = await fs.readFile(csvFile, 'utf-8');
    const records = parse(data, { columns: false, skip_empty_lines: true });
    console.log('=> Processing messages...');
    for (const [phone, message] of records) {
      if (!phone || !message) {
        continue;
      }
      const number = normalizePhone(phone);
      if (number && number.length >= 8 && message) {
        await sendMessage(number, message);
      }
    }
  } catch (err) {
    console.error('Error:', err);
  }
};
main();

🤩 🤖 Wassenger es una plataforma de comunicación y solución API completa para WhatsApp. Explora más de 100 casos de uso de la API y automatiza cualquier cosa en WhatsApp registrándote para una prueba gratuita y comienza en minutos**!**

Enviar mensajes multimedia

En este ejemplo, crearemos un programa diferente llamado send_media.js para enviar varios mensajes multimedia (imágenes) a diferentes números de teléfono cargados desde un documento de Google Sheets.

La forma más sencilla de enviar un mensaje multimedia es proporcionar una URL de descarga del archivo. Si tu archivo no está subido en algún lugar, puedes subirlo a Google Drive y hacerlo públicamente accesible para que Wassenger lo descargue y lo envíe.

Ejemplo de URL de descarga desde un archivo público en Google Drive:

https://drive.google.com/uc?id=1RG3CAPiwiFlFATUlIIwhk0RrbEU4PgVP&export=download

Importante: la URL de descarga proporcionada debe devolver el contenido binario del archivo, de lo contrario fallará.

Crea un nuevo archivo llamado send_media.js en el directorio de tu proyecto y añade el siguiente código:

const axios = require('axios');
const { parse } = require('csv-parse/sync');
// Set local path of the CSV file
// You can export any Excel/Google Sheets document as CSV
const csvFile = 'file.csv';
// Set the download URL of the file to be sent.
// The file must be publicly accessible from the Internet and return the file binary content
// You can also upload a local file in Google Drive and make the file publicly available for download
// Accepted file formats are: images(JPEG, WEBP, PNG), video(MP4), audio(MP3, OGG) and documents(PDF, XLSX, DOCX, ZIP...)
const fileUrl = 'https://picsum.photos/seed/picsum/600/500';
// Replace this with your Wassenger API token
// Get your API token here: https://app.wassenger.com/apikeys
const token = 'ENTER API KEY HERE';
// Optionally specify the target WhatsApp device ID connected to Wassenger
// you want to use for messages delivery(24 characters hexadecimal value)
const device = 'DEVICE ID GOES HERE';
// Define the headers for the API request
const headers = {
  'Content-Type': 'application/json',
  Authorization: `${token}`
};
// Define URLs for the Wassenger API
const baseUrl = 'https://api.wassenger.com/v1';
const url = `${baseUrl}/messages`;
const filesUrl = `${baseUrl}/files`;
const uploadFile = async url => {
  const body = { url };
  try {
    const response = await axios.post(filesUrl, body, { headers });
    return response.data.id;
  } catch (error) {
    // If the file already exists, obtain the file ID from the response
    if (
      error.response &&
      error.response.status === 409 &&
      error.response.data
    ) {
      return error.response.data.meta.file;
    }
    console.error(
      'Failed to upload file:',
      error.response ? error.response.data : error
    );
  }
};
const normalizePhone = phone => {
  return `+${phone.replace(/\D/g, '')}`;
};
const sendMessage = async (phone, message, file) => {
  const body = {
    phone,
    message: message.trim(),
    device,
    media: { file }
  };
  try {
    await axios.post(url, body, { headers });
    console.log(` == > Message created: ${phone}`);
  } catch (error) {
    console.error(
      'Failed to create message to ${phone}:',
      error.response ? error.response.data : error
    );
  }
};
const main = async () => {
  try {
    if (!fileUrl) {
      throw new Error('Missing required fileUrl');
    }
    console.log('=> Reading CSV file...');
    const data = await fs.readFile(csvFile, 'utf-8');
    const records = parse(data, { columns: false, skip_empty_lines: true });
    console.log('=> Uploading file...');
    const file = await uploadFile(fileUrl);
    if (!file) {
      throw new Error('Failed to upload file: check the error');
    }
    console.log('=> Processing messages...');
    for (const [phone, message] of records) {
      if (!phone || !message) {
        continue;
      }
      const number = normalizePhone(phone);
      if (number && number.length >= 8 && message) {
        await sendMessage(number, message, file);
      }
    }
  } catch (err) {
    console.error('Error:', err);
  }
};
main();

Ejecuta y prueba el código en la nube sin instalar ningún software en tu equipo. Crea una cuenta gratuita en Replit y comienza en minutos

Reemplazar el token de la API

En el archivo send_messages.js, asegúrate de haber definido el token de API de tu cuenta real de Wassenger:

// Replace this with your Wassenger API token
const token = 'ENTER API KEY HERE';

Opcionalmente, si tienes varios números de WhatsApp conectados en tu cuenta de Wassenger, puedes especificar qué número de WhatsApp quieres usar para la entrega de los mensajes indicando el ID único del dispositivo de Wassenger (valor hexadecimal de 24 caracteres) en la siguiente línea:

// Optionally specify the target WhatsApp device ID connected to Wassenger
// you want to use for messages delivery(24 characters hexadecimal value)
const device = 'DEVICE ID GOES HERE';

🤩 🤖 Wassenger es una plataforma de comunicación y solución API completa para WhatsApp. Explora más de 100 casos de uso de la API y automatiza cualquier cosa en WhatsApp registrándote para una prueba gratuita y comienza en minutos**!**

Ejecutar el programa

️➡️ Ejecuta el programa en la nube ⬅️

const axios = require('axios');
const { parse } = require('csv-parse/sync');
// Set local path of the CSV file
// You can export any Excel/Google Sheets document as CSV
const csvFile = 'file.csv';
// Set the download URL of the file to be sent.
// The file must be publicly accessible from the Internet and return the file binary content
// You can also upload a local file in Google Drive and make the file publicly available for download
// Accepted file formats are: images(JPEG, WEBP, PNG), video(MP4), audio(MP3, OGG) and documents(PDF, XLSX, DOCX, ZIP...)
const fileUrl = 'https://picsum.photos/seed/picsum/600/500';
// Replace this with your Wassenger API token
// Get your API token here: https://app.wassenger.com/apikeys
const token = 'ENTER API KEY HERE';
// Optionally specify the target WhatsApp device ID connected to Wassenger
// you want to use for messages delivery(24 characters hexadecimal value)
const device = 'DEVICE ID GOES HERE';
// Define the headers for the API request
const headers = {
  'Content-Type': 'application/json',
  Authorization: `${token}`
};
// Define URLs for the Wassenger API
const baseUrl = 'https://api.wassenger.com/v1';
const url = `${baseUrl}/messages`;
const filesUrl = `${baseUrl}/files`;
const uploadFile = async url => {
  const body = { url };
  try {
    const response = await axios.post(filesUrl, body, { headers });
    return response.data.id;
  } catch (error) {
    // If the file already exists, obtain the file ID from the response
    if (
      error.response &&
      error.response.status === 409 &&
      error.response.data
    ) {
      return error.response.data.meta.file;
    }
    console.error(
      'Failed to upload file:',
      error.response ? error.response.data : error
    );
  }
};
const normalizePhone = phone => {
  return `+${phone.replace(/\D/g, '')}`;
};
const sendMessage = async (phone, message, file) => {
  const body = {
    phone,
    message: message.trim(),
    device,
    media: { file }
  };
  try {
    await axios.post(url, body, { headers });
    console.log(` == > Message created: ${phone}`);
  } catch (error) {
    console.error(
      'Failed to create message to ${phone}:',
      error.response ? error.response.data : error
    );
  }
};
const main = async () => {
  try {
    if (!fileUrl) {
      throw new Error('Missing required fileUrl');
    }
    console.log('=> Reading CSV file...');
    const data = await fs.readFile(csvFile, 'utf-8');
    const records = parse(data, { columns: false, skip_empty_lines: true });
    console.log('=> Uploading file...');
    const file = await uploadFile(fileUrl);
    if (!file) {
      throw new Error('Failed to upload file: check the error');
    }
    console.log('=> Processing messages...');
    for (const [phone, message] of records) {
      if (!phone || !message) {
        continue;
      }
      const number = normalizePhone(phone);
      if (number && number.length >= 8 && message) {
        await sendMessage(number, message, file);
      }
    }
  } catch (err) {
    console.error('Error:', err);
  }
};
main();

Ejecutar el programa en tu ordenador

Antes de ejecutar el programa, si planeas enviar cientos de mensajes seguidos, recomendamos definir una velocidad de entrega de mensajes más baja por minuto (no más de 2–3 mensajes) para prevenir problemas de bloqueo debido a políticas anti-spam de WhatsApp. Aprende más sobre las mejores prácticas y cómo reducir el riesgo aquí.

Abre una terminal en el directorio de tu proyecto y ejecuta el siguiente comando para ejecutar el script send_messages.js:

node send_messages.js

De forma similar, puedes ejecutar el script send_media.js para enviar mensajes multimedia:

node send_media.js

Si todo está configurado correctamente, deberías ver una salida que indica que los mensajes se han creado correctamente:

=> Message created: +1234567890
=> Message created: +1234567890
=> Message created: +1234567890

Ten en cuenta que los mensajes se añadirán a la cola de entrega de mensajes de tu número y se entregarán de forma asíncrona en segundo plano a lo largo del tiempo, según el límite de velocidad de entrega de mensajes por minuto de la suscripción de tu número o la velocidad de entrega configurada manualmente en la configuración de tu número.

Los mensajes pueden tardar varios minutos u horas, dependiendo de la cantidad creada, en entregarse efectivamente a los números de teléfono objetivo vía WhatsApp. Puedes monitorizar el progreso de la entrega de los mensajes en el panel web o automáticamente usando eventos webhook.

Conclusión

En este tutorial aprendiste cómo enviar mensajes a números de teléfono almacenados en un archivo CSV usando Node.js, la librería axios y la Wassenger API.

Puedes actualizar el archivo numbers.csv y ejecutar el programa siempre que quieras enviar nuevos mensajes a través de tu número de WhatsApp conectado con Wassenger.

Puedes personalizar aún más el script para manejar columnas adicionales, crear diferentes tipos de mensajes o integrarlo con tu software según necesites.

🤩 🤖 Wassenger es una plataforma de comunicación y solución API completa para WhatsApp. Explora más de 100 casos de uso de la API y automatiza cualquier cosa en WhatsApp registrándote para una prueba gratuita y comienza en minutos**!**

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free