مقدمة لـ RSS، إنشاء قارئ للأخبار

This article is available in English too, check it out here.

الكود: Geming.WinForms.RssBars.zip

المحتويات

محتويات هذا الموضوع:

  • المحتويات
  • نظرة خاطفة
  • خدمة RSS
  • فائدة RSS
  • إصدارات RSS
  • التركيب Schema
  • المثال، مكتبة أشرطة الأخبار
  • التحميل
  • المزيد

نظرة خاطفة

درسنا اليوم لا يشرح تقنية RSS أو حتى XML. ولكن الدرس اليوم هو عبارة عن مقدمة لـ RSS، فكرة عامة عن تطويرها، إصداراتها، وكيفية الاستفادة منها سواء بالنسبة للمستخدم أو المبرمج.

يعتمد درسنا اليوم على فهم القارئ لمبادئ تقنية XML، ليس برمجتها، بل فهم كيفية تركيب بيانات XML وكيفية التعامل معها (ولا يشمل هذا برمجتها.)

اليوم، سوف نقوم بإذن الله تعالى بتطبيق ما نتعلمه عن تقنية RSS، سوف نقوم بإنشاء برنامج (مبدئيا، هو برنامج!) لقراءة الأخبار وبيانات RSS.

خدمة RSS

تقنية RSS أو كما هي اختصار لـ Really Simple Syndication أو أحيانا Rich Site Summary هي تقنية قائمة على نظام XML لها تركيب Schema خاص بها تستخدم لتمثيل المحتوى كثير التغير على لإنترنت وتسمح باستهلاكه واستخدامه من قبل البرامج التي تدعم هذه التقنية. ويدخل تحت مسمى المحتوى كثير التغير، مواقع الأخبار مثلا والتي تتجدد بالاستمرار، والبلوجات Blogs، ونحوها.

هناك العديد من المسميات لبيانات RSS أو البيانات القائمة على تقنية RSS ومن هذه المسميات: التلقيمة، Feed، Syndication Feed، Web Syndication، و Channel. ودائما ما تظهر هذه التقنية أو تتوفر من خلال مواقع الإنترنت دائمة التحديث، وفي الغالب تستخدم هذه المواقع الرمز التالي لبيان أن الموقع يدعم خدمة RSS:

فتلقيمة RSS هي عبارة عن ملف في الغالب له الامتداد XML أو RSS يمثل أحدث محتوى تمت إضافته إلى الموقع.

فائدة RSS

في ماذا تفيد هذه الخدمة؟

هذه الخدمة توفر طريقة منظمة ومتطورة للبرامج والأدوات للحصول على آخر التحديثات أو العناوين من موقع معين. فلو تخيلنا مثلا أنك تريد الحصول على أحدث الأخبار من BBC فسوف تقوم بسحب هذه التلقيمة Feed (أي سحب عنوانها Address) وإضافتها إلى أحد البرامج قارئة الأخبار لكي تستطيع الحصول على أحدث الأخبار بصفة دورية بدلا من زيارتك للموقع بشكل متكرر.

وتسمى هذه البرامج المستهلكة لتقنية RSS تسمى قارئة الأخبار، Feed Readers، RSS Readers، وأيضا Aggregators. وهذه البرامج تقوم بقراءة بيانات RSS (وهي كما قلنا لها قائمة على XML لها صيغة معينة) ثم تقوم بترجمتها وعرضها إليك على واجهة البرنامج.

إصدارات RSS

خدمة RSS لها العديد من الإصدارات فقد مرت على العديد من التحولات والتغييرات ولكن معظم هذه التغييرات لم تكن جذرية فأسفر هذا عن إصدارين رئسيين Major والعديد من الإصدارات الفرعية:

  1. الإصدار الأول RSS 1.* وكان يسمى RDF اختصارا لـ Resource Description Framework وهو يعتبر الآن ملغي.
  2. الإصدار الثاني RSS 2.* وهو الذي نشاهده الآن في جميع المواقع وهو الذي سوف تكون دراستنا حوله.

التركيب Schema

كما قلنا فخدمة RSS قائمة على تقنية XML فهي لها صيغتها ولكنها لها تركيب Schema معين خاص بها. ولكي نتعرف أكثر على تركيب هذه التقنية سوف نقوم بسحب التلقيمة الخاصة بموقعنا مع الدوت نت. فالآن قم بكتابة العنوان التالي http://withdotnet.net/feed في شريط العنوان الخاص بمتصفحك ومشاهدة النتائج والتي كانت في هذه اللحظة من كتابتنا هذا الدرس، كانت كالتالي (الكود مختصر للوضوح):

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>مع الدوت نت</title>
        <link>http://withdotnet.net</link>
        <description>مع الدوت نت مع محمد الشيمي</description>
        <lastBuildDate>Wed, 02 Jun 2010 16:09:32 +0000</lastBuildDate>
        <language>ar</language>
        <generator>http://wordpress.com/</generator>
        <image>
            <url>http://www.gravatar.com/.../i/buttonw-com.png</url>
            <title>مع الدوت نت</title>
            <link>http://withdotnet.net</link>
        </image>
        <item>
            <title>سرد، إرفاق، فصل قواعد بيانات على السيرفر برمجيا</title>
            <link>http://withdotnet.net/...</link>
            <comments>http://withdotnet.net/...#comments</comments>
            <pubDate>Wed, 02 Jun 2010 16:09:32 +0000</pubDate>
            <category><![CDATA[ADO.NET]]></category>
            <category><![CDATA[SQL Server]]></category>
            <category><![CDATA[T-SQL]]></category>
            <category><![CDATA[.NET]]></category>
            <category><![CDATA[CSharp]]></category>
            <category><![CDATA[VB.NET]]></category>
            <guid isPermaLink="false">http://withdotnet.net/?p=460</guid>
            <description><![CDATA[Available in English too, click here. المحتويات]]></description>
        </item>
        <item>
            <title>إنشاء مصمم للشيتات، التقارير، الفواتير، ونحوها</title>
            <link>http://withdotnet.net/2010/06/01/...</link>
            <comments>http://withdotnet.net/2010/06/01/.../#comments</comments>
            <pubDate>Tue, 01 Jun 2010 19:02:41 +0000</pubDate>
            <category><![CDATA[WinForms]]></category>
            <category><![CDATA[.NET]]></category>
            <category><![CDATA[CSharp]]></category>
            <category><![CDATA[GDI+]]></category>
            <category><![CDATA[Samples]]></category>
            <guid isPermaLink="false">http://withdotnet.net/?p=449</guid>
            <description><![CDATA[Available in English too, click here. تحميل المشروع ]]></description>
        </item>
    </channel>
</rss>

هل واجهت مشكلة في عرض محتوى RSS بنفس الصيغة على متصفحك؟ ربما يكون متصفحك لا يستطيع عرض بيانات XML بهذه الطريقة. ربما يكون متصفحك أيضا يدعم CSS يقوم بتطبيقه على بيانات RSS لتظهر بطريقة أفضل! قم بالمحاولة في متصفح آخر. طريقة أخرى مضمونة هي محاولة حفظ الصفحة Save كملف XML وعرض الملف في Visual Studio مثلا (هذا ما قمت بفعله تماما!).

هل تستطيع ملاحظة هذا التركيب Schema المتميز لـ RSS؟ يمكنك ملاحظة أن تلقيمة RSS تم تسميتها بـ Channel وتم عرض أحدث الأخبار في صيغة عناصر Items وكل عنصر له عنوان Title وله رابط Link وله وصف Description.

لاحظ أيضا أنه بيانات XML أو بالتحديد RSS هي قابلة للامتداد Extensibility. أي أنه هناك عناصر Elements يجب توافرها كي تكون البيانات صحيحة مثل Title و Link وغيرها. كما يمكنك أيضا إضافة أي عناصر Elements أخرى تريدها.

الشكل التالي يوضح التركيب العام لبيانات RSS. تم تحديد البيانات المطلوب ذكرها Required بالإطار ذا اللون الأحمر. لاحظ أيضا أنه يمكنك كما قلنا إضافة أي بيانات أخرى إلى هذا التركيب.

كما نلاحظ العديد من هذه العناصر مفهومة من أسمائها ولكن هناك بعض العناصر التي تحتاج إلى توضيح (لا تتردد في طرح أي سؤال في أي نقطة تحتاج إلى توضيح):

  • rss\channel\language:
    اللغة الخاصة بالمحتوى مثلا en للإنكليزية أو ar للعربية.
  • rss\channel\lastBuildDate:
    تاريخ آخر تحديث لبيانات RSS هذه.
  • rss\channel\ttl:
    الزمن الفارق بين كل تحديث لهذه البيانات ويسمى هذا الزمن TTL أو Time to Live. ثم ما هي فائدة هذا العنصر والعنصر السابق له lastBuildDate؟ كما تعرف يمكن أن يكون هناك مواضيع جديدة تمت إضافته إلى الموقع ولكن سياسة الموقع تجعل تحديث بيانات RSS متأخر قليلا. ففي بعض الأحيان مثلا يتم تحديثها كل نصف ساعة وربما ساعة أو أكثر وربما أقل من ساعة! فهذه العناصر تتيح لبرنامجك معرفة حداثة البيانات المتوفرة.
  • rss\channel\generator:
    اسم البرنامج أو الأداة (أو حتى الموقع) الذي تم استخدامه لتوليد Generating (إنشاء) هذه البيانات.
  • rss\channel\item\guid:
    المعرف المميز العالمي GUID أو Globally Unique Identifier الذي يتم به تمييز كل موضوع Item عن الآخر.

المثال، مكتبة أشرطة الأخبار

المثال الذي بين أيدينا اليوم هو عبارة عن مكتبة أدوات Windows Control Library خاصة بمشاريع النماذج WinForms تضم مجموعة متميزة من أشرطة الأدوات والتي يمكن إضافتها إلى نموذجك Form والتي تعرض الأخبار من أكثر من مصدر (منها موقعنا Just Like a Magic).

المشروع يسمى Geming.WinForms.RssBars تم تطويره بـ VB.NET. وهذه هي صور من مجموعة من النماذج التي تمت إضافة الأشرطة إليها.

الشكل التالي يوضح التركيب الداخلي لهذه المكتبة:

كما تلاحظ فإن معظم -إن لم يكن كل- الإمكانيات والكود موجودة في الصنف Class الأب المسمى RssBar. أما جميع ما ينحدر منه فهي عبارة عن تصنيفات فرعية تقوم فقط بتحديد العنوان Address الخاص بخدمة الـ RSS. فالصنف الأب RssBar يقوم بقراءة وعرض البيانات بناء على خاصية RSSFeedAddress والعديد من الخصائص الأخرى. وهذا التصميم يسمح بقابلية عالية للامتداد Extensibility للمشروع. فيمكنك إنشاء أي كم من الأصناف المنحدرة من الأب RssBar وفقط تقوم بتحديد الخواص المطلوبة.

الكود هو كود سهل جدا تم شرحه وتبسيطه من خلال العديد من الملاحظات Comments والشرح Documentation الخاص بالكود.

إذا كيف تمت معالجة بيانات RSS من خلال الكود؟ بالطبع اعتمدنا في معالجة بيانات RSS على العناصر من الـ Namespace المسمى System.Xml.

الكود التالي هو كود مختصر للدالة الرئيسية ReadRss() التي تقوم بقراءة تلقيمة الـ RSS:

    Public Sub ReadRss()
        ' Checking design mode, exit if True
        ' Preparing the screen
        ' The XML Document
        Dim xmlDoc As New Xml.XmlDocument
        ' Loading the RSS feed, should fail if network is not available
        xmlDoc.Load(m_rss)
        ' Accessing the "channel" element
        Dim ndChannel As Xml.XmlNode = xmlDoc.Item("rss").Item("channel")
        ' Comparing publication date to one we have
        ' continue if something new
        ' Item cocollection
        Dim collItems As New Collections.Generic.List(Of RssItem)
        Dim ndItem As Xml.XmlNode
        ' Enumerating through the items
        ' and populating the collection
        For i As Integer = 0 To ndChannel.ChildNodes.Count - 1
            ndItem = ndChannel.ChildNodes(i)
            If (ndItem.Name = "item") Then
                collItems.Add( _
                    New RssItem(ndItem.Item("title").ChildNodes(0).InnerText, _
                    ndItem.Item("link").ChildNodes(0).InnerText, _
                    ndItem.Item("description").ChildNodes(0).InnerText))
            End If
        Next
        ' Checking if items cound
        ' Clear existing items
        Do While enumerator.MoveNext
            ' Item
            lbl = New Label
            ' Creating a Label for the item
            ' and filling its fields
            Me.CtrlsPanel.Controls.Add(lbl)
            ' Adding handlers, so we could fire events
            AddHandler lbl.Click, AddressOf Me.RssItem_Click
            AddHandler lbl.MouseMove, AddressOf Me.RssItem_MouseMove
            ' Image
            image = New PictureBox
            ' Adding the banner image between items
             Me.CtrlsPanel.Controls.Add(image)
            ' Adding event handlers, so we could fire events
            AddHandler image.Click, AddressOf Image_Click
            AddHandler image.MouseMove, AddressOf Image_MouseMove
        Loop
        ' Finalization
    End Sub

ماذا عن الأصناف المنحدرة من الأب RssBar، كيف تتم معالجة الكود الخاص بها؟

لا تقوم الأصناف المنحدرة Derived من الأب RssBar إلا بتحديد الخصائص والمتغيرات الخاصة بالأب. الكود التالي هو الكود الخاص بالشريط الخاص بموقع CodeProject والذي قمنا بإنشاءه والذي يقوم بقراءة التلقيمة من الموقع:

    Public Sub New()
        MyBase.New( _
            "http://www.codeproject.com/webservices/articlerss.aspx?cat=1", _
            m_image)
        Me.RightToLeft = Windows.Forms.RightToLeft.No
    End Sub

التحميل

تحميل مكتبة أشرطة الأخبار

المزيد

تريد المزيد عن تقنية RSS؟ هذه مواضيع متميزة جدا في هذا الموضوع:

مواضيع مشابهة:

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...
  • azooz-tamimi

    وينك اخي محمد ماعد نشوفك في منتدى الفريق العربي؟؟

    • قمت بحذف العضوية بسبب مشاكل مع الإدارة.

      شكرا لسؤالك هذا شيئ كثير يسعدني :)

      تحياتي

  • تحياتي لك ولموضوعك الرائع .. بالتوفيق.