.NET平台下的Analytics Reporting API V4客户端库

47

我正在尝试从我们的 Google Analytics 实例中获取一些数据,并希望使用 Analytics Reporting API V4 Client Library for .NET(https://developers.google.com/api-client-library/dotnet/apis/analyticsreporting/v4)以便将这些数据整合进我们构建的管理网站。然而,我发现很难找到此代码的使用示例,文档似乎也非常稀少。我们只需要查看与我们控制的分析帐户相关联的数据,因此我想要使用服务帐户进行授权。

如果有人能够提供一些示例代码或指导我如何使用 .net api 获取一些基本的报告数据,那将不胜感激。


1
客户端库文档 适用于所有 Google API。至于如何进行特定请求,您可以查看各种语言的 V4 API 示例,并将其映射到 dot net。 - Matt
6
我最终成功使用了 .net 客户端库发出请求,但这绝对不是一件直观的事情。如果我有额外的时间,我会发布一些样例代码。 - Ben
2
如果你能找到时间就太好了 :) - Gabriël
2
@Ben,请问你可以发布一些示例代码吗? - Ian Routledge
4个回答

84
调用 Google Analytics Reporting API 从 C# 并不特别困难,然而所有必要的步骤在 Google Analytics API 文档中似乎没有被清晰地概述。我将在此尝试列出它们。虽然因人而异,但我相信这些步骤在 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访问。可以在此处找到有关此设置的文档链接,但我将在下面进行概述:
  1. 登录Google Cloud平台控制台: https://console.cloud.google.com/。请确保使用具有访问要使用报告API查询的Google Analytics帐户的帐户登录。

  2. 单击Google Cloud平台菜单,然后选择API管理器

Google Cloud Platform API Manager


3. 在左侧点击“凭据”,然后创建一个名为“Google Analytics API Console”的新项目。请耐心等待一段时间以创建新项目。 4. 创建项目后,如果尚未选择,则再次单击“凭据”,然后在右侧面板中单击“OAuth同意屏幕”链接。将“向用户显示的产品名称”设置为“Google Analytics API Console”,然后单击保存。 5. 再次单击“凭据”,然后单击“创建凭据”,并选择“OAuth客户端ID”。选择“其他”作为“应用程序类型”,然后输入“Google Analytics API Console”作为“名称”,最后单击“创建”。 6. 创建凭据后,您将看到客户端ID和客户端密钥。您可以关闭对话框窗口。 7. 现在,在“凭据”下,您应该看到“OAuth 2.0客户端ID”下的一个条目。单击该条目极右侧的下载图标以下载“client_secret.json”文件(此文件名称会更长)。下载完成后,请将该文件添加到项目的根级别,并将其重命名为“client_secret.json”。

Google Cloud Platform API Credentials

现在OAuth 2.0凭据已创建,我们需要启用它来调用Reporting API。选择概览并确保右侧面板中选中了Google APIs。在搜索框中键入Reporting,并从列表中选择Analytics Reporting API V4。在下一个屏幕上,单击启用。启用此API后,您应该能够在右侧面板的已启用API列表下看到它。

Google Cloud Platform Enabled Analytics Reporting

现在我们已经创建了项目并创建了OAuth 2.0凭据,是时候调用Reporting API V4了。下面的代码将使用Google API和client_secret.json文件创建一个Google.Apis.Auth.OAuth2.UserCredential,以查询给定日期范围内视图中所有会话的Reporting API。该代码改编自此处的Java示例
在执行代码之前,请确保将client_secret.json文件的Build Action设置为Content,并将Copy to Output Directory设置为Copy if newer。还有两个需要正确设置的变量。首先,在GetCredential()方法中,将loginEmailAddress值设置为用于创建OAuth 2.0凭据的电子邮件地址。然后,在Main方法中,确保将reportRequest变量中的ViewId设置为您想要使用Reporting API查询的视图。要查找ViewId,请登录Google Analytics并选择管理选项卡。从那里,在右侧的视图下拉菜单中选择要查询的视图,然后选择视图设置View 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"));
            }
        }
    }
}

4
请注意,AnalyticsReportingService 实现了 IDisposable 接口,应该用 using 块进行包装。 - TrueWill
4
谢谢你的评论,@TrueWill - 你是正确的。我更新了代码,加入了一个using语句来围绕AnalyticsReportingService实例。 - rsbarro
1
我建议您尝试在非隐身模式下退出个人账户,然后再重新运行一遍。如果问题仍然存在,我建议您考虑发布一个单独的问题,以便您可以包含更多信息。请随意在评论中链接它,我会查看(如果其他人没有先回答)。我认为在评论中尝试解决问题是没有意义的。 - rsbarro
5
一篇非常有用和文笔优秀的回答,尤其是考虑到目前缺乏相关的文档资料。 - AGB
OP 需要访问他们自己的 GA 属性。他们应该创建一个“服务帐号密钥”,而不是 OAuth 客户端 ID(请求用户同意)吗?我的理解是,这样可以避免整个交互式部分,他们必须授予权限。私钥立即为服务帐户生成。 - Dmitry
显示剩余6条评论

29

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

首先,了解OAuth下有两个选择:用户凭据服务帐户凭据。当您不知道将要连接哪个Google Analytics帐户时,使用用户凭据,因此用户授予应用程序权限。服务帐户凭据则是为您的公司构建自己的仪表板以显示Google Analytics数据等情况而使用。

大多数情况下,如果您需要对Analytics数据进行编程访问,则属于第二种情况。

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

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

Google配置完成。现在跳转到Visual Studio。

  1. 创建一个新的C#控制台项目。
  2. 获取Nuget包Google.Apis.AnalyticsReporting.v4。它还应自动下载核心包。
  3. 获取先前下载的JSON文件,将其放入项目中,将其属性设置为ContentCopy Always
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);
        }
    }
}

7
这正是我所需要的。谢谢,伙计,这真的很有帮助。 - jonju
1
同意。这个方法完美地运行了,最终让我达到了我的目标,为将GA数据加载到SQL Server中作为起点。 - Brandon
这应该是被接受的答案。我浪费了时间尝试设置用户凭据!我想我只能责怪自己没有先浏览答案。 - geriwald
希望将这个例子转换为使用oauth刷新令牌。有人有这样的例子吗? - Chris Harrington
2022年,GA中将不再有视图。 你们知道通过GA v4 API for .netcore需要进行哪些请求吗?如果没有视图,那还需要什么? - Borislav Nanovski
这是一篇很棒的文章,我希望我早点看到它。但现在已经是2022年了,根据我所读的,谷歌建议使用Google.Analytics.Data.V1Beta库。有人知道这个新库是否取代了Google Analytics Reporting v4 API吗? - MattoMK

6
我有同样的经历:Google的文档非常详细,但在如何与.NET连接方面并不清晰。
我最终意识到的一个关键点是,您可以使用OAuth2凭据或服务帐户凭据进行连接。如果您拥有自己的Analytics帐户,请使用服务帐户。如果您需要连接其他用户的Analytics帐户,请使用OAuth2。
似乎有很多在线示例可以使用OAuth2凭据获取Analytics API数据,但我拥有自己的Analytics帐户,只想从中提取数据。我找出了如何使用ServiceAccountCredential连接到Analytics Reporting API v4,并在类似的Stack Overflow问题上写了一个答案,其中包含所有细节。

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);
       
    }

   

阅读文档以通过刷新令牌获取访问令牌。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接