2014-02-19 2 views
0

Я пытаюсь извлечь некоторые данные из API Google Analytics. Однако я получаю ошибку 403, когда я запустить приложение поговорку - выполнение запроса не удалось: https://www.google.com/analytics/feeds/data?ids=ga:12345678&dimensions=ga:date&metrics=ga:visits&start-date=2014-02-16&end-date=2014-02-19&sort=ga:dayИзвлечение данных из Google Analytics? Ошибка 403

Я не уверен, что если что-то не так с кодом или URL?

Эта строка вызывает ошибку:

return service.Query(dataQuery); 

Это ошибка в браузере:

The remote server returned an error: (403) Forbidden.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Сведения об исключении: System.Net.WebException: Удаленный сервер возвращается error: (403) Запрещено.

Analytics класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Google.GData.Analytics; 
using GoogleChartSharp; 
using Nop.Admin.Models; 

namespace Nop.Web.Models 
{ 
    public static class Analytics 
    {  
     private const int IMAGE_WIDTH = 900; 
     private const int IMAGE_HEIGHT = 200; 
     private const string DATAFEED_URL = "https://www.google.com/analytics/feeds/data?ids=ga:12345678&dimensions=ga:date&metrics=ga:visits&start-date=2014-02-16&end-date=2014-02-19";  
     private const string USERNAME = "[email protected]"; 
     private const string PASSWORD = "mypassword!"; 
     private const string PROFILE_ID = "ga:12345678";    

     private static DataFeed AnalyticsVisitorsThisMonth() 
     { 
      // Google Analytics Service. The name dosnt mather. 
      var service = new AnalyticsService("WebSiteAnalytics"); 

      // Add your credentials 
      service.setUserCredentials(USERNAME, PASSWORD); 

      // The Data Query (What to fetch from google analytics) 
      // Read more about it here: http://code.google.com/intl/sv-SE/apis/analytics/ 
      var dataQuery = new DataQuery(DATAFEED_URL) 
      { 
       Ids = PROFILE_ID, 
       Metrics = "ga:visits", 
       Sort = "ga:day", 
       Dimensions = "ga:day", 
       GAStartDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToString("yyyy-MM-dd"), 
       GAEndDate = DateTime.Now.ToString("yyyy-MM-dd") 
      }; 

      return service.Query(dataQuery); 
     } 


     private static int[] FixChartData(List<int> data, out int iMax) 
     { 
      List<int> chartData = new List<int>(); 

      iMax = data.Max(); 
      iMax = (int)(Math.Ceiling(iMax/10.0d) * 10); 

      foreach (var i in data) 
      { 
       chartData.Add((int)(((double)61/(double)iMax) * i)); 
      } 

      for (int i = chartData.Count; i < 32; i++) 
      { 
       chartData.Add(0); 
      } 
      return chartData.ToArray(); 
     } 


     public static string VisitorsThisMonth() 
     { 
      // Fetch the datafeed from google analytics 
      DataFeed df = AnalyticsVisitorsThisMonth(); 

      List<int> data = new List<int>(); 
      int[] chartData; 
      int iMax = 1; 

      // Create a list of values 
      foreach (var ae in df.Entries) 
      { 
       data.Add(int.Parse(((DataEntry)(ae)).Metrics[0].Value)); 
      } 

      // Fix the data (max value = 61) and add coming days of the month. 
      chartData = FixChartData(data, out iMax); 

      // Create the chart, here you can laborite yourself 
      LineChart chart = new LineChart(IMAGE_WIDTH, IMAGE_HEIGHT, LineChartType.SingleDataSet); 
      chart.SetData(chartData.ToArray()); 
      chart.AddFillArea(new FillArea("ACC3FF", 0)); 
      chart.SetDatasetColors(new string[] { "000000" }); 
      chart.SetLegend(new string[] { "Visitors" }); 

      chart.SetTitle("Visitors this month", "000000", 14); 


      ChartAxis leftAxis = new ChartAxis(ChartAxisType.Left); 
      leftAxis.SetRange(0, (int)(Math.Ceiling(iMax/10.0d) * 10)); 
      chart.AddAxis(leftAxis); 

      ChartAxis bottomAxis = new ChartAxis(ChartAxisType.Bottom); 
      bottomAxis.SetRange(1, 31); 
      chart.AddAxis(bottomAxis); 

      return chart.GetUrl(); 
     } 

    } 
} 

ShopStatisticsController: вид

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Nop.Admin.Models.ShopStatistics; 
using Google.GData.Analytics; 
using GoogleChartSharp; 
using Nop.Web.Models; 

namespace Nop.Admin.Controllers 
{ 

    public class ShopStatisticsController : Controller 
    { 
     // 
     // GET: /ShopStatistics/ 

     public ActionResult Company() 
     { 
      return View(); 
     } 

    } 
} 

Компания:

@using Telerik.Web.Mvc.UI 
@using GoogleAnalyticsTracker; 
@using Google; 
@using GoogleAnalyticsTracker.Web.Mvc; 
@{ 
    ViewBag.Title = "Company"; 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
} 

<h2>Company</h2> 


<img src="@Nop.Web.Models.Analytics.VisitorsThisMonth()" alt="Visitors this month" /> 

ответ

1

403 означает, что вы, вероятно, не имеют права на чтение данных. Если вы уверены, что используете правильное имя пользователя/пароль, убедитесь, что идентификатор профиля также верен.

При входе в аналитике, ваш URL выглядит что-то вроде https://www.google.com/analytics/web/?hl=en-GB#home/aXXXXXXXXwYYYYYYYYpZZZZZZZZ/

Убедитесь, что номер, который вы назначены profile_id это число после того, как «р» («га: ZZZZZZZZ» в моем случае).

Если это не поможет вам, я рекомендую вам перейти на аутентификацию OAuth, поскольку старый способ, которым вы пользуетесь, устарел от Google и не гарантированно работает.

+0

Если я перейти к аутентификации OAuth может я использовать один и тот же код, я могу просто изменить URL? Я также зарегистрировал OAuth и имею учетные данные, браузер, serverkey и т. Д., Если это актуально. Я скопировал числа после «p» в URL-адресе Google Analytics, но это не помогло. Ошибка остается. – koffe14

+0

@KristofferAndersson Нет, вы не можете использовать тот же код для OAuth, вы можете попробовать код, отправленный DalmTo, кажется упрощенным, но он может работать. Если это не поможет, я могу опубликовать рабочий код из моего проекта. –

0

Я не верю, что для входа в систему с помощью Google Analytics вам необходимо использовать oauth2. Код выглядит примерно так.

UserCredential credential; 
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
      new ClientSecrets { ClientId = "YourClientId", ClientSecret = "YourClientSecret" }, 
      new[] { AnalyticsService.Scope.AnalyticsReadonly}, 
      "user", 
      CancellationToken.None, 
      new FileDataStore("Drive.Auth.Store")).Result; } 

После того как вы аутентификации вам нужно только создать AnaltyicsService все ваши запросы затем пойти, хотя эту услугу.

AnalyticsService service = new AnalyticsService(
          new BaseClientService.Initializer() { 
          HttpClientInitializer = credential, 
          ApplicationName = "Analytics API sample", }); 

Google Analtyics C# tutorial

+0

Спасибо. Я пробую это сейчас, не могли бы вы помочь мне предоставить правильные ссылки/пространства имен для этого учебника. Борясь с этим атм. – koffe14

+0

Я в чате в течение следующего часа или около того. http://chat.stackoverflow.com/rooms/7/c. Я могу помочь вам заставить его работать. У меня есть только частичный образец проекта. – DaImTo

+0

Должен ли я изменить «пользователь» с именем пользователя google accaont и ApplicationName с именем моего локального приложения? Или достаточно ли заполнять ClientId и Client Secret? Спасибо – koffe14

Смежные вопросы