6

Mamy aplikację internetową składającą się z kilku stron. Zarejestrowaliśmy domenę aplikacji internetowej w Google Analytics i śledzenie wyświetleń stron zgodnie z oczekiwaniami (w panelu Analytics widać wyświetlenia stron dla każdej strony). Teraz chcemy, aby informacje o tej stronie były przechowywane na zapleczu wewnątrz naszego DB. Dlatego chcemy utworzyć proces back-end, który będzie uruchamiany raz dziennie i pobierać wyświetlenia strony z interfejsu Analytics API.Google Analytics API - programowo pobierz widoki strony po stronie serwera

Jest to oczywiście konieczne w kodzie. Z początkowych badań wynika, że ​​aby uzyskać dostęp do interfejsu API Analytics, musi nastąpić proces uwierzytelniania, co oznacza, że ​​użytkownik musi wpisać identyfikator i hasło.

Pytanie brzmi: czy można to zrobić tylko za pomocą kodu?

Odpowiedz

9
//-------------- Get Auth Token ------------------- 

    WebClient webClient = new WebClient(); 
    NameValueCollection data = new NameValueCollection(); 
    data.Add("accountType", "GOOGLE"); 
    data.Add("Email", "[email protected]"); 
    data.Add("Passwd", "xxxx");//Passwd, not a misspell. 
    data.Add("service", "analytics"); 
    data.Add("source", "xxxx-xxxx-xx");//Could be anything. 

    byte[] bytes = webClient.UploadValues("https://www.google.com/accounts/ClientLogin", "POST", data); 
    string tokens = Encoding.UTF8.GetString(bytes); 
    string authToken = extractAuthToken(tokens); 

    //-------------- Get page views ------------------- 

    string feed = "https://www.google.com/analytics/feeds/data"; 

    //Required: 
    string ids = "ga:xxxx"; 
    string metrics = "ga:pageviews"; 
    string startDate = "2011-06-25"; 
    string endDate = "2011-07-25"; 

    //Optional: 
    string dimensions = "ga:pagePath"; 
    string sort = "-ga:pageviews";    

    string feedUrl = string.Format("{0}?ids={1}&dimensions={2}&metrics={3}&sort={4}&start-date={5}&end-date={6}", 
     feed, ids, dimensions, metrics, sort, startDate, endDate); 

    webClient.Headers.Add("Authorization", "GoogleLogin " + authToken); 
    string result = webClient.DownloadString(feedUrl); 

    //-------------- Extract data from xml ------------------- 

    XDocument xml = XDocument.Parse(result); 
    var ns1 = "{http://www.w3.org/2005/Atom}"; 
    var ns2 = "{http://schemas.google.com/analytics/2009}"; 

    var q = from entry in xml.Descendants() 
      where entry.Name == ns1 + "entry" 
      select new 
      { 
       PagePath = entry.Element(ns2 + "dimension").Attribute("value").Value, 
       Views = entry.Element(ns2 + "metric").Attribute("value").Value 
      }; 

    //-------------- Do something with data ------------------- 
    foreach (var page in q) 
    { 
     Debug.WriteLine(page.PagePath + " " + page.Views);     
    } 

    //-------------- Help Method ------------------- 
    private string extractAuthToken(string data) 
    {   
     var tokens = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);    
     return tokens.Where(token => token.StartsWith("Auth=")).Single(); 
    } 
+0

Ważne jest, aby pisać wiodące liczby 0 w parametrach daty. 2011-07-01 DZIAŁA, ale 2011-07-1 NIE BĘDZIE. Nieużywanie wiodących zer spowoduje błąd błędu o 400 nieprawidłowych żądań. – Thijs

+0

@Thijs Tak, waliłem głową o ten. Używałem tego kodu i ustawiłem datę zakończenia na DateTime.Now. Ale nagle pewnego dnia przestał działać. Zajęło mi to kilka godzin, żeby to zrozumieć. Używanie DateTime.Now.ToString ("rrrr-MM-dd"); rozwiązał to. –

+0

Jak uzyskać odsłonę pojedynczej strony lub wszystkich stron pasujących do wyrażenia? – VinnyG