使用 Google Analytics API 在 C# 中显示信息
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10306872/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Use Google Analytics API to show information in C#
提问by VinnyG
I been looking for a good solution all day but google evolve so fast that I can't find something working. What I want to do is that, I have a Web app that has an admin section where user need to be logged in to see the information. In this section I want to show some data from GA, like pageviews for some specific urls. Since it's not the user information that I'm showing but the google analytics'user I want to connect passing information (username/password or APIKey) but I can't find out how. All the sample I found use OAuth2 (witch, if I understand, will ask the visitor to log in using google).
我整天都在寻找一个好的解决方案,但谷歌发展得太快了,我找不到工作的东西。我想要做的是,我有一个 Web 应用程序,它有一个管理部分,用户需要在其中登录才能查看信息。在本节中,我想显示一些来自 GA 的数据,例如某些特定 url 的综合浏览量。由于我显示的不是用户信息,而是谷歌分析的用户,我想连接传递信息(用户名/密码或 APIKey),但我不知道如何连接。我发现的所有样本都使用 OAuth2(女巫,如果我理解,会要求访问者使用谷歌登录)。
What I found so far :
到目前为止我发现了什么:
- Google official Client Library for .Net : http://code.google.com/p/google-api-dotnet-client/, no sample for GA
- official developers help : https://developers.google.com/analytics/
- an other question with code on SO : Google Analytics API - Programmatically fetch page views in server sidebut I get a 403 when I try to authenticate
- some source that access the API : http://www.reimers.dk/jacob-reimers-blog/added-google-analytics-reader-for-netdownloaded the source but I can't figure out how it works
- this other question on SO : Google Analytics Access with C#but it does not help
- while writing this they suggest me this 09 old post Google Analytics API and .Net...
- .Net 的 Google 官方客户端库:http: //code.google.com/p/google-api-dotnet-client/,没有 GA 示例
- 官方开发人员帮助:https: //developers.google.com/analytics/
- 另一个关于 SO 代码的问题:Google Analytics API - 在服务器端以编程方式获取页面视图,但是当我尝试进行身份验证时得到 403
- 一些访问 API的来源:http: //www.reimers.dk/jacob-reimers-blog/added- google-analytics-reader-for- net下载了源代码,但我不知道它是如何工作的
- 关于 SO 的另一个问题:Google Analytics Access with C#但它没有帮助
- 在写这篇文章时,他们向我推荐了这篇 09 年的旧帖子Google Analytics API 和 .Net...
Maybe I'm just tired and that tomorrow it will be easy to find a solution but right now I need help!
也许我只是累了,明天很容易找到解决方案,但现在我需要帮助!
Thanks
谢谢
采纳答案by MoXplod
I did a lot of search and finally either looking up code from multiple places and then wrapping my own interface around it i came up with the following solution. Not sure if people paste their whole code here, but i guess why not save everyone else time :)
我做了很多搜索,最后要么从多个地方查找代码,然后围绕它包装我自己的界面,我想出了以下解决方案。不确定人们是否将他们的整个代码粘贴在这里,但我想为什么不节省其他人的时间:)
Pre-requisites, you will need to install Google.GData.Client and google.gdata.analytics package/dll.
先决条件,您需要安装 Google.GData.Client 和 google.gdata.analytics 包/dll。
This is the main class that does the work.
这是完成工作的主要类。
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;
}
}
}
And this is the interface and implementation that i use to wrap it up with.
这是我用来包装它的接口和实现。
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
}
}
And now the rest is the obvious stuff - you will have to add the web.config values to your application config or webconfig and call IPageViewCounter.GetPageViewCount
现在剩下的就是显而易见的东西了 - 您必须将 web.config 值添加到您的应用程序配置或 webconfig 并调用 IPageViewCounter.GetPageViewCount
回答by pharophy
I've setup something pretty similar to the above answer in a nuGet package. It does the following: - connects to a "Service Account" you set up in the API Console - Pulls any Google Analytics data you would like - Displays that data using Google's Charts API and it does all of this in a very easy to modify way. You can see more here: https://www.nuget.org/packages/GoogleAnalytics.GoogleCharts.NET/.
我在 nuGet 包中设置了与上述答案非常相似的内容。它执行以下操作: - 连接到您在 API 控制台中设置的“服务帐户” - 提取您想要的任何 Google Analytics 数据 - 使用 Google 的图表 API 显示该数据,并且它以非常容易修改的方式完成所有这些工作. 您可以在此处查看更多信息:https: //www.nuget.org/packages/GoogleAnalytics.GoogleCharts.NET/。
回答by Logan G.
It requires a bit of setup on the google side but it's actually quite simple. I will list step by step.
它需要在 google 端进行一些设置,但实际上非常简单。我会一步步列出来。
First you will need to create an application in the Google cloud console and enable the Analytics API.
首先,您需要在 Google 云控制台中创建一个应用程序并启用 Analytics API。
- Go to http://code.google.com/apis/console
- Select the drop down and create a project if you do not already have one
- Once the project is created click on services
- From here enable the Analytics API
- 转至http://code.google.com/apis/console
- 如果您还没有,请选择下拉菜单并创建一个项目
- 创建项目后,单击服务
- 从这里启用 Analytics API
Now that the Analytics API is enabled the next step will be to enable a service account to access your desired analytics profiles/sites. The service account will allow you to log in without having to prompt a user for credentials.
既然 Analytics API 已启用,下一步将是启用服务帐户以访问您所需的分析配置文件/站点。服务帐户将允许您登录而无需提示用户输入凭据。
- Go to http://code.google.com/apis/consoleand choose the project you created from the drop down.
- Next go to the "API Access" section and click the "Create another client id" button.
- In the Create Client ID window choose service account and click create client id.
- Download the public key for this account if it doesn't start the download automatically.You will need this later on when you code for authorization.
- Before exiting copy the service accounts auto generated email address as you will need this in the next step. The client email looks like @developer.gserviceaccount.com
- 转到http://code.google.com/apis/console并从下拉列表中选择您创建的项目。
- 接下来转到“API 访问”部分,然后单击“创建另一个客户端 ID”按钮。
- 在创建客户端 ID 窗口中选择服务帐户并单击创建客户端 ID。
- 如果此帐户没有自动开始下载,请下载此帐户的公钥。稍后您在进行授权编码时将需要它。
- 在退出之前复制服务帐户自动生成的电子邮件地址,因为您将在下一步中需要它。客户端电子邮件看起来像@developer.gserviceaccount.com
Now that we have a service account you will need to allow this service account to access to your profiles/sites in Google Analytics.
现在我们有一个服务帐户,您需要允许该服务帐户访问您在 Google Analytics 中的个人资料/网站。
- Log into Google Analytics.
- Once logged in click on the Admin button to the bottem left on the screen.
- In Admin click the account drop down and select the account/site you would like your service account to be able to access then click on "User Management" under the account section.
- Enter the email address that was generated for your service account and give it read and analyze permission.
- Repeat these steps for any other account/site you would like your service to have access to.
- 登录谷歌分析。
- 登录后,单击屏幕左侧底部的“管理”按钮。
- 在管理员中,单击帐户下拉菜单并选择您希望服务帐户能够访问的帐户/站点,然后单击帐户部分下的“用户管理”。
- 输入为您的服务帐户生成的电子邮件地址,并授予其读取和分析权限。
- 对您希望您的服务访问的任何其他帐户/站点重复这些步骤。
Now that the setup is done for the service account to access Google Analytics through the API we can start to code.
现在已经完成了服务帐户通过 API 访问 Google Analytics 的设置,我们可以开始编码了。
Get this package from NuGet:
从 NuGet 获取这个包:
Google.Apis.Analytics.v3 Client Library
Add these usings:
添加这些用途:
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;
Some things to note are.
需要注意的一些事情是。
- The
keyPathis the path to the key file you downloaded with a .p12 file extention. - The
accountEmailAddressis the api email we got earlier. - Scope is an Enum in the
Google.Apis.Analytics.v3.AnalyticServiceclass that dictates the url to use in order to authorize (ex:AnalyticsService.Scope.AnalyticsReadonly). - Application name is a name of your choosing that tells the google api what is accessing it (aka: it can be what ever you choose).
- 这
keyPath是您下载的带有 .p12 文件扩展名的密钥文件的路径。 - 这
accountEmailAddress是我们之前收到的 api 电子邮件。 - Scope 是
Google.Apis.Analytics.v3.AnalyticService类中的一个枚举,它指示要使用的 url 以进行授权(例如:)AnalyticsService.Scope.AnalyticsReadonly。 - 应用程序名称是您选择的名称,它告诉 google api 正在访问它的内容(又名:它可以是您选择的任何内容)。
Then the code to do some basic calls is as follows.
那么做一些基本调用的代码如下。
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; }
}
}
Other Links that will prove helpful:
其他有帮助的链接:
Analytic API Explorer - Query API From The Web
Analytic API Explorer version 2 - Query API From The Web
Analytic API Explorer 版本 2 - 从 Web 查询 API
Dimensions and Metrics Reference
Hopefully this helps someone trying to do this in the future.
希望这有助于将来尝试这样做的人。
回答by Jereme Guenther
I was hoping just to add a comment to the answer for v3 Beta, but rep points prevent that. However, I thought it would be nice for others to have this information so here it is:
我希望只是为 v3 Beta 的答案添加评论,但代表点阻止了这一点。但是,我认为其他人拥有这些信息会很好,所以这里是:
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Services;
These name spaces are used throughout the code in that post. I always wish people would post name spaces more often, I seem to spend a good bit of time looking for them. I hope this saves some people a few minutes of work.
在那篇文章的整个代码中都使用了这些命名空间。我总是希望人们更频繁地发布名称空间,我似乎花了很多时间寻找它们。我希望这可以为某些人节省几分钟的工作时间。
回答by Parth Mistry
Another Working Approach
另一种工作方法
Add below code in the ConfigAuth
在 ConfigAuth 中添加以下代码
var googleApiOptions = new GoogleOAuth2AuthenticationOptions()
{
AccessType = "offline", // can use only if require
ClientId = ClientId,
ClientSecret = ClientSecret,
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new Claim("Google_AccessToken", context.AccessToken));
if (context.RefreshToken != null)
{
context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken));
}
context.Identity.AddClaim(new Claim("GoogleUserId", context.Id));
context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToString()));
var expiresInSec = 10000;
context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToString()));
return Task.FromResult(0);
}
},
SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
};
googleApiOptions.Scope.Add("openid"); // Need to add for google+
googleApiOptions.Scope.Add("profile");// Need to add for google+
googleApiOptions.Scope.Add("email");// Need to add for google+
googleApiOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly");
app.UseGoogleAuthentication(googleApiOptions);
Add below code, name spaces and relative references
添加以下代码、命名空间和相关引用
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Responses;
using Google.Apis.Services;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using System;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
public class HomeController : Controller
{
AnalyticsService service;
public IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
public async Task<ActionResult> AccountList()
{
service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = await GetCredentialForApiAsync(),
ApplicationName = "Analytics API sample",
});
//Account List
ManagementResource.AccountsResource.ListRequest AccountListRequest = service.Management.Accounts.List();
//service.QuotaUser = "MyApplicationProductKey";
Accounts AccountList = AccountListRequest.Execute();
return View();
}
private async Task<UserCredential> GetCredentialForApiAsync()
{
var initializer = new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = ClientId,
ClientSecret = ClientSecret,
},
Scopes = new[] { "https://www.googleapis.com/auth/analytics.readonly" }
};
var flow = new GoogleAuthorizationCodeFlow(initializer);
var identity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ApplicationCookie);
if (identity == null)
{
Redirect("/Account/Login");
}
var userId = identity.FindFirstValue("GoogleUserId");
var token = new TokenResponse()
{
AccessToken = identity.FindFirstValue("Google_AccessToken"),
RefreshToken = identity.FindFirstValue("GoogleRefreshToken"),
Issued = DateTime.FromBinary(long.Parse(identity.FindFirstValue("GoogleTokenIssuedAt"))),
ExpiresInSeconds = long.Parse(identity.FindFirstValue("GoogleTokenExpiresIn")),
};
return new UserCredential(flow, userId, token);
}
}
Add this in the Application_Start() in Global.asax
在 Global.asax 的 Application_Start() 中添加这个
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
回答by Rakesh Dadamatti
Hope google will provide proper documentation someday. Here I am listing all the steps to integrate google analytics server side authentication in ASP.NET C#.
希望谷歌有一天能提供适当的文档。在这里,我列出了在 ASP.NET C# 中集成谷歌分析服务器端身份验证的所有步骤。
Step 1: Create a project in google console
第 1 步:在 google 控制台中创建一个项目
Goto the link https://console.developers.google.com/iam-admin/projectsand create a project by clicking on "Create Project" button and provide project name in the pop up window and submit it.
转到链接https://console.developers.google.com/iam-admin/projects并通过单击“创建项目”按钮创建一个项目,并在弹出窗口中提供项目名称并提交。
Step 2: Create credentials and service account
第 2 步:创建凭据和服务帐户
After creation of the project, you will be redirected to "API Manager" page. Click on credentials and press "Create Credentials" button. select "service account key" from dropdown you will be redirected to next page. In the service account drop down, select "New service account". Fill in the service account name and download the p12 key. It will have p12 extension. you will get a popup having a password "notasecret" which is default and your private key will be downloaded.
创建项目后,您将被重定向到“API 管理器”页面。单击凭据,然后按“创建凭据”按钮。从下拉列表中选择“服务帐户密钥”,您将被重定向到下一页。在服务帐户下拉列表中,选择“新建服务帐户”。填写服务账号名,下载p12密钥。它将具有 p12 扩展名。您将看到一个弹出窗口,其中包含默认密码“ notasecret”,您的私钥将被下载。
Step 3: Create 0auth client ID
第 3 步:创建 0auth 客户端 ID
click on the "create credentials" dropdown and select "0auth client ID" you will be redirected to "0auth consent screen" tab. provide a random name in the project name textbox. select application type as "Web application" and click create button. Copy the generated client ID in a notepad.
单击“创建凭据”下拉菜单并选择“0auth 客户端 ID”,您将被重定向到“0auth 同意屏幕”选项卡。在项目名称文本框中提供一个随机名称。选择应用程序类型为“Web 应用程序”,然后单击创建按钮。在记事本中复制生成的客户端 ID。
Step 4: Enable the APIs
步骤 4:启用 API
On the left side click on the "Overview" tab and select "Enabled APIs" from the horizontal tab. In the search bar search for "Analytics API" click on the dropdown and press "Enable" button. Now again search for "Analytics Reporting V4" and enable it.
在左侧单击“概览”选项卡,然后从水平选项卡中选择“启用的 API”。在搜索栏中搜索“Analytics API”,单击下拉菜单,然后按“启用”按钮。现在再次搜索“Analytics Reporting V4”并启用它。
Step 5: Install nuget packages
第五步:安装nuget包
In visual studio, Go to Tools > Nuget Package Manager > Package Manager Console. Copy paste the below code in the console to install the nuget packages.
在 Visual Studio 中,转到“工具”>“Nuget 包管理器”>“包管理器控制台”。将以下代码复制粘贴到控制台中以安装 nuget 包。
Install-Package Google.Apis.Analytics.v3
安装包 Google.Apis.Analytics.v3
Install-Package DotNetOpenAuth.Core -Version 4.3.4.13329
安装包 DotNetOpenAuth.Core -版本 4.3.4.13329
The above two packages are Google analytics and DotNetOpenAuth nuget packages.
以上两个包分别是 Google Analytics 和 DotNetOpenAuth nuget 包。
Step 6: Provide 'View and Analyze' permission to service account
第 6 步:为服务帐户提供“查看和分析”权限
Go to google analytics account and click on "Admin" tab and select "User Management" from left menus,select a domain of which you want to access analytics data and insert the service account email id under it and select "Read and Analyze" permission from the dropdown. Service account email id looks like ex: [email protected].
转到谷歌分析帐户并单击“管理”选项卡,然后从左侧菜单中选择“用户管理”,选择要访问分析数据的域并在其下插入服务帐户电子邮件 ID,然后选择“读取和分析”权限从下拉菜单中。服务帐户电子邮件 ID 类似于:[email protected]。
Working Code
工作代码
FRONT END CODE:
前端代码:
Copy and paste the below analytics embed script in your front end or else you can get this code from google analytics documentation page also.
将以下分析嵌入脚本复制并粘贴到您的前端,否则您也可以从谷歌分析文档页面获取此代码。
<script>
(function (w, d, s, g, js, fs) {
g = w.gapi || (w.gapi = {}); g.analytics = { q: [], ready: function (f) { this.q.push(f); } };
js = d.createElement(s); fs = d.getElementsByTagName(s)[0];
js.src = 'https://apis.google.com/js/platform.js';
fs.parentNode.insertBefore(js, fs); js.onload = function () { g.load('analytics'); };
}(window, document, 'script'));</script>
Paste the below code in the body tag of your front end page.
将以下代码粘贴到前端页面的 body 标签中。
<asp:HiddenField ID="accessToken" runat="server" />
<div id="chart-1-container" style="width:600px;border:1px solid #ccc;"></div>
<script>
var access_token = document.getElementById('<%= accessToken.ClientID%>').value;
gapi.analytics.ready(function () {
/**
* Authorize the user with an access token obtained server side.
*/
gapi.analytics.auth.authorize({
'serverAuth': {
'access_token': access_token
}
});
/**
* Creates a new DataChart instance showing sessions.
* It will be rendered inside an element with the id "chart-1-container".
*/
var dataChart1 = new gapi.analytics.googleCharts.DataChart({
query: {
'ids': 'ga:53861036', // VIEW ID <-- Goto your google analytics account and select the domain whose analytics data you want to display on your webpage. From the URL ex: a507598w53044903p53861036. Copy the digits after "p". It is your view ID
'start-date': '2016-04-01',
'end-date': '2016-04-30',
'metrics': 'ga:sessions',
'dimensions': 'ga:date'
},
chart: {
'container': 'chart-1-container',
'type': 'LINE',
'options': {
'width': '100%'
}
}
});
dataChart1.execute();
/**
* Creates a new DataChart instance showing top 5 most popular demos/tools
* amongst returning users only.
* It will be rendered inside an element with the id "chart-3-container".
*/
});
</script>
You can also get your View ID from https://ga-dev-tools.appspot.com/account-explorer/
您还可以从https://ga-dev-tools.appspot.com/account-explorer/获取您的视图 ID
BACK END CODE:
后端代码:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web.Script.Serialization;
using System.Net;
using System.Text;
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 Google.Apis.Util;
using DotNetOpenAuth.OAuth2;
using System.Security.Cryptography;
namespace googleAnalytics
{
public partial class api : System.Web.UI.Page
{
public const string SCOPE_ANALYTICS_READONLY = "https://www.googleapis.com/auth/analytics.readonly";
string ServiceAccountUser = "[email protected]"; //service account email ID
string keyFile = @"D:\key.p12"; //file link to downloaded key with p12 extension
protected void Page_Load(object sender, EventArgs e)
{
string Token = Convert.ToString(GetAccessToken(ServiceAccountUser, keyFile, SCOPE_ANALYTICS_READONLY));
accessToken.Value = Token;
var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable);
var credentials = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(ServiceAccountUser)
{
Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly }
}.FromCertificate(certificate));
var service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "Google Analytics API"
});
string profileId = "ga:53861036";
string startDate = "2016-04-01";
string endDate = "2016-04-30";
string metrics = "ga:sessions,ga:users,ga:pageviews,ga:bounceRate,ga:visits";
DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics);
GaData data = request.Execute();
List<string> ColumnName = new List<string>();
foreach (var h in data.ColumnHeaders)
{
ColumnName.Add(h.Name);
}
List<double> values = new List<double>();
foreach (var row in data.Rows)
{
foreach (var item in row)
{
values.Add(Convert.ToDouble(item));
}
}
values[3] = Math.Truncate(100 * values[3]) / 100;
txtSession.Text = values[0].ToString();
txtUsers.Text = values[1].ToString();
txtPageViews.Text = values[2].ToString();
txtBounceRate.Text = values[3].ToString();
txtVisits.Text = values[4].ToString();
}
public static dynamic GetAccessToken(string clientIdEMail, string keyFilePath, string scope)
{
// certificate
var certificate = new X509Certificate2(keyFilePath, "notasecret");
// header
var header = new { typ = "JWT", alg = "RS256" };
// claimset
var times = GetExpiryAndIssueDate();
var claimset = new
{
iss = clientIdEMail,
scope = scope,
aud = "https://accounts.google.com/o/oauth2/token",
iat = times[0],
exp = times[1],
};
JavaScriptSerializer ser = new JavaScriptSerializer();
// encoded header
var headerSerialized = ser.Serialize(header);
var headerBytes = Encoding.UTF8.GetBytes(headerSerialized);
var headerEncoded = Convert.ToBase64String(headerBytes);
// encoded claimset
var claimsetSerialized = ser.Serialize(claimset);
var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized);
var claimsetEncoded = Convert.ToBase64String(claimsetBytes);
// input
var input = headerEncoded + "." + claimsetEncoded;
var inputBytes = Encoding.UTF8.GetBytes(input);
// signature
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
var cspParam = new CspParameters
{
KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName,
KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2
};
var aescsp = new RSACryptoServiceProvider(cspParam) { PersistKeyInCsp = false };
var signatureBytes = aescsp.SignData(inputBytes, "SHA256");
var signatureEncoded = Convert.ToBase64String(signatureBytes);
// jwt
var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded;
var client = new WebClient();
client.Encoding = Encoding.UTF8;
var uri = "https://accounts.google.com/o/oauth2/token";
var content = new NameValueCollection();
content["assertion"] = jwt;
content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content));
var result = ser.Deserialize<dynamic>(response);
object pulledObject = null;
string token = "access_token";
if (result.ContainsKey(token))
{
pulledObject = result[token];
}
//return result;
return pulledObject;
}
private static int[] GetExpiryAndIssueDate()
{
var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.UtcNow;
var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;
return new[] { iat, exp };
}
}
}
回答by John Washam
This answer is for those of you who want access to your own Analytics account and want to use the new Analytics Reporting API v4.
此答案适用于希望访问自己的 Analytics 帐户并希望使用新的Analytics Reporting API v4 的人。
I recently wrote a blog postabout how to get Google Analytics data using C#. Read there for all the details.
我最近写了一篇关于如何使用 C# 获取 Google Analytics 数据的博客文章。阅读那里的所有细节。
You first need to choose between connecting with OAuth2 or a Service Account. I'll assume you own the Analytics account, so you need to create a "Service account key" from the Google APIs Credentialspage.
您首先需要在连接 OAuth2 或服务帐户之间进行选择。我假设您拥有 Google Analytics(分析)帐户,因此您需要从 Google API凭据页面创建一个“服务帐户密钥” 。
Once you create that, download the JSON file and put it in your project (I put mine in my App_Datafolder).
创建后,下载 JSON 文件并将其放入您的项目中(我将我的放在我的App_Data文件夹中)。
Next, install the Google.Apis.AnalyticsReporting.v4Nuget package. Also install Newtonsoft's Json.NET.
接下来,安装Google.Apis.AnalyticsReporting.v4Nuget 包。还要安装 Newtonsoft 的Json.NET。
Include this class somewhere in your project:
在你的项目中的某个地方包含这个类:
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; }
}
And here's what you've been waiting for: a full example!
这就是你一直在等待的:一个完整的例子!
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();
}
We start by deserializing the service account key information from the JSON file and convert it to a PersonalServiceAccountCredobject. Then, we create the ServiceAccountCredentialand connect to Google via the AnalyticsReportingService. Using that service, we then prepare some basic filters to pass to the API and send off the request.
我们首先从 JSON 文件反序列化服务帐户密钥信息并将其转换为PersonalServiceAccountCred对象。然后,我们创建ServiceAccountCredential并通过AnalyticsReportingService. 使用该服务,我们然后准备一些基本过滤器以传递给 API 并发送请求。
It's probably best to set a breakpoint on the line where the responsevariable is declared, press F10 once, then hover over the variable, so you can see what data is available for you to use in the response.
最好在response声明变量的行上设置一个断点,按一次 F10,然后将鼠标悬停在变量上,这样您就可以看到哪些数据可供您在响应中使用。

