PDA

View Full Version : آموزش: ایجاد یک RSS Reader ساده و در عین حال پیشرفته با AJAX



MMSHFE
یک شنبه 23 بهمن 1390, 09:03 صبح
چند روز قبل یکی از دوستان (http://barnamenevis.org/member.php?129163-mahmod2000) توی این تاپیک (http://barnamenevis.org/showthread.php?327243-%D8%A7%DB%8C%D9%86-%DA%A9%D8%AF-%DA%86%D8%B1%D8%A7-%D9%88%D8%A7%D8%B3%D9%87-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%AF%DB%8C%DA%AF%D9%87-%DA%A9%D8%A7%D8%B1-%D9%86%D9%85%DB%8C%DA%A9%D9%86%D9%87%D8%9F&p=1439164) کدی رو به نقل از سایت w3schools گذاشتن که برای خوندن RSS سایتها بکار میرفت ولی با برخی از سایتها مشکل داشت. وقتی دقیقتر بررسیش کردم، دیدم نه تنها با سایتهای ایرانی یکسری مشکلات داره (بیشتر بخاطر ساختار غیراستاندارد RSS این سایتها) بلکه با فیدهای ATOM هم مشکل داره و نمیتونه آدرس سایت رو به درستی از داخل اون سایتها استخراج کنه. برای همین کمی اون کد رو تغییر دادم و نهایتاً کدی شد که ضمیمه کردم. مزایای این اسکریپت:
1- استفاده از jQuery و AJAX
2- امکان تعیین تعداد اخبار برای نمایش
3- امکان ذخیره آدرس فیدها در دیتابیس
4- سازگاری مناسب با فیدهای سایتهای مختلف
5- وجود این آموزش درخصوص نحوه کار اسکریپت :چشمک:
-----
توضیح کدها:
فایل config.php که مربوط به تنظیمات هست و کار خاصی انجام نمیده، فقط یادتون باشه حتماً اون رو ویرایش کنید و نام کاربری و رمز عبور و... رو متناسب با تنظیمات سرور خودتون اصلاح کنید.
فایل index.php هم که یک فرم ساده است برای دریافت اطلاعات از کاربر (اخبار چه سایتی رو میخواد و چندتا خبر باید نشون داده بشه). فقط به روش استفاده از AJAX توسط jQuery توی اسکریپت دقت کنید.
و اما فایل getrss.php که اصل کاری هست:
توی این فایل ابتدا عنوان فید و تعداد عناصر از ورودی با روش Get دریافت میشه و آدرس اون فید از دیتابیس استخراج شده و توی متغیر xml$ ذخیره میشه.
بعد، یک شئ از کلاس DOMDocument ایجاد میشه. این کلاس برای پردازش اسناد با قالب HTML و XML و... (کلاً هرچی آخرش ML داره!) بکار میره و میتونیم با استفاده از توابع اون، عناصر رو برحسب تگ مربوطه استخراج کنیم و یکسری کارهای دیگه که اگه خیلی بهش علاقه دارین، میتونید از اینجا (http://ir.php.net/manual/en/class.domdocument.php) توضیحاتش رو بخونید).
خوب ابتدا با استفاده از تابع getElementsByTagName عنصر channel استخراج میشه. دقت کنید که خروجی این تابع، مجموعه ای از عناصر هست که برای استخراج هرکدوم، باید تابع item رو صدا بزنیم و شماره ترتیب عنصر رو به این تابع بدیم. مثلاً برای استخراج اولین عنصر با تگ channel باید (item(0 رو صدا بزنیم.
در ادامه، عنوان و لینک و توضیحات سایت توسط تگهای مربوطه از داخل عنصر channel مربوطه استخراج میشه. از اونجا که در فیدهای ATOM یک تگ atom اضافه داریم و این تگ از نوع تگهای تک هست، با (item(0 نمیتونیم لینک رو استخراج کنیم و از (item(1 استفاده میکنیم چون اولین عنصر به تگ atom داره اشاره میکنه نه به تگ لینک!
از اینجا به بعد، عناصر item توسط همون تابع قبلی، توی متغیر x$ قرار میگیرن. ابتدا با خاصیت length تعدادش رو بدست میاریم. بعد چک میکنیم ببینیم تعدادی که کاربر میخواسته، یک عدد بزرگتر از صفر و کوچکتر از این تعداد هست یا نه. اگه بود، تعداد رو همون عدد درنظر میگیریم وگرنه، تعداد میشه کل اخباری که فید مربوطه نشون میده.
حالا با یک حلقه for، یکی یکی عناصر title و link و description رو از داخل عنصر item مربوطه استخراج کرده و نشون میدیم. به همین راحتی!
اگه سؤالی بود یا جایی از کد نیاز به توضیح بیشتر داشت، در خدمتم.
موفق باشید.

mahmod2000
یک شنبه 23 بهمن 1390, 09:55 صبح
این تابناک یه معذلی شده

الان این کدی که شما گذاشتید رو امتحان کردم که خیلی کد جالب و خلاقانه ای شده

ولی واسه تابناک لینک و تایتل رو میاره پایینش این ارور رو میده : Notice: Trying to get property of non-object in E:\xampp\htdocs\rss\getrss.php on line 31

MMSHFE
یک شنبه 23 بهمن 1390, 10:24 صبح
گفتم که مشکل از استاندارد نبودن فیدهای ایرانی هست. تابناک تگ description نداشت! فایل ضمیمه رو اصلاح کردم.

meysampaknahad
چهارشنبه 11 مرداد 1391, 23:33 عصر
سلام
آیا میشه از این کد در ASP.net استفاده کرد؟

MMSHFE
پنج شنبه 12 مرداد 1391, 16:13 عصر
ASP.NET خودش کلاسهای خوبی برای خوندن RSS داره. هرچند اگه بخواین از این کلاس استفاده کنید، باید دستور زبانش تغییر کنه و به شکل متناسب با ASP.NET در بیاد. مثلاً متغیرها به شکل مناسب تعریف بشن و علامت $ حذف بشه و نوع مقدار بازگشتی توابع تعریف بشه و...

eshpilen
پنج شنبه 12 مرداد 1391, 22:35 عصر
ساده و جالب بود، ولی نمیدونم چرا بهش میگید پیشرفته! مگه بقیهء اینطور برنامه ها همینقدر یا بیشتر پیشرفته نیستن؟

ضمنا بنظرم پارامتر f رو که توی کوئری گذاشته باید Escape کنیم برای امنیت (جلوگیری از SQL Injection).

MMSHFE
جمعه 13 مرداد 1391, 14:59 عصر
eshpilen باز شروع کردی ها! :چشمک: منظورم از پیشرفته، این نبود که بقیه اسکریپتها پیشرفته نیستن. منظورم اینه که انعطاف پذیری مناسبی برای کار با فیدهای مختلف و سهولت در اضافه کردن فیدهای جدید و مدیریت اونها رو داره. ضمناً درمورد بحث امنیت هم ادعا نکردم امنیت کافی داره. درسته Escapeکردن لازمه و هر کاربری میتونه برحسب نیازش این اسکریپت رو توسعه بده.

mehsaa
شنبه 29 تیر 1392, 09:52 صبح
سلام
من از کد شما استفاده میکنم تنظیمات دیتابیس را هم درست میزارم ولی کار نمیکنه
از این کد http://net.tutsplus.com/articles/news/how-to-read-an-rss-feed-with-php-screencast/
هم استفاده کردم ولی بازم چیزی نشون نمیده، میخوام بدونم آیا ربطی به تنظیمات سایت خودم داره این موضوع؟ ممنون

Tarragon
شنبه 29 تیر 1392, 12:17 عصر
سلام
للطفا بگید از RSS کدوم سایت استفاده می کنید تا کمک کنیم بنظرم همونجوری که آقای شهرکی اشاره کردند مشکل از استاندارد نبودن RSS سایت های ایرانی هستش.

mehsaa
شنبه 29 تیر 1392, 12:57 عصر
مرسی از این http://www.bananews.ir/component/obrss/bananews.html

MMSHFE
شنبه 29 تیر 1392, 13:40 عصر
من الآن تست کردم بدون هیچ مشکلی RSS سایت رو خوند. لطفاً کد کاملی که استفاده کردین رو بگذارین.

mehsaa
شنبه 29 تیر 1392, 14:20 عصر
خیلی ممنون زجمت کشیدید
من دقیقا کد خود شما و گذاشتم و توی config تغییرات و انجام دادم و یه جدول هم تو دیتابیسم درست کردم، حتی سایت هایی که خودتون تو کد گذاشتین هم نشون نمیده

MMSHFE
شنبه 29 تیر 1392, 14:22 عصر
روی localhost جواب میده؟ اگه اینطوره باید چک کنید هاستتون remote file open رو پشتیبانی میکنه یا نه. اگر هم روی localhost نتونستین کار کنید، اطلاعات RemoteConnection نرم افزار TeamViewer رو برام بصورت پیام خصوصی بفرستین تا به سیستم شما وصل بشم و روی سیستم خودتون مشکل رو برطرف کنم. موفق باشید.

mehsaa
شنبه 29 تیر 1392, 14:25 عصر
خیلی ممنون، رو لوکاهاست چک نکردم الان چک میکنم، مرسی مزاحمتون میشم

mehsaa
شنبه 29 تیر 1392, 14:32 عصر
روی لوکال هاستم جواب دادش،مشکل چی میتونه باشه؟ و اینکه چطور میتونم اخبار و تو قالب سایت خودم کامل نشون بدم نه اینکه لینک بشه تو سایت اصلی؟ مرسی

MMSHFE
شنبه 29 تیر 1392, 14:36 عصر
گفتم که، به احتمال زیاد روی هاست شما دسترسی به Remote URL بسته شده. میتونید از cURL استفاده کنید. برای نمایش اخبار توی سایت خودتون هم باید متن دریافتی از RSS رو بجای اینکه نمایش بدین، توی دیتابیس ذخیره کنید و از دیتابیس خودتون بخونید و نمایش بدین و قبلش هم لینکها رو اصلاح کنید تا به سایت خودتون اشاره کنن و درصورت لزوم، اگه عکس یا فایل خاصی هم توی متن خبر هست، روی سایت خودتون دانلود کنید.

mehsaa
شنبه 29 تیر 1392, 14:42 عصر
خیلی ممنونم لطف کردید