Neste tutorial, você aprenderá como enviar mensagens para números de telefone armazenados em um arquivo CSV do Google Sheets usando C# e a Wassenger API. Vamos baixar o arquivo CSV do Google Sheets, ler os números de telefone e enviar mensagens através do seu número do WhatsApp
Como automatizar o WhatsApp com IA
Pré-requisitos
- Conhecimento básico de C# (.NET): Familiaridade com programação em C# e com o uso de APIs HTTP.
- .NET instalado: Certifique-se de que o .NET SDK esteja instalado no seu computador. Você pode baixá-lo no site da Microsoft .NET.
- Pacotes NuGet: Instale as bibliotecas a seguir: - CsvHelper: Para parser de arquivos CSV baixados do Google Sheets. - RestSharp: Para requisições HTTP à Wassenger API.
- Token da API do Wassenger: Você pode obter seu token de API no Wassenger inscrevendo-se, criando um workspace e gerando uma chave de API.
- URL de download do CSV do Google Sheets: Publique seu Google Sheets como um arquivo CSV e copie a URL de download. Isso requer ativar “Publicar na web” no Google Sheets e copiar o link.
Instalar os pacotes necessários
Primeiro, crie um novo diretório para o seu projeto e navegue até ele no terminal. Em seguida, execute os seguintes comandos para instalar as bibliotecas necessárias:
Instalar Pacotes Necessários
- Crie um novo diretório para o seu projeto:
mkdir WhatsAppMessaging cd WhatsAppMessaging
2. Inicialize um novo projeto .NET:
dotnet new console
3. Instale os pacotes NuGet necessários:
- CsvHelper para leitura de arquivos CSV:
dotnet add package CsvHelper
- RestSharp para lidar com requisições HTTP:
dotnet add package RestSharp
Preparar o arquivo CSV do Google Sheets
Crie um novo documento no Google Sheets e preencha-o com duas colunas:
- Primeira coluna: número de telefone no formato E164 com o prefixo do país.
- Segunda coluna: mensagem de texto a ser enviada para o número alvo.
O documento do Google Sheets deve ter pelo menos duas colunas e ficar parecido com:
O documento equivalente exportado como CSV deve se parecer com isto:
(+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! 🤗");
Obter a URL de download do seu documento Google Sheets
- Clique em “Arquivo” no canto superior esquerdo.
- Vá para “Compartilhar” > “Publicar na web”.
- Na aba “Link”, selecione “Valores separados por vírgula (.csv)” no menu dropdown.
- Selecione a página (sheet) desejada com os dados relevantes: por padrão a primeira.
- Clique em “Publicar” e copie a URL.
Enviar mensagens de texto
Crie um novo arquivo chamado sendMessages.cs no diretório do seu projeto e adicione o seguinte código:
using CsvHelper; using RestSharp; using System.Globalization; using System.IO; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks;
public class SendMessages { private static readonly string GoogleSheetsCsvUrl = "ENTER_GOOGLE_SHEETS_CSV_URL_HERE"; // Replace with the Google Sheets CSV URL private static readonly string Token = "API_KEY_GOES_HERE"; // Replace with your Wassenger API Token private static readonly string DeviceId = "DEVICE_ID"; // Replace with your Device ID private static readonly string MessagesUrl = "https://api.wassenger.com/v1/messages";
public static async Task RunAsync()
{
var records = await DownloadAndParseCsvAsync(GoogleSheetsCsvUrl);
if (records == null)
{
Console.WriteLine("Failed to process the CSV file.");
return;
}
foreach (var record in records)
{
string phone = record.Phone;
string message = record.Message;
if (string.IsNullOrWhiteSpace(phone) || string.IsNullOrWhiteSpace(message))
{
continue;
}
string normalizedPhone = NormalizePhone(phone);
if (!string.IsNullOrEmpty(normalizedPhone))
{
await SendMessageAsync(normalizedPhone, message);
}
}
}
private static async Task<IEnumerable<Record>> DownloadAndParseCsvAsync(string url)
{
using var httpClient = new HttpClient();
try
{
string csvContent = await httpClient.GetStringAsync(url);
using var reader = new StringReader(csvContent);
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
return csv.GetRecords<Record>().ToList();
}
catch (Exception ex)
{
Console.WriteLine($"Error downloading or parsing CSV: {ex.Message}");
return null;
}
}
private static async Task SendMessageAsync(string phone, string message)
{
var client = new RestClient(MessagesUrl);
var request = new RestRequest(Method.POST)
.AddHeader("Authorization", $"Bearer {Token}")
.AddHeader("Content-Type", "application/json")
.AddJsonBody(new
{
phone = phone,
body = message,
device = DeviceId
});
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
Console.WriteLine($"Message sent to {phone}");
}
else
{
Console.WriteLine($"Failed to send message to {phone}: {response.Content}");
}
}
private static string NormalizePhone(string phone)
{
return "+" + new string(phone.Where(char.IsDigit).ToArray());
}
public class Record
{
\[JsonPropertyName("phone")\]
public string Phone { get; set; }
\[JsonPropertyName("message")\]
public string Message { get; set; }
}
}
Execute e teste o código na nuvem sem instalar nenhum software no seu computador. Crie uma conta gratuita no Replit e comece em minutos
Enviar mensagens de mídia
Neste exemplo, criaremos um programa diferente sendMedia.cs para enviar várias mensagens de mídia (imagens) para diferentes números de telefone carregados a partir de um documento do Google Sheets.
Para enviar uma mensagem de mídia, a forma mais simples é fornecer uma URL de download do arquivo. Se o seu arquivo ainda não estiver hospedado, você pode enviá-lo para o Google Drive e tornar o arquivo publicamente disponível para que a API possa baixá-lo e enviá-lo depois.
Exemplo de URL de download de um arquivo público no Google Drive:
https://drive.google.com/uc?id=1RG3CAPiwiFlFATUlIIwhk0RrbEU4PgVP&export=download
Importante: a URL de download fornecida deve retornar o conteúdo binário do arquivo, caso contrário irá falhar.*
Crie um novo arquivo chamado sendMedia.cs no diretório do seu projeto e adicione o seguinte código:
using CsvHelper; using RestSharp; using System.Globalization; using System.IO; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks;
public class SendMedia { private static readonly string GoogleSheetsCsvUrl = "ENTER_GOOGLE_SHEETS_CSV_URL_HERE"; // Replace with the Google Sheets CSV URL private static readonly string FileUrl = "https://picsum.photos/seed/picsum/600/500"; // Replace with your media file URL private static readonly string Token = "API_KEY_GOES_HERE"; // Replace with your Wassenger API Token private static readonly string DeviceId = "DEVICE_ID"; // Replace with your Device ID private static readonly string BaseUrl = "https://api.wassenger.com/v1"; private static readonly string MessagesUrl = $"{BaseUrl}/messages"; private static readonly string FilesUrl = $"{BaseUrl}/files";
public static async Task RunAsync()
{
// Download and parse Google Sheets CSV
var records = await DownloadAndParseCsvAsync(GoogleSheetsCsvUrl);
if (records == null)
{
Console.WriteLine("Failed to process the CSV file.");
return;
}
// Upload file to Wassenger
string fileId = await UploadFileAsync(FileUrl);
if (fileId == null)
{
Console.WriteLine("Failed to upload the file.");
return;
}
// Process and send messages
foreach (var record in records)
{
string phone = record.Phone;
string message = record.Message;
if (string.IsNullOrWhiteSpace(phone) || string.IsNullOrWhiteSpace(message))
{
continue;
}
string normalizedPhone = NormalizePhone(phone);
if (!string.IsNullOrEmpty(normalizedPhone) && normalizedPhone.Length >= 8)
{
await SendMessageAsync(normalizedPhone, message, fileId);
}
}
}
private static async Task<IEnumerable<Record>> DownloadAndParseCsvAsync(string url)
{
using var httpClient = new HttpClient();
try
{
string csvContent = await httpClient.GetStringAsync(url);
using var reader = new StringReader(csvContent);
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
return csv.GetRecords<Record>().ToList();
}
catch (Exception ex)
{
Console.WriteLine($"Error downloading or parsing CSV: {ex.Message}");
return null;
}
}
private static async Task<string\> UploadFileAsync(string fileUrl)
{
var client = new RestClient(FilesUrl);
var request = new RestRequest(Method.POST)
.AddHeader("Authorization", $"Bearer {Token}")
.AddHeader("Content-Type", "application/json")
.AddJsonBody(new { url = fileUrl });
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
var responseBody = JsonSerializer.Deserialize<UploadFileResponse>(response.Content);
return responseBody?.Id;
}
else
{
Console.WriteLine($"Failed to upload file: {response.Content}");
return null;
}
}
private static async Task SendMessageAsync(string phone, string message, string fileId)
{
var client = new RestClient(MessagesUrl);
var request = new RestRequest(Method.POST)
.AddHeader("Authorization", $"Bearer {Token}")
.AddHeader("Content-Type", "application/json")
.AddJsonBody(new
{
phone = phone,
message = message.Trim(),
device = DeviceId,
media = new { file = fileId }
});
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
Console.WriteLine($"Message sent to {phone}");
}
else
{
Console.WriteLine($"Failed to send message to {phone}: {response.Content}");
}
}
private static string NormalizePhone(string phone)
{
return "+" + new string(phone.Where(char.IsDigit).ToArray());
}
public class Record
{
\[JsonPropertyName("phone")\]
public string Phone { get; set; }
\[JsonPropertyName("message")\]
public string Message { get; set; }
}
public class UploadFileResponse
{
\[JsonPropertyName("id")\]
public string Id { get; set; }
}
}
Execute e teste o código na nuvem sem instalar nenhum software no seu computador. Crie uma conta gratuita no Replit e comece em minutos
Substitua a URL do Google Sheets para exportar como CSV
Nos arquivos sendMessages.cs e sendMedia.cs, certifique-se de ter substituído a URL do CSV do Google Sheets e o seu token de API do Wassenger real:
// Replace this with the URL of your published Google Sheets CSV file
private static readonly string GoogleSheetsCsvUrl = "ENTER_GOOGLE_SHEETS_CSV_URL_HERE";
Consulte as instruções acima para obter a URL de download do Google Sheets a ser inserida aqui.
Substitua o token da API
No arquivo send_messages.php, certifique-se de ter definido o token da API da sua conta real do Wassenger:
// Replace this with your Wassenger API token
private static readonly string Token = "ENTER API KEY HERE";
Opcionalmente, se você tiver vários números do WhatsApp conectados na sua conta Wassenger, você pode especificar qual número do WhatsApp deseja usar para o envio definindo o ID único do dispositivo Wassenger (valor hexadecimal de 24 caracteres) na linha a seguir:
// Optionally specify the target WhatsApp device ID connected to Wassenger private static readonly string DeviceId = "DEVICE ID GOES HERE";
Executar o programa
Antes de executar o programa, se você planeja enviar centenas de mensagens em sequência, recomendamos definir uma velocidade de entrega de mensagens por minuto mais baixa, não mais do que 2–3 mensagens, para evitar problemas de banimento devido às políticas anti-spam do WhatsApp. Saiba mais sobre melhores práticas e como reduzir riscos aqui.
Execute o programa na nuvem
Você pode executar o programa na nuvem gratuitamente em Replit.com sem instalar qualquer software no seu computador.
Basta criar um novo projeto e copiar & colar o código fornecido, então clicar em “Run” para enviar as mensagens. É simples assim 😀
Execute o programa no seu computador
Abra um terminal no diretório do seu projeto e execute o seguinte comando para executar o script sendMessages.cs ou sendMedia.cs:
dotnet run --project sendMessages.csproj
Da mesma forma, você pode executar o script sendMedia.cs para enviar mensagens de mídia:
dotnet run --project sendMedia.csproj
Se tudo estiver configurado corretamente, você deverá ver uma saída indicando que as mensagens foram criadas com sucesso:
Message sent to +1234567890
Message sent to +1234567890
Message sent to +1234567890
Observe que as mensagens serão adicionadas à fila de entrega do seu número e entregues de forma assíncrona em segundo plano ao longo do tempo, com base no limite de velocidade de entrega de mensagens por minuto da sua assinatura ou na velocidade de entrega configurada manualmente nas configurações do seu número.
As mensagens podem levar vários minutos ou horas, dependendo de quantas você criou, para serem efetivamente entregues aos números-alvo via WhatsApp. Você pode monitorar o progresso da entrega das mensagens no painel web ou automaticamente usando eventos de webhook.
Perguntas Frequentes
Como posso obter a URL de download CSV do Google Sheets para usar com o programa C#.NET?
Os passos detalhados para publicar um documento do Google Sheets como CSV estão cobrados acima, incluindo como compartilhar o arquivo publicamente:
- Abra seu documento do Google Sheets.
- Vá em Arquivo > Compartilhar > Publicar na web.
- Na aba “Link”, selecione Valores separados por vírgula (.csv) como formato.
- Copie o link gerado e cole-o na variável
GoogleSheetsCsvUrlno seu script C#.NET.
Quais pré-requisitos são necessários para enviar mensagens do WhatsApp a partir do Google Sheets usando C#.NET?
Para executar o programa C#.NET, você precisa de:
- .NET SDK instalado: Instale a versão mais recente do .NET SDK no site da Microsoft .NET.
- Pacotes NuGet necessários:
- CsvHelper: Para parse de arquivos CSV.
- RestSharp: Para lidar com requisições HTTP à Wassenger API.
- Token da API do Wassenger: Obtenha seu token de API no painel do Wassenger.
- URL do CSV do Google Sheets: Publique seu Google Sheets como CSV e copie a URL de download.
Execute os seguintes comandos no terminal para instalar as dependências:
dotnet add package CsvHelper
dotnet add package RestSharp
Como posso garantir que as mensagens sejam entregues sem acionar as políticas anti-spam do WhatsApp?
Boas práticas para evitar problemas de spam incluem:
- Controlar a taxa de envio: Limite o envio para 2–3 mensagens por minuto introduzindo um atraso entre as requisições:
await Task.Delay(30000); // Adds a 30-second delay
- Personalizar mensagens: Use variações nas mensagens para evitar detecção como spam.
- Seguir as diretrizes do WhatsApp: Evite enviar mensagens não solicitadas ou conteúdo excessivamente repetido.
- Monitorar respostas da API: Verifique erros ou mensagens de limitação de taxa nas respostas da Wassenger API para ajustar seu programa conforme necessário.
Para orientações mais detalhadas, consulte a documentação da Wassenger sobre melhores práticas e políticas anti-spam.







