PDA

View Full Version : BehooRssGenerator - کتابخانه ای برای تولید آسان RSS



Behrouz_Rad
سه شنبه 27 فروردین 1387, 15:05 عصر
BehooRssGenerator کتابخانه ای هست که برای تولید RSS برای سایت هایی که نیاز به RSS دارند نوشتم و تصمیم گرفتم اون رو به صورت عمومی منتشر کنم.

ابزارها و کتابخانه های مختلفی برای تولید RSS وجود دارند. از جمله فضای نام جدید Syndication که در دات نت NET 3.5. وجود داره و امکان ایجاد RSS و Atom رو با استفاده از WCF یا به شکل مستقل ارائه می کنه.

BehooRssGenerator با #C و کاملا شی گرا نوشته شده، سرعت زیادی در تولید RSS داره، از زبان پارسی پشتیبانی و همچنین دو سطح فشرده سازی "متوسط" و "زیاد" رو عرضه می کنه و کار با اون بسیار راحت هست.
هر سوال یا مشکلی که در رابطه با این کتابخانه دارید در همین تاپیک مطرح بفرمایید.
فایل ضمیمه شامل کتابخانه و نمونه کدی جهت استفاده است.

برای تولید RSS با این کتابخانه، یک صفحه مثلا با نام rss.aspx ایجاد کنید و تمامی محتویات فایل aspx رو به جز دایرکتیو Page که در بالای صفحه وجود داره حذف کنید و سپس کدهای مورد نیاز رو در روال Page_Load بنویسید.

سه نکته:
1) اگر اخبار شما پارسی است، خاصیت Language کلاس RssChannel رو بر روی Persian قرار بدید تا RssReader ها بتونن به صورت راست چین خبرها رو نمایش بدن.
2) حالت فشره سازی رو همیشه بر روی High قرار بدید مگر اینکه تفاوت کمی بین حالت های Medium و High وجود داشته باشه. (این تفاوت رو در Firefox می تونید با راست کلیک بر روی صفحه و انتخاب گزینه ی Page Info و مشاهده ی قسمت Size در سربرگ General مشاهده کنید) در این حالت گزینه ی Medium رو انتخاب کنید.
3) برای یادگیری فرمت فایل های RSS و آشنایی با المنت های این استاندارد مرجع ذیل رو مطالعه بفرمایید:
http://www.rssboard.org/rss-specification

مثالی در رابطه با استفاده از این کتابخانه با #C


using BehooRssGenerator.RssElements;

----------------------------------------------

protected void Page_Load(object sender, EventArgs e)
{

RssChannel OBJ_CHANNEL = new RssChannel("Behrouz News Headlines!", new Uri("http://www.site.com/"), "ASP.NET - Daily News");
OBJ_CHANNEL.Categories.Add(new RssCategory("Programming"));
OBJ_CHANNEL.Categories.Add(new RssCategory("Updates", "http://www.site.com/updates"));
OBJ_CHANNEL.CompressionMode = RssChannel.CompressType.High;
OBJ_CHANNEL.Copyright = "(c) 2008, Behrouz News Agency.";
OBJ_CHANNEL.Language = RssLanguages.Persian;
OBJ_CHANNEL.LastBuildDate = DateTime.Now;
OBJ_CHANNEL.ManagingEditor = new System.Net.Mail.MailAddress("my1@domain.com", "Ali Ahmadi");
OBJ_CHANNEL.WebMaster = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");

OBJ_CHANNEL.Items.Add(new RssItem("اولین خبر", new Uri("http://www.site.com/news.aspx?id=1"), "متن خلاصه اولین خبر"));

RssItem OBJ_ITEM = null;
OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.site.com/news.aspx?id=2"), "متن خلاصه دومین خبر");
OBJ_ITEM.Author = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");
OBJ_ITEM.Categories.Add(new RssCategory("Programming"));
OBJ_ITEM.Comments = new Uri("http://www.site.com/news.aspx?id=2/comments");
OBJ_ITEM.Guid = new RssGuid(Guid.NewGuid().ToString());
OBJ_ITEM.PubDate = DateTime.Now.AddHours(-3);

OBJ_CHANNEL.Items.Add(OBJ_ITEM);

OBJ_CHANNEL.GenerateRss(this.Context);

}



مثالی در رابطه با استفاده از این کتابخانه با VB.NET


Imports BehooRssGenerator.RssElements

----------------------------------------------

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim OBJ_CHANNEL As New RssChannel("Behrouz News Headlines!", New Uri("http://www.site.com/"), "ASP.NET - Daily News")
OBJ_CHANNEL.Categories.Add(New RssCategory("Programming"))
OBJ_CHANNEL.Categories.Add(New RssCategory("Updates", "http://www.site.com/updates"))
OBJ_CHANNEL.CompressionMode = RssChannel.CompressType.High
OBJ_CHANNEL.Copyright = "(c) 2008, Behrouz News Agency."
OBJ_CHANNEL.Language = RssLanguages.Persian
OBJ_CHANNEL.LastBuildDate = DateTime.Now
OBJ_CHANNEL.ManagingEditor = New Net.Mail.MailAddress("my1@domain.com", "Ali Ahmadi")
OBJ_CHANNEL.WebMaster = New Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad")

OBJ_CHANNEL.Items.Add(New RssItem("اولین خبر", New Uri("http://www.site.com/news.aspx?id=1"), "متن خلاصه اولین خبر"))

Dim OBJ_ITEM As RssItem = Nothing
OBJ_ITEM = New RssItem("دومین خبر", New Uri("http://www.site.com/news.aspx?id=2"), "متن خلاصه دومین خبر")
OBJ_ITEM.Author = New Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad")
OBJ_ITEM.Categories.Add(New RssCategory("Programming"))
OBJ_ITEM.Comments = New Uri("http://www.site.com/news.aspx?id=2/comments")
OBJ_ITEM.Guid = New RssGuid(Guid.NewGuid().ToString())
OBJ_ITEM.PubDate = DateTime.Now.AddHours(-3)

OBJ_CHANNEL.Items.Add(OBJ_ITEM)

OBJ_CHANNEL.GenerateRss(Me.Context)

End Sub

پیاده سازی کتابخانه در MVC و Web Forms متفاوت است. بنابراین برای استفاده در ASP.NET MVC از کتابخانه ای که در فایل ضمیمه ی مرتبط وجود دارد استفاده بفرمایید. برای MVC یک ActionResult سفارشی با نام RssResult وجود دارد که Channel را به عنوان ورودی می گیرد:


return new RssResult(rssChannel);

آپدیت در 18/1/1389: اضافه شدن نسخه ی ASP.NET MVC
موفق باشید.

Amir Taghavi
سه شنبه 27 فروردین 1387, 16:11 عصر
من فکر می کنم منظورتون از انتخاب زبان برای RTL کردن صفحه است. آیا این روش در FF هم جواب می ده؟

چون منم یه RSS Generator ساختم و از تگ مربوطه هم استفاده کردم ولی فقط در IE جواب میده!

Behrouz_Rad
سه شنبه 27 فروردین 1387, 16:41 عصر
من فکر می کنم منظورتون از انتخاب زبان برای RTL کردن صفحه است. آیا این روش در FF هم جواب می ده؟

بله دقیقا منظورم همین هست. مختص +IE 7 هست و در Firefox جواب نمیده. تیم توسعه ی Firefox باید برای این موضوع راه حلی رو مبتنی بر RSS ارائه بده.
هر چند پلاگین هایی (http://inforss.mozdev.org/) برای حل این مشکل در Firefox وجود داره.

موفق باشید.

Behrouz_Rad
پنج شنبه 10 مرداد 1387, 07:56 صبح
به مناسبت تولدم! سورس کدهای این کتابخانه رو تحت لایسنس GPL نسخه ی 2 در سایت CodePlex قرار دادم:
http://www.codeplex.com/behoorss

موفق باشید. :لبخندساده:

mvardin
پنج شنبه 14 شهریور 1387, 12:11 عصر
با سلام
یه مشکل کوچیک در استفاده از لینک

new Uri("http://site.com")
دارم ...
تو این حتما http باید گذاشته بشه و نمی شه از عباراتی مثل زیر استفاده کرد:

"site.aspx?id="+id
بنظرتون باید چی کار کنم؟

mvardin
شنبه 16 شهریور 1387, 09:06 صبح
هر سوال یا مشکلی که در رابطه با این کتابخانه دارید در همین تاپیک مطرح بفرمایید.

دوستان عزیز کسی نمی دونه چه جوری می تونم این کار رو انجام بدم ( پست قبلی )
اگه نمی شه برم سراغ یه راه حل دیگه ؟

Behrouz_Rad
شنبه 16 شهریور 1387, 09:52 صبح
تازه سوال شما رو دیدم. چرا از URL کامل استفاده نمی کنی؟

mvardin
یک شنبه 17 شهریور 1387, 14:26 عصر
سلام
به فرض از URL کامل استفاده کردم ...
ایجاد


?id="+id

چی ؟
در قسمت URL نمیشه از الحاق دو رشته استفاده کرد ...
میشه یه راهی پیشنهاد کنید تا بشه URLای مثل زیر رو وارد کرد:


"http://site.com/post.aspx?id="+id

Behrouz_Rad
یک شنبه 17 شهریور 1387, 14:39 عصر
خیلی ساده است دوست من!
سازنده ی Uri یک مقدار رشته ای رو می پذیره. به راحتی می تونی رشته ها رو در پارامتر این سازنده به هم الصاق کنی:


int i = 2;
OBJ_CHANNEL.Items.Add(new RssItem("اولین خبر", new Uri("http://www.site.com/news.aspx?id=" + i.ToString()), "متن خلاصه اولین خبر"));

توجه داشته باش که RSS Reader ها نیاز به URL کامل برای باز کردن لینک Feed دارند و URL ناقص مجاز نیست!

موفق باشید.

merlin_vista
یک شنبه 21 مهر 1387, 15:24 عصر
سلام دوستان :
من يه مشكل داشتم :
من وقتي با استفاده از اين كامپونت كه آقا بهروز نوشتن ميخواهم RSS را بسازم . وقتي اين لينك را ميدم خطا ميگيره و آر اس اس لود نميشه .

OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.domain.com/Default.aspx?action=more&id=15"), "متن خلاصه دومین خبر");

جالب اينحاس كه اگه پارامتر Id را حذف كني كار ميكنه .. يعني اگه فقط يك پارامتر باشه كار ميكنه . ولي من احتياج به دو پارامتر دارم .

پيغام Ie اينه :

Internet Explorer cannot display this feed

merlin_vista
سه شنبه 30 مهر 1387, 17:56 عصر
از دوستان كسي به اين مشكل بر نخورده ...
آقاي راد ميشه اين باگ را رفع كني ...

ممنون .....

Behrouz_Rad
پنج شنبه 02 آبان 1387, 15:45 عصر
موردی که دوست عزیز، merlin_vista گزارش کرده بود، یک باگ بود که اون رو بر طرف کردم.
نسخه ی جدید رو از پست اصلی دانلود بفرمایید.

Behrouz_Rad
دوشنبه 13 آبان 1387, 18:59 عصر
به نظرت وقتی میشه خودمون به صورت دستی در صفحه ی وب بنویسیم input تا یک دکمه رو تولید کنیم، چرا مایکروسافت اجازه میده تا ما فقط اون را Drag کنیم و روی فرم بندازیم تا این کد خودش بعد از پروسه ای به صفحه اضافه بشه؟

به نظرت وقتی که ما خودمون می تونیم کوکی تصدیق هویت بر روی سیستم کاربر بفرستیم، چرا مایکروسافت سیستم Membership رو ارائه داده؟

به نظرت وقتی ما خودمون می تونیم یه Handler واسه تولید تصاویر امنیتی درست کنیم، چرا باید از CAPTCHA استفاده کنیم؟

اصلاً به نظرت چه دلیلی برای استفاده از کامپوننت در برنامه نویسی وجود داره؟

SnowBlind
جمعه 22 آذر 1387, 03:45 صبح
سلام
من از کتابخانه شما استفاده کردم، واقعا خوب و کامل بود. 2 تا سؤال داشتم:

1) میخواستم ببینم برای ایجاد RSS برای سایت هایی که درخواست های زیادی برای RSS دارند مثل وبلاگ ها (مثلا worpress.com) همین شیوه write کردن روی صفحه مناسب میباشد یا نه؟

2) RSS Reader ها برای مطلع شدن از آپدیت ها چگونه عمل میکنند؟ مثلا در چه بازه زمانی به لینک سر میزنند؟

Behrouz_Rad
جمعه 22 آذر 1387, 10:53 صبح
1) میخواستم ببینم برای ایجاد RSS برای سایت هایی که درخواست های زیادی برای RSS دارند مثل وبلاگ ها (مثلا worpress.com) همین شیوه write کردن روی صفحه مناسب میباشد یا نه؟

بله مناسبه.


2) RSS Reader ها برای مطلع شدن از آپدیت ها چگونه عمل میکنند؟ مثلا در چه بازه زمانی به لینک سر میزنند؟

RSS Reader ها معمولاً از فیلد guid متوجه میشن که اون اخبار جدید هست. فیلد guid هر فید رو برابر با فیلد identity رکورد قرار بدید.
البته اگر guid وجود نداشته باشه، معمولاً از روش های دیگه ای مثل بررسی تاریخ انتشار خبر استفاده می کنند.

موفق باشید.

SnowBlind
یک شنبه 24 آذر 1387, 00:35 صبح
RSSReader فایرفاکس <pubDate> رو نمایش نمیده. در مثالی که همراه سورس دادید این تگ با
DateTime.Now.AddHours(-3) پر میشود. که مثلا میشه
12/12/2008 8:47:11 PM. فکر کنم دلیلش این باشه که از rfc822 (http://asg.web.cmu.edu/rfc/rfc822.html#sec-5) پیروی نمیکنه. درسته؟

Behrouz_Rad
یک شنبه 24 آذر 1387, 10:07 صبح
اتفاقاً دقیقاً از RFC 822 پشتیبانی میکنه. من سورس های این پروژه رو هم در CodePlex قرار دادم. به R دقت کن:


SB.AppendLine(string.Format("<pubDate>{0:R}</pubDate>", item.PubDate.ToString()));


خروجی این برنامه کاملاً منطبق بر استاندارد RSS هست. در پست اصلی لینک استانداردهای RSS رو گذاشتم.

موفق باشید.

SnowBlind
دوشنبه 25 آذر 1387, 01:59 صبح
درسته حق با شماست، منم بررسی کردم مشکلی تو استاندارد نبود. ولی نمیدونم چرا firefox RSSReader تگ <pubDate> رو نمایش نمیده!!!
شما خودت با firefox تست کردی؟

Behrouz_Rad
دوشنبه 25 آذر 1387, 10:29 صبح
یا تشکر از شما.
مشکل در نحوه ی عجیب برخورد دات نت با سویچ R بود. دات نت با سویچ R در حالتی که در پارامتر اول متد Format کلاس String استفاده بشه برخورد اشتباهی داره! بنابراین باید سویچ R یا r رو به متد ToString پاس داد.
نسخه ی آپدیت شده رو از پست اصلی دانلود بفرمایید.

موفق باشید.

SnowBlind
پنج شنبه 28 آذر 1387, 02:26 صبح
آره فقط R نیست سوییچ های دیگه رو هم اعمال نمیکنه!!!!

من به صورت زیر تغییرش دادم و مشکل حل شد:

SB.AppendLine(string.Format("<pubDate>{0}</pubDate>", this.PubDate.ToString("R", DateTimeFormatInfo.InvariantInfo)));

mojniknam
سه شنبه 01 بهمن 1387, 21:21 عصر
من اینو دانلود کردم و توی پوشه تست رفتم و برنامه رو اجرا کردم
ولی ارور میده

Line 49: ASP.NET to identify an incoming user.
Line 50: -->
Line 51: <authentication mode="Windows" />
Line 52: <!--
Line 53: The <customErrors> section enables configuration

hobab-theme
پنج شنبه 28 خرداد 1388, 22:41 عصر
سلام آقا بهروز عزیز
ببخشید که یه سوال مسخره میپرسم
ولی میخوام بدونم که ما باید تمام لینکها و توضیحات و ... رو دستی وارد کنیم؟
آیا نمیشه کاری کرد که این برنامه خودش هوشمند لینکها و توضیحات و ... رو ایجاد کنه؟
ممنون

محمدامین شریفی
یک شنبه 28 تیر 1388, 22:50 عصر
خسته نباشید آقای راد.
آیا این RSS Generator از خواصیت podcast (http://podcastgen.sourceforge.net)هم پشتیبانی می کند؟
همانطور که دوستان گفتند،اگر بصورت خودکار تولید RSS بکند،بهتر است.
خوشحالم که در دنیای رقابتی،تجاری امروز،کسی هم به فکر زبان پارسی است.

si6arp
چهارشنبه 08 تیر 1390, 02:17 صبح
سلام دوستان :
من يه مشكل داشتم :
من وقتي با استفاده از اين كامپونت كه آقا بهروز نوشتن ميخواهم RSS را بسازم . وقتي اين لينك را ميدم خطا ميگيره و آر اس اس لود نميشه .

OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.domain.com/Default.aspx?action=more&id=15"), "متن خلاصه دومین خبر");

جالب اينحاس كه اگه پارامتر Id را حذف كني كار ميكنه .. يعني اگه فقط يك پارامتر باشه كار ميكنه . ولي من احتياج به دو پارامتر دارم .

پيغام Ie اينه :

Internet Explorer cannot display this feed

تا اونجایی که عقل ناقص من میگه نمیشه از یک سری کاراکتر ها استفاده کرد مقل همین : &
شما باید به جای "&" از "&amp;" استفاده کنید تا مشکل برطرف بشه . باز هم اگه نشد بگید تا یه راه دیگه واسش پیدا کنیم :دی

fakhravari
شنبه 22 مهر 1391, 13:12 عصر
با سلام
ممنون از اقای راد
چنتا سوال اولیه هم دوستان کرده بودن در مورد لینک هایی که بیشتر از 1 پارانتر داشت .
من هم همین مشکل دارم یعنی من به صورت زیر استفاده میکنم.
for (int i = 0; i < dt.Rows.Count; i++)
{
string link = "http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + "";
OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri(link), dt.Rows[i]["Message"].ToString()));
}
زمانی که با 1 پارمتر باشه مشکلی نیست اما زمانی که پارامتر 2 "&Subject=" وارد میشه برنامه خطا میگیره یعنی چیزی نمایش نمیده.

Behrouz_Rad
یک شنبه 23 مهر 1391, 08:20 صبح
با سلام
ممنون از اقای راد
چنتا سوال اولیه هم دوستان کرده بودن در مورد لینک هایی که بیشتر از 1 پارانتر داشت .
من هم همین مشکل دارم یعنی من به صورت زیر استفاده میکنم.
for (int i = 0; i < dt.Rows.Count; i++)
{
string link = "http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + "";
OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri(link), dt.Rows[i]["Message"].ToString()));
}
زمانی که با 1 پارمتر باشه مشکلی نیست اما زمانی که پارامتر 2 "&Subject=" وارد میشه برنامه خطا میگیره یعنی چیزی نمایش نمیده.
من با چند پارامتر تست کردم اما مشکلی ندیدم.
فایل ضمیمه رو بررسی کنید.

fakhravari
یک شنبه 23 مهر 1391, 16:56 عصر
خیلی جالب بود.
چون کاریشم نکردم ولی تست کدم کار داد .
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("File.xml"));
DataTable dt = ds.Tables[0].Copy();

RssChannel OBJ_CHANNEL = new RssChannel("site", new Uri("http://www.site.com/"), "best");
for (int i = 0; i < dt.Rows.Count; i++)
{
OBJ_CHANNEL.Items.Add(new RssItem(dt.Rows[i]["Subject"].ToString(), new Uri("http://www.fakhravary.somee.com/Show/Display_PostID.aspx?TopicID=" + dt.Rows[i]["TopicID"] + "&Subject=" + dt.Rows[i]["Subject"] + ""), dt.Rows[i]["Message"].ToString()));
}
OBJ_CHANNEL.GenerateRss(this.Context);
}

fakhravari
دوشنبه 24 مهر 1391, 13:21 عصر
با سلام
پست اخر تصحیح میکنم تا پست دیگری نزنم.
در سوالات بالا فکر کنم من کمی dll دستکاری کرده بودم که در اتصالات لینک خطا به وجود میومد .
دوباره کلاس برسی کردم و بدون مشکل کار کرد.:لبخند:

fakhravari
دوشنبه 22 آبان 1391, 23:44 عصر
با سپاس از اقای راد.
اینم چنا نمونه RSS
https://github.com/keyvan/PodcastRssGenerator4DotNet/
https://github.com/keyvan/PodcastRssGenerator4DotNet/archive/master.zip
http://www.30sharp.com/article/2/344/1/%D8%AE%D9%88%D8%A7%D9%86%D8%AF%D9%86-%D9%81%DB%8C%D8%AF-%D9%87%D8%A7%DB%8C-rss-%D8%A7%D8%B2-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%D9%85%D8%AE%D8%AA%D9%84%D9%81-%D9%88-%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1-%D9%85%D8%AC%D9%85%D9%88%D8%B9-%D8%A2%D9%86-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA-rss.aspx

fakhravari
شنبه 27 آبان 1391, 02:22 صبح
اقای راد در نمونه شما چطوری میتونم عکس وارد کنم؟

hlikehamed
یک شنبه 30 تیر 1392, 21:46 عصر
سلام
من از کتابخانه شما و چند نمونه دیگه برای تولید RSS استفاده می کنم ولی در همه اونها گاهی به جای نمایش صحیح RSS پیغام زیر نمایش داده میشه و به صورت xml صفحه لود میشه

This XML file does not appear to have any style information associated with it. The document tree is shown below.


مشکل از چیست ؟

hlikehamed
یک شنبه 30 تیر 1392, 22:33 عصر
تا اونجایی که من متوجه شدن خطای زیر وقتی اتفاق میافته که commresionmode رو روی medium قرار بدیم. اما یه مشکل دیگه ای که باهاش برخورد می کنم اینه وقتی مود رو روی High قرار میدم باز هم گاهی با پیغام زیر مواجه میشم :

Content Encoding Error

The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.

Please contact the website owners to inform them of this problem.




سلام
من از کتابخانه شما و چند نمونه دیگه برای تولید RSS استفاده می کنم ولی در همه اونها گاهی به جای نمایش صحیح RSS پیغام زیر نمایش داده میشه و به صورت xml صفحه لود میشه

This XML file does not appear to have any style information associated with it. The document tree is shown below.


مشکل از چیست ؟

fakhravari
یک شنبه 06 مرداد 1392, 20:34 عصر
با چه تگی عکس اضافه کنم؟:لبخندساده:

komeil64
سه شنبه 09 مهر 1392, 14:39 عصر
من می خواستم با تگimage کار کنم اما آدرس قبول نمی کنه!
OBJ_CHANNEL.Image.URL

fakhravari
سه شنبه 09 مهر 1392, 19:29 عصر
اقای راد در مورد عکس توضیح میدید

komeil64
چهارشنبه 10 مهر 1392, 09:29 صبح
من خیلی به این مورد نیاز دارم کسی می تونه کمک کنه؟