给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 0
PoorBest 
Written by xlingfairy
Thursday, 07 May 2009 21:55
首先,你需要一个能访问 analytics 的账号。
其次,这个账号要能读某个 profile 。
Google 提供了三种登陆 Google 账号的方法。AuthSub Proxy Authentication, OAuth Authentication, Client Login
这里我使用了 Client Login 方法。前两种没有过多研究。
Client Login 要求把账户名(Email) 和 密码 还有一些其它的信息一起发送(POST)到GOOGLE的接口.
在PHP中,要POST数据到服务器,一般用 socket 方法。在C#里,我试图也用 Socket 方法去请求,但是行不通,因为 要请求的地址是 ssl的(https 443端口),socket 连接到服务器之后,在 receive 的时候,一直接提示以中断连接之类的错误。百度查了查,说C#自带 socket 没有处理 ssl 的能力,需要第三放的  SSLSocket. 但是C# 里的 HttpWebRequest 可以很容易的做到。
Client Login 的接口地址是:
https://www.google.com/accounts/ClientLogin
登陆成功后,google 会返回几个参数给你,其中有个 Auth, 这个Auth 需要保存下来,后面的每次请求都需要使用它。
下面代码中的 service 是一个固定的值,不改。source 随便。返回的数据里,最后一个就是 Auth
  public static string token = "";
  
  public static void Login(){
   string accountType = "accountType";
   string email = "your account email";
   string pwd = "your password";
   string service = "analytics";
   string source = "dajiaozi-test-1";
   
   string postData = "accountType=" + accountType
       + "&Email=" + email
       + "&Passwd=" + pwd
       + "&service=" + service
       + "&source=" + source;
   
   byte[] bPostData = Encoding.ASCII.GetBytes(postData);
   
   HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/accounts/ClientLogin");
   req.Method = "POST";
   req.ContentType = "application/x-www-form-urlencoded";
   req.ContentLength = bPostData.Length;
   
   Stream reqStream = req.GetRequestStream();
   reqStream.Write(bPostData,0,bPostData.Length);
   reqStream.Close();
   
   HttpWebResponse rep = (HttpWebResponse)req.GetResponse();
   StreamReader repStream = new StreamReader(rep.GetResponseStream(),Encoding.UTF8);
   string ctx = repStream.ReadToEnd();
   
   token = Regex.Split(ctx,"Auth=",RegexOptions.IgnoreCase)[1];
   
   //Console.WriteLine(token);
   //Console.WriteLine(ctx);
  }
 

下面代码里的 gaId 就是 profileID,可以从这个地址里取得:
https://www.google.com/analytics/reporting/?reset=1&id=xxx&pdr=20090406-20090506
就是那个 id = xxx
dimensions 是查询哪个功能,ga:pagePath 就是页面地址。在Analytics 里就是每个页面的详细报表。
metrics 指出要查出哪些数据,ga:newVisits:新访数,ga:pageviews:综合访问量, ga:uniquePageviews:唯一访问量。
startDate和endDate 就不用说了吧。
filter 是过滤,由于 filder 是请求里的一个参数,所以要把 filter 里的比较符号进行转意。
retailerID 是我要过滤的内容,查找 ga:pagePath 里包含 rid=51 的所有记录。
req.Headers.Add("Authorization","GoogleLogin auth=" + token);
GoogleLogin auth 所指的那个 token 就是前面取出的那个 token
  public static void GetReportData(){
   int retailerID = 51;
   int gaId = 3879045;
   string dimensions = "ga:pagePath";
   string metrics = "ga:newVisits,ga:pageviews,ga:uniquePageviews";
   string sort = "ga:pagePath,ga:uniquePageviews,ga:pageviews,ga:newVisits";
   string startDate = "2009-04-01";
   string endDate = "2009-04-30";
   string filter = "ga:pagePath" + Uri.EscapeDataString("=~&") + "rid" + Uri.EscapeDataString("=") + retailerID;
   
   //HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create("https://www.google.com/analytics/feeds/data?ids=ga:" + gaId + "&dimensions="+ dimensions +"&metrics="+ metrics +"&sort="+ sort +"&start-date="+startDate+"&end-date=" + endDate);
   HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create("https://www.google.com/analytics/feeds/data?ids=ga:" + gaId + "&dimensions="+ dimensions +"&metrics="+ metrics +"&filters="+ filter +"&sort="+ sort +"&start-date="+startDate+"&end-date=" + endDate);
   req.Headers.Add("Authorization","GoogleLogin auth=" + token);
   
   HttpWebResponse rep = (HttpWebResponse) req.GetResponse();
   StreamReader repStream = new StreamReader(rep.GetResponseStream(),Encoding.UTF8);
   string ctx = repStream.ReadToEnd();
   //Console.WriteLine(ctx);
   
   if(File.Exists("report.xml")){
    File.Delete("report.xml");
   }
   
   StreamWriter sw = new StreamWriter("report.xml");
   sw.Write(ctx);
   sw.Flush();
   sw.Close();
   
//   XmlDocument doc = new XmlDocument();
//   XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
//   xnm.AddNamespace("dxp","
http://schemas.google.com/analytics/2009");
//   doc.Load(rep.GetResponseStream());
//   XmlNode node = doc.SelectSingleNode("//dxp:aggregates/dxp:metric[@name='ga:uniquePageviews']",xnm);
//   Console.WriteLine("Unique Views: {0}",node.Attributes.GetNamedItem("value").Value);
//   
//   node = doc.SelectSingleNode("//dxp:aggregates/dxp:metric[@name='ga:pageviews']",xnm);
//   Console.WriteLine("Page Views:{0}",node.Attributes.GetNamedItem("value").Value);
  }

下面这段是取出账户信息的,这里用处不大。同样注意那个 token

  public static void GetAccountData(){
   HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create("https://www.google.com/analytics/feeds/accounts/default");
   req.Headers.Add("Authorization","GoogleLogin auth=" + token);
   
   HttpWebResponse rep = (HttpWebResponse)req.GetResponse();
   StreamReader repStream = new StreamReader(rep.GetResponseStream(),Encoding.UTF8);
   string ctx = repStream.ReadToEnd();
   //Console.WriteLine(ctx);
  }
 
更多请参考:
Last Updated ( Thursday, 07 May 2009 22:00 )
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 130
Web Links : 7
Content View Hits : 99673

Links