۱۳۸۸/۰۲/۰۸

استفاده از Google Analytics API در دات نت فريم ورك


بالاخره گوگل كار تهيه API مخصوص ابزار Analytics خود را به پايان رساند و اكنون برنامه نويس‌ها مي‌توانند همانند ساير سرويس‌هاي گوگل از اين ابزار گزارشگيري نمايند.
خلاصه كاربردي اين API ، دو صفحه تعاريف پروتكل (+) و ريز مواردي (+) است كه مي‌توان گزارشگيري نمود.
هنوز كتابخانه google-gdata جهت استفاده از اين API به روز رساني نشده است؛ بنابراين در اين مقاله سعي خواهيم كرد نحوه كار با اين API را از صفر بازنويسي كنيم.
مطابق صفحه تعاريف پروتكل، سه روش اعتبارسنجي جهت دريافت اطلاعات API معرفي شده است كه در اينجا از روش ClientLogin كه مرسوم‌تر است استفاده خواهيم كرد.
مطابق مثالي كه در آن صفحه قرار دارد، اطلاعاتي شبيه به اطلاعات زير را بايد ارسال و دريافت كنيم:

POST /accounts/ClientLogin HTTP/1.1
User-Agent: curl/7.15.1 (i486-pc-linux-gnu) libcurl/7.15.1
OpenSSL/0.9.8a zlib/1.2.3 libidn/0.5.18
Host: www.google.com
Accept: */*
Content-Length: 103
Content-Type: application/x-www-form-urlencoded
accountType=GOOGLE&Email=userName@google.com&Passwd=myPasswrd&source=curl-tester-1.0&service=analytics

HTTP/1.1 200 OK
Content-Type: text/plain
Cache-control: no-cache
Pragma: no-cache
Date: Mon, 02 Jun 2008 22:08:51 GMT
Content-Length: 497
SID=DQ...
LSID=DQAA...
Auth=DQAAAG8...
در دات نت فريم ورك، اين‌كار را به صورت زير مي‌توان انجام داد:
        string getSecurityToken()
{
if (string.IsNullOrEmpty(Email))
throw new NullReferenceException("Email is required!");

if (string.IsNullOrEmpty(Password))
throw new NullReferenceException("Password is required!");

WebRequest request = WebRequest.Create("https://www.google.com/accounts/ClientLogin");
request.Method = "POST";

string postData = "accountType=GOOGLE&Email=" + Email + "&Passwd=" + Password + "&service=analytics&source=vahid-testapp-1.0";
byte[] byteArray = Encoding.ASCII.GetBytes(postData);

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

using (Stream dataSt = request.GetRequestStream())
{
dataSt.Write(byteArray, 0, byteArray.Length);
}

string auth = string.Empty;
using (WebResponse response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd().Trim();
string[] tokens = responseFromServer.Split('\n');
foreach (string token in tokens)
{
if (token.StartsWith("SID="))
continue;

if (token.StartsWith("LSID="))
continue;

if (token.StartsWith("Auth="))
{
auth = token.Substring(5);
}
else
{
throw new AuthenticationException("Error authenticating Google user " + Email);
}
}
}
}
}

return auth;

}

همانطور كه ملاحظه مي‌كنيد به آدرس https://www.google.com/accounts/ClientLogin ، اطلاعات postData با متد POST ارسال شده (دقيقا مطابق توضيحات گوگل) و سپس از پاسخ دريافتي، مقدار نشانه Auth را جدا نموده و در ادامه عمليات استفاده خواهيم كرد. وجود اين نشانه در پاسخ دريافتي به معناي موفقيت آميز بودن اعتبار سنجي ما است و مقدار آن در طول كل عمليات بايد نگهداري شده و مورد استفاده مجدد قرار گيرد.
سپس مطابق ادامه توضيحات API گوگل بايد ليست پروفايل‌هايي را كه ايجاد كرده‌ايم پيدا نمائيم:

string getAvailableProfiles(string authToken)
{
return fetchPage("https://www.google.com/analytics/feeds/accounts/default", authToken);
}

متد fetchPage را از پيوست اين مقاله مي‌توانيد دريافت نمائيد. خروجي يك فايل xml است كه با انواع و اقسام روش‌هاي موجود قابل آناليز است، از كتابخانه‌هاي XML دات نت گرفته تا Linq to xml و يا روش serialization كه من روش آخر را ترجيح مي‌دهم.
مرحله بعد، ساخت URL زير و دريافت مجدد اطلاعات مربوطه است:
            string url = string.Format("https://www.google.com/analytics/feeds/data?ids={0}&metrics=ga:pageviews&start-date={1}&end-date={2}", id, from, to);
return fetchPage(url, auth);
و سپس آناليز اطلاعات xml دريافتي، جهت استخراج تعداد بار مشاهده صفحات يا pageviews استفاده شده در اين مثال. ليست كامل مواردي كه قابل گزارشگيري است، در صفحه Dimensions & Metrics Reference گوگل ذكر شده است.

فايل‌هاي كلاس‌هاي مورد استفاده را از اينجا دريافت نمائيد.‌

مثالي در مورد نحوه استفاده از آن:
            CGoogleAnalytics cga = new CGoogleAnalytics
{
Email = "username@gmail.com",
Password = "password",
From = DateTime.Now.Subtract(TimeSpan.FromDays(1)),
To = DateTime.Now.Subtract(TimeSpan.FromDays(1))
};
List<CGoogleAnalytics.SitePagePreviews> pagePreviews =
cga.GetTotalNumberOfPageViews();

foreach (var list in pagePreviews)
{
//string site = list.Site;
//int pw = list.PagePreviews;
}