Envoyer des messages WhatsApp à partir de fichiers CSV avec Node Js

4 juillet 2024

Vous voulez rendre la communication de votre entreprise sur WhatsApp plus efficace ? Ce tutoriel vous montre comment envoyer des messages vers des numéros de téléphone stockés dans un fichier CSV en utilisant Node.js, la bibliothèque Axios, et l'API Wassenger. Vous apprendrez à lire les numéros de téléphone et les messages depuis le fichier CSV et à les envoyer automatiquement avec Wassenger.

Cet article vous donne un aperçu rapide des fonctionnalités de l'API Wassenger.

🫣 Vous ne voulez pas programmer ? Pas de problème ! Découvrez notre nouvelle fonctionnalité Campagnes WhatsApp sans code. Importez vos contacts, définissez un message, choisissez une date de livraison et détendez-vous ! 🥳 🥳

Consultez d'autres cas d'utilisation et des exemples de code prêts à l'emploi pour voir comment améliorer votre stratégie de marketing WhatsApp.

Prérequis

🤩 🤖 Wassenger est une plateforme de communication complète et une solution API pour WhatsApp. Découvrez plus de 100 cas d'utilisation API et automatisez tout sur WhatsApp en vous inscrivant pour un essai gratuit et commencez en quelques minutes**!**

Installer les packages requis

Tout d'abord, créez un nouveau répertoire pour votre projet et placez-vous dedans dans votre terminal. Ensuite, exécutez les commandes suivantes pour créer un nouveau fichier package.json et installer les bibliothèques nécessaires :

npm init -y
npm install axios csv-parse

Créer le fichier CSV

Créez un nouveau fichier nommé numbers.csv dans le répertoire de votre projet avec deux colonnes :

  1. Première colonne : numéro de téléphone au format E164 avec l'indicatif du pays.
  2. Deuxième colonne : message texte à envoyer au numéro cible.

Le document tableur doit ressembler à ceci :

Le document tableur équivalent exporté en CSV devrait ressembler à ceci :

(+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! 🤗");

Vous pouvez exporter n'importe quel document Office Excel ou Google Sheets en fichier CSV en suivant ces instructions :

Créer un fichier avec le code

Envoyer des messages texte

Créez un nouveau fichier nommé send_messages.js dans le répertoire de votre projet et ajoutez le code suivant :

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 est une plateforme de communication complète et une solution API pour WhatsApp. Découvrez plus de 100 cas d'utilisation API et automatisez tout sur WhatsApp en vous inscrivant pour un essai gratuit et commencez en quelques minutes**!**

Envoyer des messages multimédias

Dans cet exemple, nous allons créer un programme différent nommé send_media.js pour envoyer plusieurs messages média (images) à différents numéros de téléphone chargés depuis un document Google Sheets.

La façon la plus simple d'envoyer un message média est de fournir une URL de téléchargement du fichier. Si votre fichier n'est pas déjà hébergé quelque part, vous pouvez le télécharger sur Google Drive et le rendre publiquement accessible pour qu'il soit téléchargé par Wassenger et envoyé ensuite.

Exemple d'URL de téléchargement depuis un fichier public dans Google Drive :

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

Important : l'URL de téléchargement fournie doit renvoyer le contenu binaire du fichier, sinon l'opération échouera.

Créez un nouveau fichier nommé send_media.js dans le répertoire de votre projet et ajoutez le code suivant :

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();

Jouez et exécutez du code dans le cloud sans installer de logiciel sur votre ordinateur. Créez un compte gratuit sur Replit et commencez en quelques minutes

Remplacer le token API

Dans le fichier send_messages.js, assurez-vous d'avoir défini le token API de votre compte Wassenger réel :

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

Optionnellement, si vous avez plusieurs numéros WhatsApp connectés à votre compte Wassenger, vous pouvez spécifier quel numéro WhatsApp vous souhaitez utiliser pour la livraison des messages en indiquant l'ID unique du device Wassenger (valeur hexadécimale de 24 caractères) dans la ligne suivante :

// 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 est une plateforme de communication complète et une solution API pour WhatsApp. Découvrez plus de 100 cas d'utilisation API et automatisez tout sur WhatsApp en vous inscrivant pour un essai gratuit et commencez en quelques minutes**!**

Exécuter le programme

️➡️ Exécuter le programme dans le cloud ⬅️

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();

Exécuter le programme sur votre ordinateur

Avant d'exécuter le programme, si vous prévoyez d'envoyer des centaines de messages d'affilée, nous recommandons de définir une vitesse de livraison de messages plus basse, pas plus de 2–3 messages par minute afin d'éviter des problèmes de blocage dus aux politiques anti-spam de WhatsApp. En savoir plus sur les bonnes pratiques et comment réduire les risques ici.

Ouvrez un terminal dans le répertoire de votre projet et exécutez la commande suivante pour lancer le script send_messages.js :

node send_messages.js

De la même manière, vous pouvez exécuter le script send_media.js pour envoyer des messages médias :

node send_media.js

Si tout est correctement configuré, vous devriez voir une sortie indiquant que les messages ont été créés avec succès :

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

Notez que les messages seront ajoutés à la file de livraison de votre numéro et seront délivrés de façon asynchrone en arrière-plan au fil du temps, selon la limite de vitesse de livraison par minute de l'abonnement de votre numéro ou la vitesse de livraison configurée manuellement dans les paramètres de votre numéro.

Les messages peuvent prendre plusieurs minutes ou heures, selon la quantité que vous avez créée, pour être effectivement délivrés aux numéros de téléphone cibles via WhatsApp. Vous pouvez surveiller la progression de la livraison des messages dans le panneau web ou automatiquement en utilisant les événements webhook.

Conclusion

Dans ce tutoriel, vous avez appris comment envoyer des messages vers des numéros de téléphone stockés dans un fichier CSV en utilisant Node.js, la bibliothèque axios et l'API Wassenger.

Vous pouvez mettre à jour le fichier numbers.csv et exécuter le programme à tout moment pour envoyer de nouveaux messages via votre numéro WhatsApp connecté à Wassenger.

Vous pouvez également personnaliser davantage le script pour gérer des colonnes supplémentaires, créer différents types de messages ou l'intégrer à votre logiciel selon vos besoins.

🤩 🤖 Wassenger est une plateforme de communication complète et une solution API pour WhatsApp. Découvrez plus de 100 cas d'utilisation API et automatisez tout sur WhatsApp en vous inscrivant pour un essai gratuit et commencez en quelques minutes**!**

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free