In diesem Tutorial erfahren Sie, wie Sie Nachrichten an in einer Google Sheets CSV-Datei gespeicherte Telefonnummern mit C# und der Wassenger API senden. Wir laden die CSV-Datei von Google Sheets herunter, lesen die Telefonnummern aus und senden Nachrichten über Ihre WhatsApp‑Nummer
Wie man WhatsApp mit KI automatisiert
Voraussetzungen
- Grundkenntnisse in C# (.NET): Vertrautheit mit Programmierung in C# und dem Umgang mit HTTP‑APIs.
- .NET installiert: Stellen Sie sicher, dass das .NET SDK auf Ihrem Computer installiert ist. Sie können es von Microsofts .NET‑Website herunterladen.
- NuGet‑Pakete: Installieren Sie die folgenden Bibliotheken: - CsvHelper: Zum Parsen von CSV‑Dateien, die aus Google Sheets heruntergeladen wurden. - RestSharp: Für HTTP‑Anfragen an die Wassenger API.
- Wassenger API‑Token: Sie können Ihren API‑Token von Wassenger erhalten, indem Sie sich anmelden, einen Workspace erstellen und einen API‑Schlüssel generieren.
- Google Sheets CSV‑Download‑URL: Veröffentlichen Sie Ihr Google Sheets als CSV‑Datei und kopieren Sie die Download‑URL. Dazu muss in Google Sheets „Im Web veröffentlichen“ aktiviert werden und der Link kopiert werden.
Erforderliche Pakete installieren
Erstellen Sie zuerst ein neues Verzeichnis für Ihr Projekt und wechseln Sie in Ihrem Terminal dorthin. Führen Sie dann die folgenden Befehle aus, um die benötigten Bibliotheken zu installieren:
Erforderliche Pakete installieren
- Erstellen Sie ein neues Verzeichnis für Ihr Projekt:
mkdir WhatsAppMessaging cd WhatsAppMessaging
2. Initialisieren Sie ein neues .NET‑Projekt:
dotnet new console
3. Installieren Sie die notwendigen NuGet‑Pakete:
- CsvHelper zum Lesen von CSV‑Dateien:
dotnet add package CsvHelper
- RestSharp zum Verarbeiten von HTTP‑Anfragen:
dotnet add package RestSharp
Google Sheets CSV‑Datei vorbereiten
Erstellen Sie ein neues Google Sheets‑Dokument und füllen Sie es mit zwei Spalten:
- Erste Spalte: Telefonnummer im E.164‑Format mit Ländervorwahl.
- Zweite Spalte: Textnachricht, die an die Zieltelefonnummer gesendet werden soll.
Das Google Sheets‑Dokument sollte mindestens zwei Spalten haben und folgendermaßen aussehen:
Das entsprechend exportierte Sheets‑Dokument als CSV sollte so aussehen:
(+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! 🤗");
So erhalten Sie die Download‑URL Ihres Google Sheets‑Dokuments
- Klicken Sie oben links auf „Datei“.
- Gehen Sie zu „Freigeben“ > „Im Web veröffentlichen“.
- Wählen Sie im Tab „Link“ aus dem Dropdown‑Menü „Kommagetrennte Werte (.csv)“.
- Wählen Sie die gewünschte Tabellenseite mit den relevanten Daten aus (standardmäßig die erste).
- Klicken Sie auf „Veröffentlichen“ und kopieren Sie die URL.
Textnachrichten senden
Erstellen Sie eine neue Datei mit dem Namen sendMessages.cs in Ihrem Projektverzeichnis und fügen Sie den folgenden Code hinzu:
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; }
}
}
Spielen Sie mit dem Code und führen Sie ihn in der Cloud aus, ohne Software auf Ihrem Computer installieren zu müssen. Erstellen Sie ein kostenloses Konto bei Replit und legen Sie in wenigen Minuten los
Mediennachrichten senden
In diesem Beispiel erstellen wir ein separates Programm sendMedia.cs, um mehrere Bild‑Mediennachrichten an verschiedene Telefonnummern zu senden, die aus einem Google Sheets‑Dokument geladen werden.
Um eine Mediennachricht zu senden, ist der einfachste Weg, eine Datei‑Download‑URL bereitzustellen. Wenn Ihre Datei nicht bereits irgendwo hochgeladen ist, können Sie die Datei in Google Drive hochladen und so freigeben, dass sie vom API heruntergeladen werden kann, um sie später zu senden.
Beispiel‑Download‑URL von einer öffentlichen Datei in Google Drive:
https://drive.google.com/uc?id=1RG3CAPiwiFlFATUlIIwhk0RrbEU4PgVP&export=download
Wichtig: Die angegebene Download‑URL muss den binären Dateiinhalt zurückgeben, sonst schlägt der Vorgang fehl.
Erstellen Sie eine neue Datei mit dem Namen sendMedia.cs in Ihrem Projektverzeichnis und fügen Sie den folgenden Code hinzu:
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; }
}
}
Spielen Sie mit dem Code und führen Sie ihn in der Cloud aus, ohne Software auf Ihrem Computer installieren zu müssen. Erstellen Sie ein kostenloses Konto bei Replit und legen Sie in wenigen Minuten los
Google Sheets‑URL für den CSV‑Export ersetzen
Stellen Sie in den Dateien sendMessages.cs und sendMedia.cs sicher, dass Sie die Google Sheets CSV‑URL und Ihren tatsächlichen Wassenger API‑Token ersetzt haben:
// Replace this with the URL of your published Google Sheets CSV file
private static readonly string GoogleSheetsCsvUrl = "ENTER_GOOGLE_SHEETS_CSV_URL_HERE";
Siehe die obenstehenden Hinweise, um die Google Sheets‑Download‑URL zu erhalten und hier einzufügen.
API‑Token ersetzen
Stellen Sie in der Datei send_messages.php sicher, dass Sie den API‑Token Ihres tatsächlichen Wassenger‑Kontos definiert haben:
// Replace this with your Wassenger API token
private static readonly string Token = "ENTER API KEY HERE";
Optional können Sie, falls Sie mehrere WhatsApp‑Nummern in Ihrem Wassenger‑Konto verbunden haben, angeben, welche WhatsApp‑Nummer Sie für die Nachrichtenübermittlung verwenden möchten, indem Sie die Wassenger‑einzigartige Device‑ID (24‑stelliger hexadezimaler Wert) in der folgenden Zeile angeben:
// Optionally specify the target WhatsApp device ID connected to Wassenger private static readonly string DeviceId = "DEVICE ID GOES HERE";
Programm ausführen
Bevor Sie das Programm ausführen: Wenn Sie planen, Hunderte von Nachrichten hintereinander zu senden, empfehlen wir, die Zustellgeschwindigkeit pro Minute auf höchstens 2–3 Nachrichten zu begrenzen, um Sperrprobleme aufgrund von Anti‑Spam‑Richtlinien von WhatsApp zu vermeiden. Erfahren Sie hier mehr über Best Practices und wie Sie das Risiko reduzieren können.
Das Programm in der Cloud ausführen
Sie können das Programm kostenlos in der Cloud auf Replit.com ausführen, ohne Software auf Ihrem Computer zu installieren.
Erstellen Sie einfach ein neues Projekt, kopieren Sie den bereitgestellten Code hinein und klicken Sie auf „Run“, um die Nachrichten zu senden. So einfach ist das 😀
Das Programm auf Ihrem Computer ausführen
Öffnen Sie ein Terminal in Ihrem Projektverzeichnis und führen Sie den folgenden Befehl aus, um das sendMessages.cs‑ oder sendMedia.cs‑Skript auszuführen:
dotnet run --project sendMessages.csproj
Ebenso können Sie das sendMedia.cs‑Skript ausführen, um Mediennachrichten zu senden:
dotnet run --project sendMedia.csproj
Wenn alles korrekt eingerichtet ist, sollten Sie Ausgaben sehen, die anzeigen, dass die Nachrichten erfolgreich erstellt wurden:
Message sent to +1234567890
Message sent to +1234567890
Message sent to +1234567890
Hinweis: Nachrichten werden in die Versandwarteschlange Ihrer Nummer eingereiht und asynchron im Hintergrund zugestellt, je nach Zustellgeschwindigkeit pro Minute, die in Ihrem Abonnement für die Nummer festgelegt ist, oder nach der manuell konfigurierten Zustellgeschwindigkeit in den Einstellungen Ihrer Nummer.
Die Zustellung der Nachrichten an die Zieltelefonnummern via WhatsApp kann je nach Anzahl einige Minuten oder Stunden dauern. Sie können den Fortschritt der Nachrichten‑Zustellung im Webpanel überwachen oder automatisch mithilfe von Webhook‑Ereignissen.
FAQ
Wie erhalte ich die Google Sheets CSV‑Download‑URL für die Verwendung mit dem C#.NET‑Programm?
Detaillierte Schritte zum Veröffentlichen eines Google Sheets‑Dokuments als CSV werden erläutert, einschließlich wie Sie die Datei öffentlich freigeben:
- Öffnen Sie Ihr Google Sheets‑Dokument.
- Gehen Sie zu Datei > Freigeben > Im Web veröffentlichen.
- Wählen Sie unter dem Tab „Link“ Kommagetrennte Werte (.csv) als Format.
- Kopieren Sie den generierten Link und fügen Sie ihn in die Variable
GoogleSheetsCsvUrlin Ihrem C#.NET‑Skript ein.
Welche Voraussetzungen sind nötig, um WhatsApp‑Nachrichten aus Google Sheets mit C#.NET zu senden?
Um das C#.NET‑Programm auszuführen, benötigen Sie:
- .NET SDK installiert: Installieren Sie das neueste .NET SDK von Microsofts .NET‑Website.
- Erforderliche NuGet‑Pakete:
- CsvHelper: Zum Parsen von CSV‑Dateien.
- RestSharp: Zum Verarbeiten von HTTP‑Anfragen an die Wassenger API.
- Wassenger API‑Token: Holen Sie sich Ihren API‑Token im Wassenger‑Dashboard.
- Google Sheets CSV‑URL: Veröffentlichen Sie Ihr Google Sheets als CSV‑Datei und kopieren Sie die Download‑URL.
Führen Sie die folgenden Befehle im Terminal aus, um die Abhängigkeiten zu installieren:
dotnet add package CsvHelper
dotnet add package RestSharp
Wie stelle ich sicher, dass die Nachrichten zugestellt werden, ohne Anti‑Spam‑Richtlinien von WhatsApp auszulösen?
Best Practices zur Vermeidung von Anti‑Spam‑Problemen umfassen:
- Nachrichtenrate drosseln: Begrenzen Sie das Senden auf 2–3 Nachrichten pro Minute, indem Sie Verzögerungen zwischen den Anfragen einbauen:
await Task.Delay(30000); // Adds a 30-second delay
- Nachrichten personalisieren: Verwenden Sie leichte Variationen in den Nachrichten, um Spam‑Erkennung zu vermeiden.
- WhatsApps Richtlinien beachten: Versenden Sie keine unerwünschten Nachrichten oder übermäßig wiederholte Inhalte.
- API‑Antworten überwachen: Achten Sie auf Fehler oder Rate‑Limit‑Hinweise in den Wassenger API‑Antworten, um Ihr Programm entsprechend anzupassen.
Für ausführlichere Anleitung lesen Sie die Wassenger Dokumentation zu Best Practices und Anti‑Spam‑Richtlinien.







