Google Analytics Reports v4 API 不在浏览器中显示图表

Google Analytics Reports v4 API does not show graph in browser

我已经开始更新 Google Analytics Reports v4 API。我没有先验知识。我正在尝试生成一个简单的图表。

我使用了 google 分析文档中给出的示例代码。但是我根本没有收到报告,而是一条消息

Received verification code. You may now close this window...

不知道为什么会显示这样的消息。好像没有可用的数据。到目前为止,我已经为 运行 项目完成了以下工作。

  1. Create the project.
  2. Crate the service.
  3. Create the View with email address retrieved from service's JSON file.
  4. Create client_secrets.json and add it to my src\ folder.
  5. Get the view id and use it in my code.

我不知道从这里往哪个方向走。有很多事情需要照顾,文档也很健康。这对于像我这样的初学者来说很难决定选择合适的零件。

此外,我有以下问题需要知道答案。

  1. Is it possible to run it on local server such as Tomcat?
  2. Is google analytics free? Can I use it using my gmail email address?
  3. Is it important to have domain and hosting to get the report in browser?
  4. Am I need to give valid return URL while setting the client settings?
  5. Why am I need to give View ID? If it is to give manually then how do I generate the report dynamically?

这是我的环境和 Java 代码。请查看并帮助我找到解决方案。 我期待一个流畅干净的指南。

环境

  1. Eclipse Java EE 与 Tomcat 9.0.30 服务器。
  2. Java 用作编程语言。

代码

package com.garinst;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.api.services.analyticsreporting.v4.AnalyticsReportingScopes;
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting;
import com.google.api.services.analyticsreporting.v4.model.ColumnHeader;
import com.google.api.services.analyticsreporting.v4.model.DateRange;
import com.google.api.services.analyticsreporting.v4.model.DateRangeValues;
import com.google.api.services.analyticsreporting.v4.model.GetReportsRequest;
import com.google.api.services.analyticsreporting.v4.model.GetReportsResponse;
import com.google.api.services.analyticsreporting.v4.model.Metric;
import com.google.api.services.analyticsreporting.v4.model.Dimension;
import com.google.api.services.analyticsreporting.v4.model.MetricHeaderEntry;
import com.google.api.services.analyticsreporting.v4.model.Report;
import com.google.api.services.analyticsreporting.v4.model.ReportRequest;
import com.google.api.services.analyticsreporting.v4.model.ReportRow;

/**
 * A simple example of how to access the Google Analytics API.
 */
public class HelloAnalytics {
    // Path to client_secrets.json file downloaded from the Developer's Console.
    // The path is relative to HelloAnalytics.java.
    private static final String CLIENT_SECRET_JSON_RESOURCE = "client_secrets.json";

    // Replace with your view ID.
    private static final String VIEW_ID = "96519128";

    // The directory where the user's credentials will be stored.
    /*
     * private static final File DATA_STORE_DIR = new File(
     * System.getProperty("user.home"), ".store/hello_analytics");
     */
    private static final File DATA_STORE_DIR = new File("hello_analytics");

    private static final String APPLICATION_NAME = "Hello Analytics Reporting";
    private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
    private static NetHttpTransport httpTransport;
    private static FileDataStoreFactory dataStoreFactory;

    public static void main(String[] args) {
        try {
            AnalyticsReporting service = initializeAnalyticsReporting();

            GetReportsResponse response = getReport(service);
            printResponse(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Initializes an authorized Analytics Reporting service object.
     *
     * @return The analytics reporting service object.
     * @throws IOException
     * @throws GeneralSecurityException
     */
    private static AnalyticsReporting initializeAnalyticsReporting() throws GeneralSecurityException, IOException {

        httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);

        // Load client secrets.
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
                new InputStreamReader(HelloAnalytics.class.getResourceAsStream(CLIENT_SECRET_JSON_RESOURCE)));

        // Set up authorization code flow for all authorization scopes.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY,
                clientSecrets, AnalyticsReportingScopes.all()).setDataStoreFactory(dataStoreFactory).build();

        // Authorize.
        Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
        // Construct the Analytics Reporting service object.
        return new AnalyticsReporting.Builder(httpTransport, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME).build();
    }

    /**
     * Query the Analytics Reporting API V4. Constructs a request for the sessions
     * for the past seven days. Returns the API response.
     *
     * @param service
     * @return GetReportResponse
     * @throws IOException
     */
    private static GetReportsResponse getReport(AnalyticsReporting service) throws IOException {
        // Create the DateRange object.
        DateRange dateRange = new DateRange();
        dateRange.setStartDate("7DaysAgo");
        dateRange.setEndDate("today");

        // Create the Metrics object.
        Metric sessions = new Metric().setExpression("ga:sessions").setAlias("sessions");

        // Create the Dimensions object.
        Dimension browser = new Dimension().setName("ga:browser");

        // Create the ReportRequest object.
        ReportRequest request = new ReportRequest().setViewId(VIEW_ID).setDateRanges(Arrays.asList(dateRange))
                .setDimensions(Arrays.asList(browser)).setMetrics(Arrays.asList(sessions));

        ArrayList<ReportRequest> requests = new ArrayList<ReportRequest>();
        requests.add(request);

        // Create the GetReportsRequest object.
        GetReportsRequest getReport = new GetReportsRequest().setReportRequests(requests);

        // Call the batchGet method.
        GetReportsResponse response = service.reports().batchGet(getReport).execute();

        // Return the response.
        return response;
    }

    /**
     * Parses and prints the Analytics Reporting API V4 response.
     *
     * @param response the Analytics Reporting API V4 response.
     */
    private static void printResponse(GetReportsResponse response) {

        for (Report report : response.getReports()) {
            ColumnHeader header = report.getColumnHeader();
            List<String> dimensionHeaders = header.getDimensions();
            List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
            List<ReportRow> rows = report.getData().getRows();

            if (rows == null) {
                System.out.println("No data found for " + VIEW_ID);
                return;
            }

            for (ReportRow row : rows) {
                List<String> dimensions = row.getDimensions();
                List<DateRangeValues> metrics = row.getMetrics();
                for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
                    System.out.println(dimensionHeaders.get(i) + ": " + dimensions.get(i));
                }

                for (int j = 0; j < metrics.size(); j++) {
                    System.out.print("Date Range (" + j + "): ");
                    DateRangeValues values = metrics.get(j);
                    for (int k = 0; k < values.getValues().size() && k < metricHeaders.size(); k++) {
                        System.out.println(metricHeaders.get(k).getName() + ": " + values.getValues().get(k));
                    }
                }
            }
        }
    }
}

Maven 依赖项

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty -->
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client-jetty</artifactId>
        <version>1.30.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client-gson -->
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client-gson</artifactId>
        <version>1.30.7</version>
    </dependency>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-analyticsreporting</artifactId>
        <version>v4-rev20190904-1.30.1</version>
    </dependency>
  </dependencies>

Received verification code. You may now close this window...

这是 Oauth2 流程中的第一步,一旦用户授权您访问他们的 google 分析数据,此代码将 returned 到您的应用程序,然后交换访问令牌.您可能想查看 Oauth2,或者您可以按照它说的做,然后关闭 window.

Is google analytics free? Can I use it using my gmail email address?

是的,Google 分析 api 是免费使用的。用户使用他们在 google 分析帐户

中设置的用户登录您的应用程序

Is it important to have domain and hosting to get the report in browser?

您需要将您的应用程序托管在某个用户可以访问的地方。请记住 google 分析 return 的数据,因为 Json 将由您来构建报告并将其显示给用户。

Am I need to give valid return URL while setting the client settings?

如果您要在 Web 上托管它,您将需要一个有效的重定向 uri 才能完成授权过程。

Why am I need to give View ID? If it is to give manually then how do I generate the report dynamically?

用户可以有多个 google 分析帐户,每个帐户可以有多个网站,每个网站 属性 可以有多个视图。您的用户需要能够决定他们想要查看哪个视图的数据。

备注

该系统用于从 google 请求数据,分析原始数据 return 编辑为 json。它不是 return 编辑的报告,您需要自己创建图形。 Oauth2 登录适用于多用户系统,任何人都可以登录到您的应用程序,它不会只显示您的个人数据。

评论问题

Is there any possibility to get the dynamic result such as user will login and get his own data?

这就是 oauth2 的工作原理。登录您的应用程序的用户可以访问他们的数据

How is it possible to display the JSON data in graphical reports as available in google analytics?

您需要为图形创建一个库,或者找到一个已经由第三方为您创建的库,然后插入您从 Google 分析中获得的数据。 API 只是 return json 数据,他们无法控制开发人员如何显示它。