Google Analytics 4 GA4 Отправка аналитики из приложения C# Visual Studio

Я пытаюсь отправить простые данные 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, но данных по-прежнему нет. Есть идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, после некоторых экспериментов мне удалось найти этот 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.");
            }
        }
    }
}

Другие вопросы по теме