使用Google AnalyticsAPI在C#中显示信息

Vin*_*nyG 50 .net c# google-api google-analytics-api

我一整天都在寻找一个好的解决方案,但谷歌进化得如此之快,以至于找不到合适的东西.我想要做的是,我有一个Web应用程序,其中有一个管理部分,用户需要登录才能查看信息.在本节中,我想显示来自GA的一些数据,例如某些特定网址的综合浏览量.因为它不是用户信息我展示,但谷歌analytics'user我想连接传递信息(用户名/密码或APIKey),但我不能找出如何.我发现的所有样本都使用了OAuth2(如果我理解的话,会要求访问者使用谷歌登录).

到目前为止我发现了什么:

也许我只是累了,明天很容易找到解决方案,但现在我需要帮助!

谢谢

Log*_* G. 83

它需要在谷歌方面进行一些设置,但实际上非常简单.我将逐步列出.

首先,您需要在Google云控制台中创建应用程序并启用Analytics API.

现在启用了Analytics API,下一步将是启用服务帐户以访问所需的分析配置文件/站点.服务帐户将允许您登录而无需提示用户输入凭据.

  • 转到http://code.google.com/apis/console,然后从下拉列表中选择您创建的项目.
  • 接下来转到"API访问"部分,然后单击"创建另一个客户端ID"按钮.
  • 在Create Client ID窗口中,选择service account并单击create client id.
  • 如果此帐户没有自动开始下载,请下载该帐户的公钥.稍后您在编写授权代码时将需要此密钥.
  • 在退出复制之前,服务帐户会自动生成电子邮件地址,因为您将在下一步中使用此帐户.客户端电子邮件看起来像@ developer.gserviceaccount.com

现在我们有了服务帐户,您需要允许此服务帐户访问Google Analytics中的个人资料/网站.

  • 登录Google Analytics.
  • 登录后,单击Admin屏幕上的bottem按钮.
  • 在管理员中,点击帐户下拉菜单,然后选择您希望服务帐户访问的帐户/网站,然后点击帐户部分下的"用户管理".
  • 输入为您的服务帐户生成的电子邮件地址,并为其提供读取和分析权限.
  • 对您希望服务有权访问的任何其他帐户/站点重复这些步骤.

现在,为服务帐户设置了通过API访问Google Analytics的设置,我们就可以开始编码了.

从NuGet获取此包:

Google.Apis.Analytics.v3客户端库

添加这些使用:

using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using System.Collections.Generic; 
using System.Linq;
Run Code Online (Sandbox Code Playgroud)

有些事情需要注意.

  • keyPath是您使用.p12文件扩展名下载的密钥文件的路径.
  • accountEmailAddress是我们之前收到的api电子邮件.
  • 范围是Google.Apis.Analytics.v3.AnalyticService类中的枚举,用于指定要使用的URL以进行授权(例如:)AnalyticsService.Scope.AnalyticsReadonly.
  • 应用程序名称是您选择的名称,告诉google api访问它的内容(也就是说:它可以是您选择的内容).

然后执行一些基本调用的代码如下.

public class GoogleAnalyticsAPI
{
    public AnalyticsService Service { get; set; }

    public GoogleAnalyticsAPI(string keyPath, string accountEmailAddress)
    {
        var certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);

        var credentials = new ServiceAccountCredential(
           new ServiceAccountCredential.Initializer(accountEmailAddress)
           {
               Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly }
           }.FromCertificate(certificate));

        Service = new AnalyticsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credentials,
                ApplicationName = "WorthlessVariable"
            });
    }

    public AnalyticDataPoint GetAnalyticsData(string profileId, string[] dimensions, string[] metrics, DateTime startDate, DateTime endDate)
    {
        AnalyticDataPoint data = new AnalyticDataPoint();
        if (!profileId.Contains("ga:"))
            profileId = string.Format("ga:{0}", profileId);

        //Make initial call to service.
        //Then check if a next link exists in the response,
        //if so parse and call again using start index param.
        GaData response = null;
        do
        {
            int startIndex = 1;
            if (response != null && !string.IsNullOrEmpty(response.NextLink))
            {
                Uri uri = new Uri(response.NextLink);
                var paramerters = uri.Query.Split('&');
                string s = paramerters.First(i => i.Contains("start-index")).Split('=')[1];
                startIndex = int.Parse(s);
            }

            var request = BuildAnalyticRequest(profileId, dimensions, metrics, startDate, endDate, startIndex);
            response = request.Execute();
            data.ColumnHeaders = response.ColumnHeaders;
            data.Rows.AddRange(response.Rows);

        } while (!string.IsNullOrEmpty(response.NextLink));

        return data;
    }

    private DataResource.GaResource.GetRequest BuildAnalyticRequest(string profileId, string[] dimensions, string[] metrics,
                                                                        DateTime startDate, DateTime endDate, int startIndex)
    {
        DataResource.GaResource.GetRequest request = Service.Data.Ga.Get(profileId, startDate.ToString("yyyy-MM-dd"),
                                                                            endDate.ToString("yyyy-MM-dd"), string.Join(",", metrics));
        request.Dimensions = string.Join(",", dimensions);
        request.StartIndex = startIndex;
        return request;
    }

    public IList<Profile> GetAvailableProfiles()
    {
        var response = Service.Management.Profiles.List("~all", "~all").Execute();
        return response.Items;
    }

    public class AnalyticDataPoint
    {
        public AnalyticDataPoint()
        {
            Rows = new List<IList<string>>();
        }

        public IList<GaData.ColumnHeadersData> ColumnHeaders { get; set; }
        public List<IList<string>> Rows { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

其他可以证明有用的链接:

Analytic API Explorer - 从Web查询API

Analytic API Explorer版本2 - 从Web查询API

维度和指标参考

希望这有助于将来尝试这样做的人.

  • 令人惊叹的帖子!我在Google .NET API汤中游泳后的圣杯.您是否有机会使用[Google.Apis.Oauth2.v2](http://www.nuget.org/packages/Google.Apis.Oauth2.v2/)?一旦我添加了电子邮件地址权限,我就会尝试一下.XD (7认同)
  • @craastad如果您在visual studio中搜索,该软件包称为Google API OAuth2 Client Library.如果您想从NuGets网站下载,请访问:http://www.nuget.org/packages/Google.Apis.Authentication/1.5.0-beta (2认同)
  • 干得好.感谢您浏览文档并提出这些内容. (2认同)

MoX*_*lod 31

我做了很多搜索,最后要么从多个地方查找代码,然后将自己的界面包裹起来,我想出了以下解决方案.不确定人们是否在这里粘贴了他们的全部代码,但我想为什么不为其他人节省时间:)

先决条件,您需要安装Google.GData.Client和google.gdata.analytics package/dll.

这是完成工作的主要类.

namespace Utilities.Google
{
    public class Analytics
    {
        private readonly String ClientUserName;
        private readonly String ClientPassword;
        private readonly String TableID;
        private AnalyticsService analyticsService;

        public Analytics(string user, string password, string table)
        {
            this.ClientUserName = user;
            this.ClientPassword = password;
            this.TableID = table;

            // Configure GA API.
            analyticsService = new AnalyticsService("gaExportAPI_acctSample_v2.0");
            // Client Login Authorization.
            analyticsService.setUserCredentials(ClientUserName, ClientPassword);
        }

        /// <summary>
        /// Get the page views for a particular page path
        /// </summary>
        /// <param name="pagePath"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <param name="isPathAbsolute">make this false if the pagePath is a regular expression</param>
        /// <returns></returns>
        public int GetPageViewsForPagePath(string pagePath, DateTime startDate, DateTime endDate, bool isPathAbsolute = true)
        {
            int output = 0;

            // GA Data Feed query uri.
            String baseUrl = "https://www.google.com/analytics/feeds/data";

            DataQuery query = new DataQuery(baseUrl);
            query.Ids = TableID;
            //query.Dimensions = "ga:source,ga:medium";
            query.Metrics = "ga:pageviews";
            //query.Segment = "gaid::-11";
            var filterPrefix = isPathAbsolute ? "ga:pagepath==" : "ga:pagepath=~";
            query.Filters = filterPrefix + pagePath;
            //query.Sort = "-ga:visits";
            //query.NumberToRetrieve = 5;
            query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            Uri url = query.Uri;
            DataFeed feed = analyticsService.Query(query);
            output = Int32.Parse(feed.Aggregates.Metrics[0].Value);

            return output;
        }

        public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate)
        {
            // GA Data Feed query uri.
            String baseUrl = "https://www.google.com/analytics/feeds/data";

            DataQuery query = new DataQuery(baseUrl);
            query.Ids = TableID;
            query.Dimensions = "ga:pagePath";
            query.Metrics = "ga:pageviews";
            //query.Segment = "gaid::-11";
            var filterPrefix = "ga:pagepath=~";
            query.Filters = filterPrefix + pagePathRegEx;
            //query.Sort = "-ga:visits";
            //query.NumberToRetrieve = 5;
            query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            Uri url = query.Uri;
            DataFeed feed = analyticsService.Query(query);

            var returnDictionary = new Dictionary<string, int>();
            foreach (var entry in feed.Entries)
                returnDictionary.Add(((DataEntry)entry).Dimensions[0].Value, Int32.Parse(((DataEntry)entry).Metrics[0].Value));

            return returnDictionary;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我用来包装它的接口和实现.

namespace Utilities
{
    public interface IPageViewCounter
    {
        int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true);
        Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate);
    }

    public class GooglePageViewCounter : IPageViewCounter
    {
        private string GoogleUserName
        {
            get
            {
                return ConfigurationManager.AppSettings["googleUserName"];
            }
        }

        private string GooglePassword
        {
            get
            {
                return ConfigurationManager.AppSettings["googlePassword"];
            }
        }

        private string GoogleAnalyticsTableName
        {
            get
            {
                return ConfigurationManager.AppSettings["googleAnalyticsTableName"];
            }
        }

        private Analytics analytics;

        public GooglePageViewCounter()
        {
            analytics = new Analytics(GoogleUserName, GooglePassword, GoogleAnalyticsTableName);
        }

        #region IPageViewCounter Members

        public int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true)
        {
            int output = 0;
            try
            {
                output = analytics.GetPageViewsForPagePath(relativeUrl, startDate, endDate, isPathAbsolute);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }

            return output;
        }

        public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate)
        {
            var input = analytics.PageViewCounts(pagePathRegEx, startDate, endDate);
            var output = new Dictionary<string, int>();

            foreach (var item in input)
            {
                if (item.Key.Contains('&'))
                {
                    string[] key = item.Key.Split(new char[] { '?', '&' });
                    string newKey = key[0] + "?" + key.FirstOrDefault(k => k.StartsWith("p="));

                    if (output.ContainsKey(newKey))
                        output[newKey] += item.Value;
                    else
                        output[newKey] = item.Value;
                }
                else
                    output.Add(item.Key, item.Value);
            }
            return output;
        }

        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是显而易见的东西 - 您必须将web.config值添加到应用程序配置或webconfig并调用IPageViewCounter.GetPageViewCount


小智 10

我希望只是为v3 Beta的答案添加评论,但代表点可以防止这种情况发生.但是,我认为其他人拥有这些信息会很好,所以这里是:

using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Services;
Run Code Online (Sandbox Code Playgroud)

这些名称空间在该帖子的整个代码中使用.我总是希望人们更频繁地张贴名字空间,我似乎花了很多时间寻找它们.我希望这可以为一些人节省几分钟的工作量.


Joh*_*ham 9

此答案适用于那些希望访问您自己的Google Analytics帐户并希望使用新的Analytics Reporting API v4的用户.

我最近写了一篇关于如何使用C#获取Google Analytics数据的博文.阅读那里的所有细节.

您首先需要在连接OAuth2或服务帐户之间进行选择.我假设您拥有Google Analytics帐户,因此您需要从Google API 凭据页面创建"服务帐户密钥" .

创建后,下载JSON文件并将其放入项目中(我将其放入我的App_Data文件夹中).

接下来,安装Google.Apis.AnalyticsReporting.v4 Nuget包.还安装了Newtonsoft的Json.NET.

在项目的某处包含此类:

public class PersonalServiceAccountCred
{
    public string type { get; set; }
    public string project_id { get; set; }
    public string private_key_id { get; set; }
    public string private_key { get; set; }
    public string client_email { get; set; }
    public string client_id { get; set; }
    public string auth_uri { get; set; }
    public string token_uri { get; set; }
    public string auth_provider_x509_cert_url { get; set; }
    public string client_x509_cert_url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是你一直在等待的东西:一个完整​​的例子!

string keyFilePath = Server.MapPath("~/App_Data/Your-API-Key-Filename.json");
string json = System.IO.File.ReadAllText(keyFilePath);

var cr = JsonConvert.DeserializeObject(json);

var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_email)
{
    Scopes = new[] {
        AnalyticsReportingService.Scope.Analytics
    }
}.FromPrivateKey(cr.private_key));

using (var svc = new AnalyticsReportingService(
    new BaseClientService.Initializer
    {
        HttpClientInitializer = xCred,
        ApplicationName = "[Your Application Name]"
    })
)
{
    // Create the DateRange object.
    DateRange dateRange = new DateRange() { StartDate = "2017-05-01", EndDate = "2017-05-31" };

    // Create the Metrics object.
    Metric sessions = new Metric { Expression = "ga:sessions", Alias = "Sessions" };

    //Create the Dimensions object.
    Dimension browser = new Dimension { Name = "ga:browser" };

    // Create the ReportRequest object.
    ReportRequest reportRequest = new ReportRequest
    {
        ViewId = "[A ViewId in your account]",
        DateRanges = new List() { dateRange },
        Dimensions = new List() { browser },
        Metrics = new List() { sessions }
    };

    List requests = new List();
    requests.Add(reportRequest);

    // Create the GetReportsRequest object.
    GetReportsRequest getReport = new GetReportsRequest() { ReportRequests = requests };

    // Call the batchGet method.
    GetReportsResponse response = svc.Reports.BatchGet(getReport).Execute();
}
Run Code Online (Sandbox Code Playgroud)

我们首先从JSON文件反序列化服务帐户密钥信息并将其转换为PersonalServiceAccountCred对象.然后,我们通过创建ServiceAccountCredential并连接到Google AnalyticsReportingService.然后,我们使用该服务准备一些基本过滤器以传递给API并发送请求.

最好在response声明变量的行上设置断点,按F10一次,然后将鼠标悬停在变量上,这样就可以看到哪些数据可供您在响应中使用.