‏نمایش پست‌ها با برچسب RSS. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب RSS. نمایش همه پست‌ها

۱۳۸۸/۰۴/۱۱

سايت‌هاي خبري ايراني و RSS هاي بي‌خاصيت آن‌ها!


در طي اين چند وقت اخير هر قدر به سايت‌هاي خبري داخل كشور مراجعه كردم بيشتر نا اميد شدم. آيا واقعا اين بزرگواران فكر مي‌كنند مردم فرصت اين را دارند كه روزانه به چند صد سايت خبري سر بزنند؟ اين سايت‌ها يا RSS فيد ندارند و يا اين مشكلات را به همراه دارند:
  • استاندارد نبودن تاريخ فيدها. (عزيزان برنامه نويس اين تاريخ شمسي نيست و نبايد باشد! RSS يك فرمت استاندارد است.)
  • استاندارد نبودن محتواي XML توليد شده (قابل parse نيست!)
  • بعضي از آن‌ها RSS فيد دارند اما بايد چند دقيقه در سايت جستجو كنيد تا يك لينك را بتوانيد در اين زمينه پيدا كنيد!
  • از همه بدتر اينكه خروجي RSS آن‌ها يا چند لينك است بدون توضيح يا چند لينك است بعلاوه يك سطر توضيح. (هدف يك مشترك RSS اين است كه ديگر به سايت شما مراجعه نكند و مشروح مطالب را از طريق فيد دنبال كند. بنابراين يك لينك كافي نيست. يك سطر توضيح هم كم لطفي است. لطفا كل متن خبر را نيز ارائه دهيد.)
  • تعداد در نظر گرفته شده ناكافي مداخل مربوطه. مثلا امروز 20 خبر در سايت درج شده اما فيد RSS آن فقط 10 خبر آخر را نمايش مي‌دهد. اين فيد هم تقريبا بدون استفاده است چون حداقل يك روز كامل را پوشش نمي‌دهد.

۱۳۸۷/۰۹/۲۶

آشنايي با فرمت OPML


OPML يا Outline Processor Markup Language اساسا فايلي است مبتني بر XML كه امروزه بيشتر جهت توزيع لينك‌هاي تغذيه خبري سايت‌ها (RSS/Atom و امثال آن) مورد استفاده قرار مي‌گيرد.
به بياني ساده‌تر، بجاي اين‌كه بگويند ما به اين 100 وبلاگ علاقمند هستيم و لينك تك تك آنها را به شما ارائه بدهند، يك فايل OPML استاندارد از آن‌ها درست كرده و در اختيار شما قرار مي‌دهند. به اين صورت با چند كليك ساده، اين فايل در نرم افزار فيدخوان شما import شده و آدرس‌ها بلافاصله قابل استفاده خواهند بود.
نمونه‌اي از اين فرمت:
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
<head>
<title>Subscriptions in Google Reader</title>
</head>
<body>
<outline title="Programming">
<outline
text="Vahid's Blog"
title="Vahid's Blog"
type="atom"
xmlUrl="http://feeds.feedburner.com/vahidnasiri"
htmlUrl="http://vahidnasiri.blogspot.com/"/>
.
.
.

چند نمونه فايل OPML مرتبط با برنامه نويسي را از سايت‌هاي مختلف جمع آوري كرده‌ام كه آنها را از اين آدرس مي‌توانيد دريافت كنيد.

نحوه استفاده از آنها در Google reader
بعد از ورود به قسمت تنظيمات Google reader ، با استفاده از قسمت import/export مي‌توان يك فايل OPML را به آن معرفي كرد (شكل زير):



و يا با استفاده از برنامه باكيفيت و رايگان FeedDemon و قسمت import feeds آن مي‌توان يك فايل OPML را به برنامه وارد كرد. البته اين‌جا امكانات بيشتري را نسبت به Google reader دراختيار شما قرار مي‌دهد و مي‌توانيد از ليست دريافتي، موارد مورد نظر را انتخاب كنيد و نه تمامي آنها را.




اگر علاقمند بوديد كه اين فايل‌ها را در برنامه‌هاي دات نت خود import كنيد، كتابخانه سورس باز Argotic Syndication Framework اين امكان را در اختيار شما قرار مي‌دهد.


۱۳۸۷/۰۸/۲۱

خواندن فيد گزارش آب و هواي ياهو با استفاده از روش Xml serialization


در مطلب قبلي (در مورد كتابخانه anti-xss مايكروسافت) از روش xml serialization براي خواندن فايل xml حملات استفاده كرديم.
ايجاد اين كلاس و نگاشت اشياء با توجه به ساختار ساده آن به صورت دستي و به‌سادگي انجام شد. اكنون به مثال زير دقت بفرمائيد:
سرويس آب و هواي ياهو براي شهرهاي مختلف ايران از طريق لينك زير قابل استفاده است:
http://weather.yahoo.com/regional/IRXX.html
اگر به صفحات شهرهاي مختلف مراجعه نمائيد، يك فيد rss هم مشاهده خواهيد كرد، براي مثال در مورد تهران داريم:
http://weather.yahooapis.com/forecastrss?p=IRXX0018&u=c
ساختار اين فايل xml تا حدودي با يك rss استاندارد تطابق دارد. اما اگر به سورس xml آن دقت كنيم تگ‌هاي ديگري را نيز مشاهده خواهيم كرد كه براي مثال دما ، تاريخ و شرايط جوي را به صورت دقيقي و با استفاده از اصول xml ارائه مي‌دهند.

<yweather:condition text="Partly Cloudy" code="29" temp="10" date="Tue, 11 Nov 2008 5:30 pm IRT" />

خوب، براي دريافت اين اطلاعات چه بايد كرد؟ يكي از روش‌هاي متداول براي كار با اين نوع داده‌ها، استفاده از كلاس DataSet در دات نت و فراخواني متد ReadXml آن است (يك آدرس اينترنتي را هم مي‌تواند دريافت كند). سپس مطابق روش‌هاي معمول ADO.Net مي‌توان به تگ‌ها ومقادير آنها دسترسي داشت.
روش‌ بالا هر چند مشكلي ندارد اما به زيبايي كار با خواص يك كلاس متناظر با آن فايل xml نيست. اما در اينجا براي استفاده از روش xml serialization يك مشكل وجود دارد! ايجاد دستي اين كلاس كه بيانگر عملكرد آن فايل xml است كار ساده‌اي نيست.
خوشبختانه به همراه SDK‌ دات نت فريم ورك 2، برنامه‌اي به نام xsd.exe نيز همراه است كه كار ايجاد يك كلاس cs يا vb را از يك فايل xml جهت اين منظور انجام مي‌دهد (اين برنامه براي مثال در مسير C:\Program Files\Microsoft.NET\SDK\v2.0\Bin قرار دارد).

براي ايجاد فايل كلاس به صورت خودكار از روي يك فايل xml موجود بايد به ترتيب زير عمل كرد:
الف) ايجاد فايل xsd متناظر (XML Schema Definition)
براي اينكار در خط فرمان تايپ كنيد:
xsd.exe file.xml

نكته 1:
روش ديگر انجام اين كار : فايل xml را در VS.net باز كنيد، از منوي بالاي صفحه گزينه xml را انتخاب نموده و بر روي دكمه Create Schema كليك كنيد.

ب) ايجاد فايل cs يا vb از روي فايل(هاي) xsd ايجاد شده
در اينجا براي فيد آب و هواي ياهو سه فايل xsd توليد خواهد شد. براي تبديل آنها به كلاس cs بايد دستور زير را در خط فرمان اجرا كرد:

Xsd.exe file_1.xsd file_2.xsd file_3.xsd /c

اين مورد نكته مهمي است و تنها اگر يكي از فايل‌ها اينجا ذكر شوند، كلاس ناقصي تشكيل خواهد شد. (براي نمونه فايل xssAttacks.xml مطلب قبلي، ساختار ساده‌اي داشته و تنها به يك فايل xsd ختم خواهد شد)

نكته 2:
براي انتخاب زبان VB (با توجه به اين‌كه پيش فرض آن CS است) مي‌توان به صورت زير عمل كرد:
xsd.exe file.xsd /c  /l:vb

نكته 3:
براي توليد فايل xsd ، از برنامه Infer.exe نيز مي‌توان استفاده كرد (خروجي نهايي دقيق‌تري را ارائه مي‌دهد). اين برنامه را از اينجا دريافت كنيد.

تصاوير زير مقايسه دو فايل كلاس نهايي توليد شده از xsd هاي اين دو برنامه است:






پس از طي اين مراحل فايل كلاس ما براي xml serialization آماده خواهد شد. مرحله بعد دريافت اطلاعات و نگاشت آن به اين كلاس توليد شده است:

public static rss DeserializeFromXML()
{
XmlSerializer deserializer =
new XmlSerializer(typeof(rss));
using (XmlReader reader = XmlReader.Create("http://weather.yahooapis.com/forecastrss?p=IRXX0018&u=c"))
{
return (rss)deserializer.Deserialize(reader);
}
}

كلاس rss از فيد xml و فايل‌هاي xsd آن كه توليد كرديم به صورت خودكار ايجاد شده است.
اكنون براي مثال خواندن وضعيت فعلي جوي از فيد دريافتي به سادگي زير است:

rss data = DeserializeFromXML();
MessageBox.Show(data.channel.item.condition.text);


۱۳۸۷/۰۸/۱۲

دو نكته كوتاه در مورد RSS هاي فارسي


اولين نكته مربوط به تاريخ هر مدخل (entry) مي‌شود. اين تاريخ نبايد شمسي باشد! اين تاريخ بايد حتما استاندارد باشد. عموما يكي از دو استاندارد زير بايد مورد استفاده قرار گيرد:


RFC #822
http://www.ietf.org/rfc/rfc0822.txt
Standard for ARPA Internet Text Messages (Date and Time Specification)

RFC #3339
http://www.ietf.org/rfc/rfc3339.txt
Date and Time on the Internet (Timestamps)


براي مثال در دات نت براي توليد اين فرمت استاندارد مي‌توان به صورت زير عمل كرد:
DateTime.Now.ToUniversalTime().ToString("r")

متاسفانه بسياري از برنامه نويس‌هاي هم وطن اين نكته را رعايت نمي‌كنند و برنامه‌هاي فيدخوان را دچار مشكل مي‌كنند. (براي نمونه برنامه معروف feedDemon تاريخ چند سال پيش را ثبت خواهد كرد و در به روز رساني و دنبال كردن مطالب سايت مورد نظر دچار مشكل خواهد شد)

چند مثال از اين دست: (سورس صفحه را در مرورگر مطالعه نمائيد)
http://www.faradade.com/Xml/RSS.xml
و يا
http://www.ayande.ir/atom.xml
و يا
http://www.tci-sk.ir/Rss.aspx
(ايشان بهتر است علاوه بر اين مورد، از XmlTextWriter استفاده كنند و خروجي را به صورت يك فايل xml و نه html در مرورگر Flush كنند)

و يا بدتر از اين بعضي از سايت‌ها آموزش‌هاي غلطي را هم ارائه مي‌دهند:
http://www.faradade.com/Article.aspx?code=a726ae6a-f8e1-4b29-88b4-8e7a04e6d06d
به قسمت pubDate دقت كنيد.
مطابق معمول اين آموزش الان در 200 سايت كپي و پيست شده! عنوان آموزش را در گوگل جستجو كنيد!
اين كد آموزش داده شده يك ايراد ديگر هم دارد. آيا الزامي دارد كه حتما قسمت con.Close به همين ترتيب نوشته شده اجرا شود؟ اگر اين بين خطايي رخ دهد تكليف اين كانكشن باز و ساير موارد چه خواهد شد؟ كلا استفاده از try و finally و يا استفاده از using را براي چه هدفي اختراع كرده‌اند؟

و يا بعضي از سايت‌ها اين مورد را رعايت مي‌كنند اما به صورت نصفه و نيمه. براي مثال: (تاريخ ارائه شده كامل نيست. بنابراين استاندارد تلقي نخواهد شد)
http://www.srco.ir/Articles/RSSArticles.xml

براي آزمايش ميزان استاندارد بودن خروجي فيد خود مي‌توان از سرويس زير استفاده كرد:
http://validator.w3.org/feed/

مطلب ديگر ايراد نيست بلكه نكته‌اي است كه حداقل از IE7 به بعد رعايت مي‌شود:
لطفا زبان فيد را مشخص كنيد! بله، اگر اين مورد را مشخص كنيد، از IE7 به بعد فيد فارسي به صورت خودكار از راست به چپ نمايش داده مي‌شود و اين امر سبب سهولت خواندن مطالب فارسي سايت شما خواهد شد.
مشاهده اصل مطلب كه توسط يكي از اعضاي تيم مربوطه مايكروسافت نوشته شده:
مشاهده

اصلاحيه براي RSS فارسي:
<language>fa-IR</language>

و براي Atom فارسي:
<feed xml:lang="fa">

و اگر مي‌خواهيد خروجي استانداردي داشته باشيد، كتابخانه سورس باز زير توصيه مي‌شود:
http://www.codeplex.com/Argotic

با تشكر از همكاري شما!