استفاده از تقویم google در وبسایت

در این مقاله نشان خواهیم داد که چگونه از تقویم google در وبسایت خود استفاده کنیم و بتوانیم رویدادهایمان را در سایت نمایش دهیم.

استفاده از تقویم google در وبسایت

تقویم google یک سرویس رایگان google برای برنامه ریزی جلسات، رویداد ها و موارد مرتبط با یک تقویم است. این امکان وجود دارد که بتوانید یک زمان برای یک ملاقات، تکرار و یک یادآوری را تنظیم کنید. می توانید شرکت کنندگان دیگر را دعوت کنید، که این کار با فرستادن ایمیل توسط این سرویس انجام می شود. همچنین این امکان وجود دارد که بتوانید چند تقویم ایجاد کنید که هرکدام نام خود را داشته باشد.

google دارای Calendar Data API می باشد که اجازه می دهد رویدادهای تقویم را از برنامه خود بروزرسانی کنید.

برای این سرویس کتابخانه های Calendar Data APIهای مختلفی مانند java، javaScript، PHP، Python و NET. می باشدکه ما برای برنامه ASP.NET خود از کتابخانه NET. استفاده می کنیم. 

ما برای انجام این کار در برنامه خود با دو مساله روبرو هستیم.

1- بدست آوردن آرایه ای از رویدادهای Google Calendar با اطلاعات Google calendar name، Google account name و  Google account password.

2- نشان دادن این رویدادها در سایت

راه حل هایی که می توانیم برای انجام این دو مساله ارائه دهیم به صورت  گام به گام در زیر آمده است.

مرحله 1- کتابخانه NET library. را برای Google data API دانلود می کنیم.

این کتابخانه را دانلود و سپس installer آن را اجرا کنید. کتابخانه در مسیر C:\Program File\Google\Google Data API SDK\Redist نصب خواهد شد.

مرحله 2- کپی کردن فایل های لازم در وبسایت

فایل های نام برده شده در زیر را در پوشه Bin در وبسایت خود کپی کنید.

Google.GData.AccessControl.dll

Google.GData.Calendar.dll 

Google.GData.Client.dll

Google.GData.Extensions.dll

سپس از مسیر Reference-Add Reference-Browse یک Reference برای این فایل ها در وبسایت اضافه کنید.

مرحله 3- ساخت کلاس با استفاده از کتابخانه ASP.NET Google API library

کار ما ساخت یک کلاس می باشد تا یک آرایه از رویدادها را از Google Calendar  با اطلاعاتی که در بالاتر گفتیم، برگرداند. کلاس CalendarEventObject را مانند زیر تعریف می کنیم.

public class CalendarEventObject
{
    public DateTime Date { get; set; }
    public string Title { get; set; }
}

مساله بصورت زیر حل می شود.

public class GoogleCalendar
    {
        private const string CALENDARS_URL = 
	"https://www.Google.com/calendar/feeds/default/owncalendars/full";
        private const string CALENDAR_TEMPLATE = 
	"https://www.Google.com/calendar/feeds/{0}/private/full";
        private string m_CalendarUrl = null;
        private string m_CalendarId = null;
        private readonly CalendarService m_Service = null;
        private readonly string m_CalendarName;
        private readonly string m_UserName;
        private readonly string m_Password;
    public GoogleCalendar(string calendarName, string username, string password)
        {
            m_CalendarName = calendarName;
            m_UserName = username;
            m_Password = password;
            m_Service = new CalendarService("Calendar");
        }
        public CalendarEventObject[] GetEvents()
        {
            try
            {
                if (Authenticate())
                {
                    EventQuery query = new EventQuery(m_CalendarUrl);
                    EventFeed feed = m_Service.Query(query);
                    return (from EventEntry entry in feed.Entries
                            select new CalendarEventObject()
                            {Date = entry.Times[0].StartTime, 
				Title = entry.Title.Text}).ToArray();
                }
                else
                {
                    return new CalendarEventObject[0];
                }
            }
            catch (Exception)
            {
                return new CalendarEventObject[0];
            }
        }

      private bool Authenticate()
        {
            m_Service.setUserCredentials(m_UserName, m_Password);
            return SaveCalendarIdAndUrl();
        }

        private bool SaveCalendarIdAndUrl()
        {
            CalendarQuery query = new CalendarQuery();
            query.Uri = new Uri(CALENDARS_URL);
            CalendarFeed resultFeed = (CalendarFeed)m_Service.Query(query);

            foreach (CalendarEntry entry in resultFeed.Entries)
            {
                if (entry.Title.Text == m_CalendarName)
                {
                    m_CalendarId = entry.Id.AbsoluteUri.Substring(63);
                    m_CalendarUrl = string.Format(CALENDAR_TEMPLATE, m_CalendarId);
                    return true;
                }
            }
            return false;
        }

   public string GetCalendarId()
    {
          return m_CalendarId;
    }
}

شرح متغیرها و ثابت ها

CALENDARS_URL : می توانید یک آرایه از تمام Calenderها که account آنها مشخص شده است بدست آورید.

CALENDAR_TEMPLATE : ایجاد URL برای Calendar خاص بدون مشخص کردن Id برای calendar تاکنون

m_CalendarUrl : ایجاد URL برای calendar خاص

m_CalendarId : ایجاد Id برای calendar خاص

m_Service : نشان دهنده ارتباط یک client با یک سرویس Calendar

m_CalendarName : نشان دهنده نام Calendar

m_UserName : نشان دهنده نام حساب کاربری Google

m_Password : نشان دهنده رمز عبور حساب کاربری Google

شرح سازنده ها و متدها

سازنده (Constructor)

زمانی که می خواهیم یک  CalendarService ایجاد کنیم، یک نام برای برنامه خود که در واقع هر رشته ای می تواند باشد می گذاریم.

m_Service=new CalendarService("Calendar"); 

()Authenticate ( احراز هویت)

کتابخانه NET. می تواند با Calendar هم از نوع public و هم از نوع Private کار کند. Calendar از نوع public به صورت read-only بوده و نیاز به احراز هویت ندارد. زمانی که با Calendar از نوع Private کار می کنیم نیاز به احراز هویت وجود دارد. برای انجام عمل authenticate متد setUserCredentials را از CalendarService فراخوانی کنید، نام کاربری و رمزعبور Google خود را مشخص کنید.

m_Service.setUserCredentials(m_UserName, m_Password);

همچنین متد ()Authenticate، متد کمکی ()SaveCalendarIdAndUrl را برای ذخیره کردن Calendar Id و Calendar URL فراخوانی می کند.

()SaveCalendarIdAndUrl

در اینجا برای Calendar مناسب جستجو انجام می شود و Id و URL مربوط به Calendar در متغیر داخلی ذخیره می شود.

برا ی درخواست همه Calendarها در حساب کاربری، یک object به نام query برای کلاس CalendarQuery ایجاد می کنیم و خصوصیت Uri را برای آن تعریف می کنیم و با استفاده از query از CalendarService درخواست می شود.

CalendarQuery query = new CalendarQuery();
query.Uri = new Uri(CALENDARS_URL);
CalendarFeed resultFeed = (CalendarFeed)m_Service.Query(query); 

سپس از طریق حساب کاربری calendar و و جستجو براساس نام، جستجو را تکرار می کنیم تا به calendarی که مدنظر ما می باشد برسیم. وقتی Calendar موردنظر را پیدا کردیم، Id و URL آن ذخیره می شود.

foreach (CalendarEntry entry in resultFeed.Entries)
           {
               if (entry.Title.Text == m_CalendarName)
               {
                   m_CalendarId = entry.Id.AbsoluteUri.Substring(63);
                   m_CalendarUrl = string.Format(CALENDAR_TEMPLATE, m_CalendarId);
                   return true;
               }
           }

به این نکته توجه کنید:

m_CalendarId = entry.Id.AbsoluteUri.Substring(63);

Id و URL مربوط به Calendar از هم جدا ذخیره می شوند. اغلب اوقات، Id و name با هم یکی می باشند که این همیشه صحیح نیست. بنابراین این قابل اطمینان ترین راه برای به دست آوردن Id در تمم موارد است و به خوبی کار خواهد کرد.

()GetEvents

این متد یک آرایه از objectهای CalendarEvent (شامل آرایه ای از رویداد ها، از تقویم Google می خواند) را برمی گرداند.

برای درخواست رویداد از یک تقویم خاص( که آدرس تقویم را قبلا در متغیر m_CalendarUrl ذخیره شده است)، یک object از کلاس EventQuery می سازیم و با استفاده از متد Query رویدادها را درخواست می کنیم. بنابراین ما یک آرایه سفارشی از اشیا CalendarEventObject از آرایه EventEntry گوگل، به دست خواهیم آورد. و برگشت آن:

EventQuery query = new EventQuery(m_CalendarUrl);
EventFeed feed = m_Service.Query(query);
return (from EventEntry entry in feed.Entries
       select new CalendarEventObject()
          {Date = entry.Times[0].StartTime, 
           Title = entry.Title.Text}).ToArray(); 

()GetCalendarId

این متد، Id را که قبلا در m_CalendarId ذخیره شده است را برمی گرداند.

2- نمایش رویدادها در سایت

ما دو راه برای نمایش رویدادهایمان در سایت داریم:

راه اول: به دست آوردن آرایه ای از رویدادها و نمایش آنها

GoogleCallendar calendar = new GoogleCalendar
	("Google calendar name", "Google account name", "Google account password");
CalendarEventObject[] events= calendar.GetEvents()

بنابراین، ما آرایه ای از رویدادها را خواهیم داشت (CalendarEventObject). حالا می توانیم از طریق آرایه، رویدادها را آنطور که می خواهیم در صفحه نشان دهیم. یک مثال را می توانید در زیر ببینید.

 

راه دوم: نمایش تقویم Google در سایت با استفاده از Goole Calendar iframe

به منظور نمایش تقویم Google در سایت خود، کدهای زیر را در صفحه aspx درج کنید.

<iframe src="https://www.Google.com/calendar/embed?src=<%=
GetCalendarID()%>&ctz=Europe%2FMoscow" style="border: 0" width="800"
height="600" frameborder="0" scrolling="no"></iframe>

بعد از آن، متد ()GetCalendarId را در فایل Code-behind این صفحه تعریف می کنیم. این متد Calendar Id را بر می گرداند:

public string GetCalendarId()
{
     GoogleCalendar calendar = new GoogleCalendar
	("Google calendar name", "Google account name", "Google account password");
     return calendar.GetCalendarId();
}

 

نتیجه کار شما هم می تواند مانند عکس زیر باشد: