2012-01-31 18 views
7

Estoy buscando la forma más sencilla de iniciar sesión programáticamente en Analytics y obtener datos. La documentación de Google escribe y da ejemplos para Oauth 2.0, que involucra a un usuario que inicia sesión manualmente con su cuenta de Google y luego es redirigido a mi sitio con autorización. Pero esto no es lo que quiero lograr: estoy construyendo una herramienta automática que necesita que el usuario/pase o cualquier otra clave de autorización esté codificada y luego inicie sesión sin la participación del usuario (esta es una herramienta de informes periódicos) .Autorización de Google Analytics en java

Ya encontré algo sobre API KEY, pero no encuentro ningún ejemplo de cómo hacerlo, ni cómo hacerlo con las bibliotecas de Google java.

Estaría muy agradecido por señalarme en la dirección correcta. Además, esta puede ser una pista valiosa para los demás sobre cómo hacerlo de la manera más simple, y creo que el registro debe ser simple.

Respuesta

2

Lo resolví finalmente con la versión 2.4 de Core Reporting - hay autorización con su usuario/pase de gmail, tan simple como debería ser - Me pregunto por qué no hay un ejemplo de cómo hacerlo en la nueva versión 3.0.

informes 2.4 Core: http://code.google.com/intl/pl-PL/apis/analytics/docs/gdata/v2/gdataJava.html

+0

Tu post realmente me ayuda. El documento de la versión 3.0 es tan confuso e inútil. Pierde muchos pasos importantes, como por ejemplo, cómo compilar client_secrets.json y apunta a '¿qué tal?' campo de golf. Nuevamente, gracias. –

+0

esa página eliminada por google estoy enfrentando este problema de los últimos 20 días ¿puedes compartir el código de qué exactamente estás siendo usado para acceder a los datos de Google Analytic –

11

que tenían el mismo problema y me tomó alrededor de 1 hora de encontrar esto en la documentación v3:

cuentas de servicio

Útil para automático/desconectado/acceso programado a los datos de Google Analytics para su propia cuenta. Por ejemplo, para construir un tablero en vivo de sus propios datos de Google Analytics y compartirlo con otros usuarios.

Hay algunos pasos que debe seguir para configurar las cuentas de servicio para trabajar con Google Analytics:

  1. registrar un proyecto en la consola de las API.
  2. En la consola de las API de Google, en el panel de acceso a la API, cree una ID de cliente con el Tipo de aplicación configurado en Cuenta de servicio.
  3. Regístrese en Google Analytics y vaya a la sección de administración.
  4. Seleccione la cuenta a la que desea que tenga acceso la aplicación.
  5. Agregue la dirección de correo electrónico, desde la ID del cliente creada en la consola de API desde el paso 2, como usuario de la cuenta seleccionada de Google Analytics.
  6. Siga las instrucciones para que las Cuentas de servicio accedan a los datos de Google Analytics.

Lee más aquí: https://developers.google.com/analytics/devguides/reporting/core/v3/gdataAuthorization

Puh, supongo que la API es tan grande que Google está teniendo problemas para documentar que una manera fácil =)

Entonces miré el código en el plus-serviceaccount-cmdline-sample y analytics-cmdline-sample. Esta es una versión muy básica implementada en una aplicación java que Playframework2 impresiones a System.out como los ejemplos anteriores:

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("[email protected]") 
       .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(); 
    } 
} 

espero que esto ayude!

+0

¿Esto de hecho funciona? En particular, el archivo P12: ¿lo creas o se descarga? Además, ¿se necesita una nueva clave API para cada máquina sobre la cual se ejecutará este código? – Jeff

+0

Al crear la cuenta de servicio, no seleccione el JSON preferido (por Google), pero seleccione P12. Paso un tiempo buscando cómo crear una 'PrivateKey' a partir de un archivo JSON, pero no pude encontrar nada en un tiempo razonable. –

0

Intenté seguir el ejemplo proporcionado y no compila. No sé si esto es 3.0 vs 2.4 y, de ser así, ¿hay alguna manera de que el código de ejemplo funcione? - elección adecuada de jar o qué.

Un problema con el ejemplo es que el argumento para setServiceAccountScopes ya no es una cadena sino un Collections.singleton (AnalyticsScopes.Analytics.READ_ONLY).

También es importante usar el ejemplo para configurar correctamente la cuenta de servicio.