6

複数のページで構成されるWebアプリケーションがあります。ウェブアプリケーションドメインをGoogleアナリティクスに登録し、ページビューのトラッキングが正常に機能しました(アナリティクスパネルでは、各ページのページビューを確認できます)。ここでは、このページビューの情報をDB内のバックエンドに保存する必要があります。そこで、毎日1回実行されるバックエンドプロセスを作成し、Analytics APIからページビューを取得したいと考えています。GoogleアナリティクスAPI - サーバー側でページビューをプログラムで取得します

これはもちろんコードで行う必要があります。初期の調査から、Analytics APIにアクセスするには、認証プロセスが行われなければならないと考えられます。つまり、ユーザーがIDとパスワードを入力する必要があります。

質問は、コードでのみ行うことができますか?

答えて

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

日付パラメータに先行する0を書き込むことが重要です。 2011-07-01は動作しますが、2011-07-1は動作しません。先頭の0を使用しないと、400の不正な要求エラーが発生します。 – Thijs

+0

@Thijsはい、私はこのことについて私の頭を叩いていました。私はこのコードを使い、endDateをDateTime.Nowに設定しました。しかし突然、ある日、それは動作を停止しました。これを理解するのに数時間かかりました。 DateTime.Now.ToString( "yyyy-MM-dd")を使用します。これを解決しました。 –

+0

式に一致する1ページまたはすべてのページのページビューを取得するにはどうすればよいですか? – VinnyG

関連する問題