Авторизация Google Analytics в Java - PullRequest
8 голосов
/ 31 января 2012

Я ищу самый простой способ программного входа в Google Analytics и получения данных.В документации Google пишутся и приводятся примеры для Oauth 2.0, в котором пользователь вручную входит в свою учетную запись Google, а затем перенаправляется на мой сайт с авторизацией.Но это не то, чего я хочу достичь - я создаю автоматический инструмент, который должен иметь пользователя / пароль или любой другой ключ авторизации, чтобы быть жестко запрограммированным, а затем войти в систему без какого-либо участия пользователя (это инструмент периодической отчетности),

Я уже нашел кое-что об API KEY, но не могу найти ни одного примера, как это сделать или как сделать это с помощью библиотек Google Java.

Я был бы очень благодарен за указаниеменя в правильном направлении.Также это может быть ценным ключом для других, как сделать это самым простым способом - и я думаю, что регистрация должна быть простой.

Ответы [ 4 ]

13 голосов
/ 15 октября 2012

У меня возникла та же проблема, и я потратил около 1 часа, чтобы найти ее в документации v3:

Сервисные учетные записи

Полезно для автоматического / автономного / запланированного доступа к Google Analytics.данные для вашей учетной записи.Например, чтобы создать живую информационную панель из ваших собственных данных Google Analytics и поделиться ею с другими пользователями.

Существует несколько шагов, которые необходимо выполнить для настройки учетных записей служб для работы с Google Analytics:

  1. Зарегистрируйте проект в консоли API.
  2. В консоли API Google в области доступа к API создайте идентификатор клиента с типом приложения, установленным в учетную запись службы.
  3. Войдите в Google Analytics и перейдите в раздел «Администратор».
  4. Выберите учетную запись, к которой вы хотите, чтобы приложение имело доступ.
  5. Добавьте адрес электронной почты из идентификатора клиента, созданного вКонсоль API с шага № 2 как пользователь выбранной учетной записи Google Analytics.
  6. Следуйте инструкциям для служебных учетных записей для доступа к данным Google Analytics.

Подробнеездесь: https://developers.google.com/analytics/devguides/reporting/core/v3/gdataAuthorization

Пух, я думаю, API настолько велик, что у Google возникли проблемы с его простым документированием =)

Потом я посмотрел наода в plus-serviceaccount-cmdline-sample и analytics-cmdline-sample .Это очень простая версия, реализованная в Java-приложении Playframework2, которое печатается в System.out в качестве примеров выше:

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

public static Result index() {
   GoogleCredential credential = null;
   try {
        credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
              .setJsonFactory(JSON_FACTORY)
              .setServiceAccountId("2363XXXXXXX@developer.gserviceaccount.com")
              .setServiceAccountScopes(Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY))
              .setServiceAccountPrivateKeyFromP12File(new File("/your/path/to/privatekey/privatekey.p12"))                          
              .build();
     } catch (GeneralSecurityException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();  
     }

     // Set up and return Google Analytics API client.
     Analytics analytics = new Analytics.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
          "Google-Analytics-Hello-Analytics-API-Sample").build();

     String profileId = "";
     try {
         profileId = getFirstProfileId(analytics);
     } catch (IOException e) {
        e.printStackTrace(); 
     }

     GaData gaData = null;
     try {
        gaData = executeDataQuery(analytics, profileId);
     } catch (IOException e) {
        e.printStackTrace();
     }
     printGaData(gaData);

     return ok(index.render("Your new application is ready."));
}

private static String getFirstProfileId(Analytics analytics) throws IOException {
    String profileId = null;

    // Query accounts collection.
    Accounts accounts = analytics.management().accounts().list().execute();

    if (accounts.getItems().isEmpty()) {
        System.err.println("No accounts found");
    } else {
        String firstAccountId = accounts.getItems().get(0).getId();

        // Query webproperties collection.
        Webproperties webproperties =
                analytics.management().webproperties().list(firstAccountId).execute();

        if (webproperties.getItems().isEmpty()) {
            System.err.println("No Webproperties found");
        } else {
            String firstWebpropertyId = webproperties.getItems().get(0).getId();

            // Query profiles collection.
            Profiles profiles =
                    analytics.management().profiles().list(firstAccountId, firstWebpropertyId).execute();

            if (profiles.getItems().isEmpty()) {
                System.err.println("No profiles found");
            } else {
                profileId = profiles.getItems().get(0).getId();
            }
        }
    }
    return profileId;
}

/**
 * Returns the top 25 organic search keywords and traffic source by visits. The Core Reporting API
 * is used to retrieve this data.
 *
 * @param analytics the analytics service object used to access the API.
 * @param profileId the profile ID from which to retrieve data.
 * @return the response from the API.
 * @throws IOException tf an API error occured.
 */
private static GaData executeDataQuery(Analytics analytics, String profileId) throws IOException {
    return analytics.data().ga().get("ga:" + profileId, // Table Id. ga: + profile id.
            "2012-01-01", // Start date.
            "2012-01-14", // End date.
            "ga:visits") // Metrics.
            .setDimensions("ga:source,ga:keyword")
            .setSort("-ga:visits,ga:source")
            .setFilters("ga:medium==organic")
            .setMaxResults(25)
            .execute();
}

/**
 * Prints the output from the Core Reporting API. The profile name is printed along with each
 * column name and all the data in the rows.
 *
 * @param results data returned from the Core Reporting API.
 */
private static void printGaData(GaData results) {
    System.out.println("printing results for profile: " + results.getProfileInfo().getProfileName());

    if (results.getRows() == null || results.getRows().isEmpty()) {
        System.out.println("No results Found.");
    } else {

        // Print column headers.
        for (GaData.ColumnHeaders header : results.getColumnHeaders()) {
            System.out.printf("%30s", header.getName());
        }
        System.out.println();

        // Print actual data.
        for (List<String> row : results.getRows()) {
            for (String column : row) {
                System.out.printf("%30s", column);
            }
            System.out.println();
        }

        System.out.println();
    }
}

Надеюсь, это поможет!

2 голосов
/ 01 февраля 2012

Я решил это, наконец, с помощью версии 2.4 Core Reporting - есть авторизация с вашим пользователем / паролем gmail, так же просто, как и должно быть - интересно, почему нет примера, как это сделать в новой версии 3.0.

Базовая отчетность 2.4: http://code.google.com/intl/pl-PL/apis/analytics/docs/gdata/v2/gdataJava.html

0 голосов
/ 04 июня 2014

В качестве ответа на другой вопрос я написал пример кода на Java, который работает для меня.

См .: https://stackoverflow.com/a/24043488/1391050

0 голосов
/ 05 мая 2014

Я попытался следовать приведенному примеру, но он не компилируется. Я не знаю, если это 3.0 против 2.4, и если так, есть ли способ, чтобы пример кода можно было заставить работать - правильный выбор банок или что.

Одна проблема с примером состоит в том, что аргумент setServiceAccountScopes больше не строка, а Collections.singleton (AnalyticsScopes.Analytics.READ_ONLY).

Для использования примера также важно правильно настроить учетную запись службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...