适用于.NET的Analytics Reporting API V4客户端库

时间:2016-04-25 20:16:18

标签: c# .net google-analytics-api google-api-dotnet-client google-analytics-v4

我正在尝试从我们的Google分析实例获取一些数据,并且我想使用适用于.NET的Analytics Reporting API V4客户端库(https://developers.google.com/api-client-library/dotnet/apis/analyticsreporting/v4),以便我可以将这些数据烘焙到我们建立的管理网站。我无法找到使用此代码的任何示例,文档似乎非常稀疏。我想使用服务帐户进行授权,因为我们只需要查看与我们控制的分析帐户相关联的数据。

如果有人能提供一些示例代码或指出我正确的方向使用.net api获取一些基本的报告数据,我们将不胜感激

4 个答案:

答案 0 :(得分:59)

从C#调用Google Analytics Reporting API并不是特别困难,但Google AnalyticsAPI文档中似乎没有详细说明所有必要步骤。我会尝试将它们全部列在这里。虽然YMMV,我相信这些步骤在2016年7月20日是正确的。

您可以从创建新的C#项目开始。我们将制作一个控制台应用程序来测试名为GoogleAnalyticsApiConsole的测试。创建项目后,我们将使用NuGet包管理器控制台(在Visual Studio 2015的“工具”菜单下找到)添加对Google Analytics Reporting API V4 Client Library for .NET的引用。启动控制台并在PM>提示符下发出以下命令:

PM> Install-Package Google.Apis.AnalyticsReporting.v4

安装该软件包将下载调用Google Analytics报告Web服务所需的客户端库以及许多其他依赖项。

要调用Web服务,您需要为应用程序设置OAuth 2.0访问权限。此设置的文档can be found here,但我将在下面总结:

  1. 登录 Google Cloud Platform Console https://console.cloud.google.com/。请务必使用可以访问您尝试使用报告API查询的Google Analytics帐户的帐户登录。

  2. 点击 Google Cloud Platform 菜单,然后选择 API Manager

  3. Google Cloud Platform API Manager

    1. 在左侧,单击凭据,然后创建名为Google Analytics API Console的新项目。给它一些时间来创建新项目。

    2. 创建项目后,如果尚未选择凭据,请再次单击凭据,然后单击右侧面板中的 OAuth同意屏幕链接。将向用户显示的产品名称设置为Google Analytics API Console,然后点击保存。

    3. 再次点击凭据,然后点击创建凭据,然后选择 OAuth客户端ID 。为应用类型选择其他,然后输入Google Analytics API Console作为名称,然后点击创建

    4. 创建凭据后,您将看到客户端ID和客户端密钥。您可以关闭对话窗口。

    5. 现在,在凭据下,您应该会在 OAuth 2.0客户端ID 下看到一个条目。单击该条目最右侧的下载图标以下载client_secret.json文件(此文件将具有更长的名称)。下载后,将该文件添加到根级别的项目中,并将其重命名为client_secret.json

    6. Google Cloud Platform API Credentials

      1. 现在已经创建了OAuth 2.0凭据,我们需要启用它来调用Reporting API。选择概述,并确保在右侧面板中选择 Google API 。在搜索框中输入Reporting,然后从列表中选择 Analytics Reporting API V4 。在下一个屏幕上,点击启用。启用此API后,您应该可以在右侧面板的启用的API 列表中看到它。
      2. Google Cloud Platform Enabled Analytics Reporting

        现在我们已经创建了我们的项目并创建了OAuth 2.0凭据,现在是时候调用Reporting API V4了。下面列出的代码将使用Google API和client_secret.json文件创建Google.Apis.Auth.OAuth2.UserCredential,以查询Reporting API,查看View的给定日期范围之间的所有会话。代码改编自Java example here

        在执行代码之前,请务必将client_secret.json文件中的构建操作设置为内容复制到输出目录设置为如果更新则复制。还有两个变量需要正确设置。首先,在GetCredential()方法中,将loginEmailAddress值设置为用于创建OAuth 2.0凭据的电子邮件地址。然后,在Main方法中,请务必将ViewId变量中的reportRequest设置为您要使用Reporting API查询的视图。要查找ViewId,请登录Google Analytics并选择管理标签。从那里,在最右侧的查看下拉列表中选择您要查询的视图,然后选择查看设置查看ID 将显示在基本设置下。

        第一次执行代码时,会弹出一个网页,询问您是否允许Google Analytics API Console访问API数据。选择允许继续。从那时起,该权限将存储在GoogleAnalyticsApiConsole FileDataStore中。如果删除该文件,则需要再次授予权限。该文件可以在%APPDATA%\GoogleAnalyicsApiConsole目录中找到。

        Google API Permission OAuth 2.0

        请注意,我相信这种情况将满足OP的需求。如果要将此应用程序分发给客户端,则很可能需要使用不同的OAuth 2.0方案。

        以下是代码:

        using System;
        using System.Collections.Generic;
        using System.IO;
        using System.Linq;
        using System.Threading;
        using System.Threading.Tasks;
        using Google.Apis.AnalyticsReporting.v4;
        using Google.Apis.AnalyticsReporting.v4.Data;
        using Google.Apis.Auth.OAuth2;
        using Google.Apis.Services;
        using Google.Apis.Util.Store;
        
        namespace GoogleAnalyticsApiConsole
        {
            class Program
            {
                static void Main(string[] args)
                {
                    try
                    {
                        var credential = GetCredential().Result;
                        using(var svc = new AnalyticsReportingService(
                            new BaseClientService.Initializer
                            {
                                HttpClientInitializer = credential,
                                ApplicationName = "Google Analytics API Console"
                            }))
                        {    
                            var dateRange = new DateRange
                            {
                                StartDate = "2016-05-01",
                                EndDate = "2016-05-31"
                            };
                            var sessions = new Metric
                            {
                                Expression = "ga:sessions",
                                Alias = "Sessions"
                            };
                            var date = new Dimension { Name = "ga:date" };
        
                            var reportRequest = new ReportRequest
                            {
                                DateRanges = new List<DateRange> { dateRange },
                                Dimensions = new List<Dimension> { date },
                                Metrics = new List<Metric> { sessions },
                                ViewId = "<<your view id>>"
                            };
                            var getReportsRequest = new GetReportsRequest {
                                ReportRequests = new List<ReportRequest> { reportRequest } };
                            var batchRequest = svc.Reports.BatchGet(getReportsRequest);
                            var response = batchRequest.Execute();
                            foreach (var x in response.Reports.First().Data.Rows)
                            {
                                Console.WriteLine(string.Join(", ", x.Dimensions) +
                                "   " + string.Join(", ", x.Metrics.First().Values));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }
        
                static async Task<UserCredential> GetCredential()
                {
                    using (var stream = new FileStream("client_secret.json", 
                         FileMode.Open, FileAccess.Read))
                    {
                        const string loginEmailAddress = "<<your account email address>>";
                        return await GoogleWebAuthorizationBroker.AuthorizeAsync(
                            GoogleClientSecrets.Load(stream).Secrets,
                            new[] { AnalyticsReportingService.Scope.Analytics },
                            loginEmailAddress, CancellationToken.None, 
                            new FileDataStore("GoogleAnalyticsApiConsole"));
                    }
                }
            }
        }
        

答案 1 :(得分:5)

我有同样的经历:Google的文档非常深入,但在提供如何连接.NET的明确示例方面非常糟糕。

我最终意识到的一个关键因素是您可以使用OAuth2凭据或服务帐户凭据进行连接。如果您拥有Google Analytics帐户,请使用服务帐户。如果您需要连接其他用户&#39; Google Analytics帐户,请使用OAuth2。

似乎有很多关于如何使用OAuth2凭据获取Analytics API数据的在线示例,但我拥有自己的Google Analytics帐户,只是想从中提取数据。我想出了如何使用ServiceAccountCredential连接到Analytics Reporting API v4,并在类似的Stack Overflow问题上写了an answer并提供了所有详细信息。

答案 2 :(得分:4)

以下是 2019年9月更新的步骤。

首先,请了解OAuth下有两个选择:用户凭据服务帐户凭据。当您不知道要连接到哪个Google Analytics(分析)帐户时,将使用用户凭据,因此用户将授予您的应用程序权限。打算使用服务帐户凭据,例如如果您为公司构建了自己的仪表板以显示Google Analytics(分析)数据。

在大多数情况下,如果您需要通过编程方式访问Google Analytics(分析)数据,则是第二种情况。

下面的步骤应该使您开始一个简单的C#示例。请注意,Google Web控制台部分可能会略有不同,但是仍然应该易于找到。

  1. 转到Google API Console。如果出现提示,请创建一个项目。
  2. 转到Service accounts
  3. 创建一个新的服务帐户。您应该拥有一个使用随机生成的电子邮件地址的帐户(我的帐户以xxx@xxx.iam.gserviceaccount.com结尾)
  4. 找到创建密钥按钮。选择 JSON 并下载文件。这是您的私钥,也是唯一的副本。不要丢失它。
  5. 转到您的Google Analytics(分析)管理面板。使用其电子邮件地址授予对服务帐户的访问权限,就像授予其他用户访问权限的方式一样。

Google配置完成。现在进入Visual Studio。

  1. 创建一个新的C#控制台项目。
  2. 获取Nuget包 Google.Apis.AnalyticsReporting.v4 。它还应该自动下载核心软件包。
  3. 获取先前下载的JSON文件,将其放入项目中,将其属性设置为 Content ,并始终复制
using Google.Apis.AnalyticsReporting.v4.Data;
using System;

namespace ConsoleApplication {
    class Program {
        static void Main(string[] args) {
            var credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromFile("serviceAccount.json")
                .CreateScoped(new[] { Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService.Scope.AnalyticsReadonly });

            using (var analytics = new Google.Apis.AnalyticsReporting.v4.AnalyticsReportingService(new Google.Apis.Services.BaseClientService.Initializer {
                HttpClientInitializer = credential
            })) {
                var request = analytics.Reports.BatchGet(new GetReportsRequest {
                    ReportRequests = new[] {
                        new ReportRequest{
                            DateRanges = new[] { new DateRange{ StartDate = "2019-01-01", EndDate = "2019-01-31" }},
                            Dimensions = new[] { new Dimension{ Name = "ga:date" }},
                            Metrics = new[] { new Metric{ Expression = "ga:sessions", Alias = "Sessions"}},
                            ViewId = "99999999"
                        }
                    }
                });
                var response = request.Execute();
                foreach (var row in response.Reports[0].Data.Rows) {
                    Console.Write(string.Join(",", row.Dimensions) + ": ");
                    foreach (var metric in row.Metrics) Console.WriteLine(string.Join(",", metric.Values));
                }
            }

            Console.WriteLine("Done");
            Console.ReadKey(true);
        }
    }
}

答案 3 :(得分:0)

这是您实际要查找的代码-

    protected void Page_Load(object sender, EventArgs e)
    {
        IRestRequest request = new RestRequest("", Method.POST, DataFormat.Json);
        string url = "https://analyticsreporting.googleapis.com/v4/reports:batchGet";

        RestClient restClient = new RestClient();
        RestRequest Tokenrequest = new RestRequest();
        Tokenrequest.AddQueryParameter("client_id", "<CLIENTID>");
        Tokenrequest.AddQueryParameter("client_secret", "<CLIENTSECRET>");
        Tokenrequest.AddQueryParameter("grant_type", "refresh_token");
        Tokenrequest.AddQueryParameter("refresh_token", "<REFRESH_TOKEN>");
        restClient.BaseUrl = new System.Uri("https://oauth2.googleapis.com/token");
        restClient.Post(Tokenrequest);
        var responseToken = restClient.Execute(Tokenrequest);
        //Response.Write(responseToken);
        dynamic Tokendata = JObject.Parse(responseToken.Content);
        var newToken = Tokendata.access_token.Value;

        request.AddHeader("authorization", string.Concat("Bearer "+newToken));
        string jsonString = "{" +
                "\"reportRequests\": [{" +
                    "\"dateRanges\" : [{\"" +
                     "startDate\" :'2021-07-01' ," +
                     "\"endDate\" : '2021-07-07'" +
                "}]," +
                
                "\"metrics\":["+
                "{\"expression\":'ga:totalEvents'},"+
                "{\"expression\": 'ga:pageviews'}"+
                  "]," +


                "\"dimensions\": ["+
            "{\"name\": 'ga:eventCategory'}" +
                ",{" +
            "\"name\": 'ga:eventAction'"+
                "},"+
                //"{\"name\": 'ga:deviceCategory'}"+
                "]," +


                "\"dimensionFilterClauses\": [{"+
            "\"filters\": [{"+
                "\"dimensionName\": 'ga:eventCategory',"+
          "\"operator\": 'EXACT',"+
          "\"expressions\": ["+
            "\"Login_Form"+
                "\"]}]}],"+



                "\"viewId\":'<VIEWID>'" +
                "}]" +
            "}";

        IRestClient client = new RestClient(url);
        request.AddHeader("Content-Type", "application/json; CHARSET=UTF-8");
        request.Resource = "";
        request.AddParameter("application/json", jsonString, ParameterType.RequestBody);
        var response = client.Execute(request);
        dynamic jdata = JObject.Parse(response.Content);

        var Row_data = jdata.reports[0].data.rows;
        Response.Write(Row_data);
       
    }

   

阅读文档,通过refresh_token获取access_token。

https://developers.google.com/identity/protocols/oauth2/web-server#offline