Enviar mensajes de WhatsApp desde Google Sheets usando PHP

11 de diciembre de 2024

En este tutorial aprenderás a enviar mensajes a números de teléfono almacenados en un archivo CSV de Google Sheets usando PHP y la Wassenger API. Descargaremos el archivo CSV desde Google Sheets, leeremos los números de teléfono y los mensajes, y luego los enviaremos usando la Wassenger API.

Requisitos

  • Conocimientos básicos de PHP
  • PHP instalado en tu computadora
  • Un editor de texto para escribir código (por ejemplo: Visual Studio Code, Atom, Vim)
  • Un token de la API de Wassenger (API token) (puedes obtenerlo registrándote aquí)
  • Extensión pecl_http instalada para networking HTTP

Instalar paquetes requeridos

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

pecl install pecl_http

Preparar el archivo CSV de Google Sheets

Crea un nuevo documento de Google Sheets y complétalo con dos columnas:

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

El documento de Google Sheets debería tener al menos dos columnas y verse así:

El documento equivalente 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! 🤗");

Obtener la URL de descarga de tu documento de Google Sheets

  1. Haz clic en “File” en la esquina superior izquierda.
  2. Ve a “Share” > “Publish to the web”.
  3. En la pestaña “Link”, selecciona “Comma-separated values (.csv)” en el menú desplegable.
  4. Selecciona la hoja (sheet) deseada con los datos relevantes: por defecto la primera.
  5. Haz clic en “Publish” y copia la URL.

Enviar mensajes de texto

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

<?php
require_once 'vendor/autoload.php';
use http\Client;
use http\Client\Request;
use http\Client\Response;
use League\Csv\Reader;
// Replace this with the URL of your published Google Sheets CSV file
$google_sheets_csv_url = 'ENTER_GOOGLE_SHEETS_CSV_URL_HERE';
// Replace this with your Wassenger API token
$token = 'API_KEY_GOES_HERE';
// Optionally specify the target WhatsApp device ID connected to Wassenger
// you want to use for messages delivery(24 characters hexadecimal value)
$device = 'DEVICE_ID';
$client = new Client();
// Read the Google Sheets CSV file and parse it as a CSV
$csv = Reader::createFromString(file_get_contents($google_sheets_csv_url));
$csv->setHeaderOffset(0);
// Iterate through the CSV rows
foreach ($csv->getRecords() as $record) {
  $phone = $record['phone'];
  $message = $record['message'];
  // Prepare the API request
  $request = new Request('POST', 'Wassenger_API_URL');
  $request->setHeaders([
    'Authorization' => 'Bearer ' . $token,
    'Content-Type' => 'application/json',
  ]);
  $request->setBody(
    json_encode([
      'phone' => $phone,
      'body' => $message,
      'device' => $device,
    ])
  );
  // Send the API request and get the response
  $client->enqueue($request)->send();
  $response = $client->getResponse();
  // Check if the message was sent successfully
  if ($response->getResponseCode() == 200) {
    $responseBody = json_decode($response->getBody(), true);
    echo "Message sent to {$phone}.Message ID: {$responseBody['message_id']}\n";
  } else {
    echo "Failed to send message to {$phone}.Error: {$response->getBody()}\n";
  }
}

Prueba y ejecuta código en la nube sin instalar ningún software en tu computadora. Crea una cuenta gratuita en Replit y comienza en minutos

Enviar mensajes con multimedia

En este ejemplo crearemos un programa distinto send_media.php para enviar múltiples mensajes con imágenes a diferentes números cargados desde un documento de Google Sheets.

Para enviar un mensaje con multimedia, la forma más sencilla es proporcionar una URL de descarga del archivo. Si tu archivo no está ya subido en algún lugar, puedes subirlo a Google Drive y hacer que el archivo sea públicamente descargable por la API para enviarlo después.

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 debe devolver el contenido binario del archivo, de lo contrario fallará.

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

<?php
require_once 'vendor/autoload.php';
use http\Client;
use http\Client\Request;
use http\Client\Response;
use League\Csv\Reader;
// Replace this with the URL of your published Google Sheets CSV file
$google_sheets_csv_url = 'ENTER_GOOGLE_SHEETS_CSV_URL_HERE';
// Set the download URL of the file to be sent
$file_url = 'https://picsum.photos/seed/picsum/600/500';
// Replace this with your API token
$token = 'API_KEY_GOES_HERE';
// Optionally specify the target device ID connected to the API
// you want to use for messages delivery(24 characters hexadecimal value)
$device = '$DEVICE_ID';
$base_url = 'https://api.wassenger.com/v1';
$url = $base_url . '/messages';
$files_url = $base_url . '/files';
function upload_file($url, $files_url, $token)
{
  $client = new Client();
  $request = new Request('POST', $files_url);
  $request->setHeaders([
    'Content-Type' => 'application/json',
    'Authorization' => $token,
  ]);
  $request->setBody(json_encode(['url' => $url]));
  $client->enqueue($request)->send();
  $response = $client->getResponse();
  if ($response->getResponseCode() == 200) {
    $responseBody = json_decode($response->getBody(), true);
    return $responseBody['id'];
  } else {
    echo 'Failed to upload file: ' . $response->getBody() . "\n";
    return null;
  }
}
function normalize_phone($phone)
{
  return '+' . preg_replace('/\D/', '', $phone);
}
function send_message($phone, $message, $file, $url, $device, $token)
{
  $client = new Client();
  $request = new Request('POST', $url);
  $request->setHeaders([
    'Content-Type' => 'application/json',
    'Authorization' => $token,
  ]);
  $request->setBody(
    json_encode([
      'phone' => $phone,
      'message' => trim($message),
      'device' => $device,
      'media' => ['file' => $file],
    ])
  );
  $client->enqueue($request)->send();
  $response = $client->getResponse();
  if ($response->getResponseCode() == 200) {
    echo 'Message created: ' . $phone . "\n";
  } else {
    echo "Failed to create message to {$phone}: " . $response->getBody() . "\n";
  }
}
function main(
  $google_sheets_csv_url,
  $file_url,
  $url,
  $files_url,
  $token,
  $device
) {
  // Download Google Sheets CSV file
  $csv_data = file_get_contents($google_sheets_csv_url);
  // Parse the CSV data
  $csv = Reader::createFromString($csv_data);
  $csv->setHeaderOffset(0);
  // Upload file
  $file_id = upload_file($file_url, $files_url, $token);
  if (!$file_id) {
    echo "Failed to upload file: check the error\n";
    return;
  }
  // Process messages
  foreach ($csv->getRecords() as $record) {
    $phone = $record['phone'];
    $message = $record['message'];
    if (!$phone || !$message) {
      continue;
    }
    $number = normalize_phone($phone);
    if ($number && strlen($number) >= 8 && $message) {
      send_message($number, $message, $file_id, $url, $device, $token);
    }
  }
}
main($google_sheets_csv_url, $file_url, $url, $files_url, $token, $device);

Prueba y ejecuta código en la nube sin instalar ningún software en tu computadora. Crea una cuenta gratuita en Replit y comienza en minutos

Reemplazar la URL de Google Sheets para exportar como CSV

En los archivos send_messages.php y send_media.php, asegúrate de haber reemplazado la URL del CSV de Google Sheets y tu token real de la API de Wassenger:

// Replace this with the URL of your published Google Sheets CSV file
$google_sheets_csv_url = 'ENTER_GOOGLE_SHEETS_CSV_URL_HERE';

Consulta las indicaciones arriba para obtener la URL de descarga de Google Sheets para ingresar aquí.

Reemplazar el token de la API

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

# Replace this with your Wassenger API token
$token = 'ENTER API KEY HERE';

Opcionalmente, si tienes múltiples números de WhatsApp conectados en tu cuenta de Wassenger, puedes especificar qué número de WhatsApp deseas usar para la entrega de 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)
$device = 'DEVICE ID GOES HERE';

Ejecutar el programa

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

Ejecutar el programa en la nube

Puedes ejecutar el programa en la nube gratuitamente en Replit.com sin instalar nada en tu computadora.

Simplemente crea un nuevo proyecto y copia & pega el código proporcionado, luego haz clic en “Run” para enviar los mensajes. Es así de sencillo 😀

Ejecutar el programa en tu computadora

Abre un terminal en el directorio de tu proyecto y ejecuta el siguiente comando para ejecutar el script send_messages.php o send_media.php:

php send_messages.php

De manera similar, puedes ejecutar el script send_media.php para enviar mensajes con multimedia:

php send_media.php

Si todo está configurado correctamente, deberías ver salidas indicando que los mensajes han sido creados con éxito:

=> 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 con el tiempo, según el límite de velocidad de entrega por minuto de la suscripción de tu número o la velocidad de entrega manualmente configurada en la configuración de tu número.

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

Preguntas frecuentes

¿Cómo puedo obtener la URL de descarga CSV de Google Sheets para usar con el script PHP?

Los pasos detallados para publicar un documento de Google Sheets como CSV están cubiertos, incluyendo cómo compartir el archivo públicamente.

¿Qué requisitos previos se necesitan para enviar mensajes de WhatsApp desde Google Sheets usando PHP?

Cubre la instalación de PHP, las librerías necesarias como pecl_http, y la obtención del token de la API de Wassenger.

¿Cómo puedo asegurar que los mensajes se entreguen sin activar las políticas anti-spam de WhatsApp?

Se destacan las mejores prácticas para la velocidad de entrega de mensajes y el cumplimiento anti-spam (anti-spam compliance).

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free