Я пытаюсь отправить простые данные Google Analytics 4 GA4 из моего приложения C# Windows Visual Studio. Я использую следующий код. Консоль Visual Studio сообщает, что данные отправлены правильно, но моя Google Analytics не отображает данные в реальном времени, а DebugView в Google Analytics не отображает никаких данных.
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
using System.Threading.Tasks;
public MainWindow()
{
// Send analytics data when the application starts
SendAnalyticsDataAsync("mainWindowOpened").ConfigureAwait(false);
}
private async Task SendAnalyticsDataAsync(string eventName)
{
var httpClient = new HttpClient();
var measurementId = "MYMEASUREMENTID"; // Replace with Measurement ID
var jsonPayload = JsonConvert.SerializeObject(new
{
client_id = Guid.NewGuid().ToString(),
events = new List<object>
{
new
{
name = eventName
}
}
});
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
// Log additional information about the request
Console.WriteLine($"Sending analytics data at {DateTime.UtcNow}");
Console.WriteLine($"Event name: {eventName}");
Console.WriteLine($"Payload: {jsonPayload}");
var response = await httpClient.PostAsync($"https://www.google-analytics.com/mp/collect?measurement_id = {measurementId}", content);
// Log the status code regardless of success or failure
Console.WriteLine($"Status code: {response.StatusCode}");
if (response.IsSuccessStatusCode)
{
// Handle success
Console.WriteLine("Analytics data sent successfully.");
}
else
{
// Handle error
// Optionally, log the response body for more details
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Failed to send analytics data. Response body: {responseBody}");
}
}
Я получаю консольный ответ:
Waiting for connection....
Sending analytics data at 4/17/2024 6:29:36 PM
Event name: mainWindowOpened
Payload: {"client_id":"CLEINTIDNUMBERREDACTED","events":[{"name":"mainWindowOpened"}]}
Status code: NoContent
Analytics data sent successfully.
Но нет данных в Google Analytics Real-time или DebugView. Все фильтры в Google Analytics отключены. У меня есть специальное событие под названием mainWindowOpened в Google Analytics, но данных по-прежнему нет. Есть идеи?





Итак, после некоторых экспериментов мне удалось найти этот SDK, который, похоже, отлично работает при отправке событий в Google Analytics 4 GA4. GoogleAnalytics.Ga4.Dotnet.Sdk - однако для работы требуется изрядное количество зависимостей.
Упрощенное решение, требующее только System.Text; Ньютонсофт.Json; и System.Threading.Tasks; у меня это сработало:
private async Task SendAnalyticsDataAsync(string eventName)
{
var httpClient = new HttpClient();
var measurementId = "XXXXXXXXXX"; // Replace with your Measurement ID
var apiSecret = "XXXXXXXXXX"; // Replace with your API Secret
var jsonPayload = JsonConvert.SerializeObject(new
{
client_id = Guid.NewGuid().ToString(), // Unique client ID for each user/session
events = new List<object>
{
new
{
name = eventName // Event name indicating a window open action
}
}
});
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
// Construct the full URL with measurement_id and api_secret as query parameters
var url = $"https://www.google-analytics.com/mp/collect?measurement_id = {measurementId}&api_secret = {apiSecret}";
// Log additional information about the request
Console.WriteLine($"Sending analytics data at {DateTime.UtcNow}");
Console.WriteLine($"Event name: {eventName}");
Console.WriteLine($"Payload: {jsonPayload}");
var response = await httpClient.PostAsync(url, content);
// Log the status code regardless of success or failure
Console.WriteLine($"Status code: {response.StatusCode}");
if (response.IsSuccessStatusCode)
{
// Handle success
Console.WriteLine("Analytics data sent successfully.");
}
else
{
// Handle error
// Optionally, log the response body for more details
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Failed to send analytics data. Response body: {responseBody}");
}
}
А затем отправьте событие с помощью:
await SendAnalyticsDataAsync("EVENT_NAME"); //Event name must not include spaces
После этого я смогу увидеть событие в GA4/Отчеты/Библиотека/События. Также следует просмотреть событие на странице «Обзор в реальном времени» в GA4 в поле «Количество событий по имени события». Однако я не верю, что существует способ запускать пользователей в реальном времени в минуту (похоже, что это работает только с Android, iOS и веб-отслеживанием).
Некоторые дополнительные примечания: на стороне GA4 у меня настроен пар веб-данных (в отличие от опций iOS или Android). В настройках Data Steam я установил секрет API.
Также стоит отметить, что если компьютер, на котором запущено приложение, подключен к VPN, он может выйти из строя, что приведет к сбою исключения. Вот решение, которое включает обработку ошибок, предотвращающую сбой приложения при возникновении проблем с подключением:
private async Task SendAnalyticsDataAsync(string eventName)
{
var httpClient = new HttpClient();
var measurementId = "XXXXXXXXXX"; // Replace with your Measurement ID
var apiSecret = "XXXXXXXXXX"; // Replace with your API Secret
var jsonPayload = JsonConvert.SerializeObject(new
{
client_id = Guid.NewGuid().ToString(), // Unique client ID for each user/session
events = new List<object>
{
new
{
name = eventName // Event name indicating a window open action
}
}
});
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
var url = $"https://www.google-analytics.com/mp/collect?measurement_id = {measurementId}&api_secret = {apiSecret}";
// Attempt to send analytics data with retries
int maxAttempts = 3;
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
try
{
var response = await httpClient.PostAsync(url, content);
Console.WriteLine($"Attempt {attempt + 1}: HTTP Status Code: {response.StatusCode}");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Analytics data sent successfully.");
break;
}
else
{
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Failed to send analytics data. Response body: {responseBody}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Attempt {attempt + 1}: Exception occurred while sending analytics data: {ex.Message}");
if (attempt < maxAttempts - 1)
{
// Wait before retrying
await Task.Delay(1000 * (int)Math.Pow(2, attempt)); // Exponential back-off
}
else
{
Console.WriteLine("Failed to send analytics data after multiple attempts.");
}
}
}
}