Vin*_*nyG 50 .net c# google-api google-analytics-api
我一整天都在寻找一个好的解决方案,但谷歌进化得如此之快,以至于找不到合适的东西.我想要做的是,我有一个Web应用程序,其中有一个管理部分,用户需要登录才能查看信息.在本节中,我想显示来自GA的一些数据,例如某些特定网址的综合浏览量.因为它不是用户信息我展示,但谷歌analytics'user我想连接传递信息(用户名/密码或APIKey),但我不能找出如何.我发现的所有样本都使用了OAuth2(如果我理解的话,会要求访问者使用谷歌登录).
到目前为止我发现了什么:
也许我只是累了,明天很容易找到解决方案,但现在我需要帮助!
谢谢
Log*_* G. 83
它需要在谷歌方面进行一些设置,但实际上非常简单.我将逐步列出.
首先,您需要在Google云控制台中创建应用程序并启用Analytics API.
现在启用了Analytics API,下一步将是启用服务帐户以访问所需的分析配置文件/站点.服务帐户将允许您登录而无需提示用户输入凭据.
现在我们有了服务帐户,您需要允许此服务帐户访问Google Analytics中的个人资料/网站.
现在,为服务帐户设置了通过API访问Google Analytics的设置,我们就可以开始编码了.
从NuGet获取此包:
添加这些使用:
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.然后执行一些基本调用的代码如下.
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
希望这有助于将来尝试这样做的人.
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)
这些名称空间在该帖子的整个代码中使用.我总是希望人们更频繁地张贴名字空间,我似乎花了很多时间寻找它们.我希望这可以为一些人节省几分钟的工作量.
此答案适用于那些希望访问您自己的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一次,然后将鼠标悬停在变量上,这样就可以看到哪些数据可供您在响应中使用.
| 归档时间: |
|
| 查看次数: |
39608 次 |
| 最近记录: |