【问题标题】:Retrieving data from Google Analytics API using .NET/C#使用 .NET/C# 从 Google Analytics API 检索数据
【发布时间】:2014-03-23 00:57:59
【问题描述】:

我正在尝试使用本地控制台应用从谷歌分析中检索数据。我能够提取一些数据而无需登录谷歌帐户并且只使用 API。

问题是我没有得到正确的值,而且我不确定如何格式化代码来提取正确的值。我不想在某个时间范围内检索所有访问者,在本例中为“2012-01-01”-“2014-02-20”。在 Google Analytics(分析)仪表板中查看时,访问者的实际数量大约是 10 倍。调试代码时我得到了 15000 个数字。我在控制台中显示 d.TotalResults 可能是错误的,变量“d”包含许多不同的属性。

这是我正在运行的代码:

public static void Main(string[] args)
{
    var serviceAccountEmail = "MY@developer.gserviceaccount.com";

    var certificate = new X509Certificate2(@"C:\Users\User\Desktop\key.p12", "notasecret", X509KeyStorageFlags.Exportable);

    var credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
        Scopes = new[] { AnalyticsService.Scope.Analytics }
    }.FromCertificate(certificate));

    // Create the service.
    //Twistandtango
    var gas = new AnalyticsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "TestGoogleAnalytics",
    });

    var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visitors");

    //Specify some addition query parameters
    r.Dimensions = "ga:pagePath";
    r.Sort = "-ga:visitors";
    r.MaxResults = 5;

    //Execute and fetch the results of our query
    Google.Apis.Analytics.v3.Data.GaData d = r.Execute();


    Console.WriteLine(d.TotalResults);
    Console.ReadLine();
}

我正在尝试使用此工具https://ga-dev-tools.appspot.com/explorer/ 查询我想要的结果。当我在我的代码中实现它时,它看起来像这样:

public static void Main(string[] args)
{
    var serviceAccountEmail = "MY@developer.gserviceaccount.com";

    var certificate = new X509Certificate2(@"C:\Users\User\Desktop\key.p12", "notasecret", X509KeyStorageFlags.Exportable);

    var credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = new[] { AnalyticsService.Scope.Analytics }
                }.FromCertificate(certificate));

                // Create the service.
                //Twistandtango
                var gas = new AnalyticsService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "TestGoogleAnalytics",
                });

                var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visits");

                //Specify some addition query parameters
                r.Dimensions = "ga:visitCount";
                r.Metrics = "ga:visits";
                r.Segment = "gaid::-1";
                //r.Sort = "-ga:visitors";
                r.MaxResults = 10000;

                //Execute and fetch the results of our query
                Google.Apis.Analytics.v3.Data.GaData d = r.Execute();


                Console.WriteLine(d.TotalResults);
                Console.ReadLine();
            }
        }

但是,将指标 (r.Metrics = "ga:visits";) 添加到项目后,我收到此错误:

无法将错误 7 属性或索引器“Google.Apis.Analytics.v3.DataResource.GaResource.GetRequest.Metrics”分配给 -- 它是只读的

这里还有一个 Analytics v3 中的类索引:

https://developers.google.com/resources/api-libraries/documentation/analytics/v3/csharp/latest/annotated.html

有人知道这是如何工作的吗?如何从我指定的时间范围内检索访问者总数??

谢谢

【问题讨论】:

  • 您还选择了 PagePath,您必须将它们全部加起来以获得全部总数。你确定你不是在寻找访问者还是访客?
  • 嗯,我只是在寻找我指定的日期之间的所有访问。所有访问总数,新的,旧的等。我如何总结它们?猜猜我还没有弄清楚这是如何工作的,尝试了不同的维度和指标,但我认为我没有正确格式化代码,因为我没有得到我期望的结果。我认为您可以组合过滤器或维度,但我不确定

标签: c# .net google-analytics google-analytics-api gdata


【解决方案1】:

您的问题是您在 data.ga.get 方法中提供指标,您不使用 r.metrics 指标添加更多它们,并用 , 将它们分开。在这种情况下 ga:visits 是您请求的指标。

var r = gas.Data.Ga.Get("ga:MYProfileID", "2012-01-01", "2014-02-20", "ga:visits");

维度不是必填项,因此您可以删除r.Dimensions = "ga:visitCount"; 看看返回的内容。

请记住,如果行数多于您设置的最大结果集,则仅执行 Google.Apis.Analytics.v3.Data.GaData d = r.Execute(); 不会返回所有行。您需要检查下一个链接以确保没有更多行。


更新以回答以下关于下一个链接的问题。 您当前将 max-results 设置为 10000,这是可以在一个块中返回的最大行数。如果有超过 10000 行,那么您将获得 nextlink 您需要请求下一个行块。 TotalResult 将为您提供应该返回的总行数。下面我一直使用 .execute 请求更多数据,直到没有 Next 链接为止。

List result = new List();
 do {
     try
       {
       GaData DataList = request.Execute();  // Make the request
       result.AddRange(DataList.Rows);       // store the Data to return later
       // hack to get next link stuff
      totalResults = (!DataList.TotalResults.HasValue) ? 0 : Int32.Parse(DataList.TotalResults.ToString());
       rowcnt = rowcnt + DataList.Rows.Count;
       NextLink = DataList.NextLink;                       
       request.StartIndex = rowcnt + 1 ;
       }
      catch (Exception e)
         {
          Console.WriteLine("An error occurred: " + e.Message);
          totalResults = 0;
         }
 } while (request.StartIndex <= totalResults);

【讨论】:

  • 好吧,我知道了,谢谢。不过,不知道你检查下一个链接是什么意思。是的,看起来我的应用程序并没有查询所有访问总数,只是其中的一部分。作为 r.Execute 的替代方法,您将如何收集总访问次数?
  • 更新以添加更多关于 nextlink 的信息
  • 我在尝试将 .Rows 添加到结果集合时遇到错误。结果是什么类型的?
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多