Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

Пишемо RSS агрегатор на Delphi

  1. теорія RSS
  2. Трішки історії
  3. Формат RSS зсередини
  4. форма програми
  5. створюємо БД
  6. імпортуємо RSS
  7. імпорт новин
  8. Експорт новин в RSS
  9. Експорт новин в файл
  10. Coding complete

У кожного з нас є безліч улюблених сайтів, за оновленнями яких постійно доводиться стежити. Добре, коли таких сайтів небагато: зайшов на головну сторінку, почитав новини і пішов. Біда в тому, що у бувалих користувачів інтернету таких сайтів кілька десятків. Як встежити за кожним з них? Постійно бігати по десяткам посилань, ганяючи дорогоцінний трафік? Ні! Набагато простіше і зручніше отримувати новини в форматі RSS.

Як відомо, для читання новин в форматі RSS створені програми - RSS-агрегатори. Стоїмо їм тільки підсунути посилання на стрічку новин, як вони тут же починають пильно стежити за оновленнями і показувати все топіки в зручному вигляді. Багато розробники вже давно вбудовують читалки RSS в свої браузери. Таким шляхом пішли розробники Opera, FireFox, IE і багато інших.

Використовувати готові програми - добре, але ще краще навчитися створювати їх самостійно (це подарує тобі дивну легкість в плані отримання та хакерського розподілу інформації;)). Для цього потрібно тільки виділити час і розібратися з форматом RSS.

теорія RSS

Абревіатура RSS розшифровується як Really Simple Syndication, що в перекладі на великий і могутній означає «дійсно проста доставка». Завдяки цьому формату все ми можемо оперативно отримувати новини з своїх улюблених порталів, не чекаючи довгої завантаження сайтів. Ми отримуємо тільки найнеобхідніше, наприклад тему новини, коротеньке опис, дату публікації та посилання на повний текст. Економія трафіку, особливо для GPRS-користувачів, дуже істотна.

Але не варто думати, що формат RSS призначений лише для публікації новин. Зовсім ні. Використовуючи цю технологію, можна запросто передавати інформацію, скажімо, з форуму, гостьової книги і т.д.

Трішки історії

Вперше в історії думки про подібну технології розподілу інформації виникли у мізкуваті хлопців з компанії User Land, які в 1997 році зарелізілі свій формат - sсripting news. Формат вийшов непоганим, але не прижився. Причому не прижився з вини всім відомої компанії Netscape. У той час вона виступала законодавцем моди в світі інтернет-технологій, і конкурувати з нею було досить важко. Пару років тому виходить розроблений на основі sсripting news формат RSS 0.9. Як не дивно, його розробником стала сама Netscape. Формат почав поступово вливатися в маси, але багато хто визнав його занадто складним і незручним, тому Netscape нічого не залишалося, як зайнятися його вдосконаленням. В результаті була випущена версія 0.9.1. На цей раз формат вийшов досить гнучким і в той же час більш простим у використанні. На жаль, і новий реліз не зміг завоювати серця web-розробників. В результаті Netscape вирішує згорнути розробку RSS і зосередити свої зусилля на інших проектах. Зрозуміло, напрацювання по проекту не були викинуті на звалище - право на розробку і розвиток цього проекту було передано вже згадуваної компанії User Land. Всі ті ж мізкуваті хлопці стали активно вдосконалювати формат і через деякий час явили світу версію 0.9.2.

У той же самий час організація RSS-Dev Working Group, яка бореться за збереження формату версії 0.9, випустила версію 1.0, в основу якої лягли ідеї версії 0.9. Версія 1.0 почала набирати обертів ... і знову-таки не отримала широкого визнання в комп'ютерному співтоваристві з причин, загальмували поширення версії 0.9.

2002 щорічно стає золотим роком для RSS. Компанія User Land випускає другу версію (2.0) цієї чудової технології, і вже вона породжує справжнісінький бум в сфері інтернет-технологій. Багато web-розробники оцінили її привабливість і почали використовувати в своїх проектах. Через рік в рамках ліцензії Creative Commons стає доступною специфікація до формату RSS 2.0.

Формат RSS зсередини

З точки зору програміста стрічка RSS являє собою звичайний xml-подібний файл. У ньому містяться певні специфікацією елементи. Про всі них ти зможеш прочитати в документації, ми розглянемо тільки основні:

  • rss - елемент визначає початок стрічки новин. У цьому елементі необхідно вказувати версію формату.
  • channel - інформація про новинному каналі. У цьому елементі ти можеш встановити заголовок сайту (title), посилання (link), опис (description) і мову (language).
  • item - в елементі задається інформація про інформації, що публікується новини. Всю необхідну інфу потрібно задавати за допомогою тих же елементів, які використовуються в channel [/ code].
  • Для того щоб краще розібратися з форматом, подивися ось сюди:

    Приклад файлу з новинами

    <? Xml version = "1.0&quot; encoding = "windows-1251"?> <Rss version = "2.0"> <channel> <title> Мій суперсайт </ title> <link> http://mysite.com </ link > <description> Все, що вам потрібно, є тут? </ description> </ channel> <item> <title> Новость 1 </ title> <link> http://mysite.com/news1.txt </ link > <description> Сьогодні відкрився мій сайт </ description> <pubDate> Fri, 15 aug 2007 +1100 </ pubDate> <author> Spider_NET ​​</ author> </ item> </ rss>

    форма програми

    Програмувати свій RSS-агрегатор ми будемо на великому і могутньому Delphi (редактор погодився опублікувати статтю, тільки якщо я використовую не менше 10 хвалебних епітетів на адресу Delphi на 10 кілобайт плайн-тексту :(), тому запускай цю IDE і малюй форму, подібну зображеною на малюнку.

    У верхній частині форми у мене розташована панель з кнопками, трохи нижче - DbGrid (необхідний для відображення даних з БД) і в самому низу - DBMemo (в ньому буде відображатися текст новини). Я згадав про базу даних. Сьогоднішній приклад дійсно буде працювати з базою даних. Набагато краще зберігати і правити все новости в БД, ніж мучитися з текстовими файлами. Тим більше що, використовуючи БД, ти завжди можеш з легкістю організувати пошук потрібної новини і багато чого ще. За базу даних ми будемо використовувати MS Access.

    створюємо БД

    З вибором БД ми визначилися, тепер саме час її створити і підключити до Delphi. Запускай MS Access, створюй нову БД, зберігай її куди-небудь і переходь до створення таблиці в режимі конструктора.

    У таблиці нам буде потрібно 6 полів:

  • id - лічильник, ключове поле (унікальне поле);
  • title - текстовий (заголовок новини);
  • link - текстовий (посилання на новину);
  • description - текстовий (поле MEMO);
  • author - текстовий (автор новини);
  • pubDate - текстовий (дата новини; можна було задати в якості типу «Дата / Час», але, щоб не напружуватися з перетворенням дати, вказуємо текстовий).
  • Зберігаємо таблицю. Як ім'я я вказав rss. На цьому етапі можна закрити Acсess і повернутися до Delphi. Кидай на форму AdoTable (ADO) і DataSource (Data Access). Вибирай спочатку компонент DataSource і у властивості DataSet - AdoTable. Тепер прийшла черга центрового компонента при роботі з БД - AdoTable. Двічі клацай по властивості ConnectionString. Перед тобою з'явиться віконце, в якому тобі потрібно натиснути пімпу Build. На екрані відобразиться форма, в ній необхідно налаштувати підключення до БД.

    Спочатку перейди на закладку «Постачальник даних» і серед провайдерів знайди Microsoft Jet 4.0 OLE DB Provider. Давай і тисни «Далі». В поле вибору БД введи ім'я або шлях до створеної БД. Якщо ти зберіг базу в папку з програмою, то в цьому полі просто вкажи її ім'я. Так твоя база не буде прив'язана до якогось певного шляху, а завжди буде шукатися в папці з програмою. Установи прапорець «Порожній пароль». Це необхідно для того, щоб постійно не вискакувало віконце з проханням його введення.

    Отже, все готово, можна протестувати підключення. Натисни на кнопку «Перевірити підключення». Якщо не було допущено помилок, то ти побачиш повідомлення з текстом: «Перевірка підключення виконано». В іншому випадку тобі доведеться перечитати частину статті заново. Повертайся до форми і швиденько виділяй компоненти DbGrid і DbMemo. У об'єктом інспектора шукай властивість DataSource і вибирай в ньому DataSource1. Тепер ці компоненти пов'язані з нашою таблицею, а значить, в них будуть відображатися дані з БД.

    Тепер все готово для того, щоб встановити активність нашої таблиці. Знову ж вибирай AdoTable, у властивості TableName знаходь нашу таблицю, властивість Active виставляй в true. У DbGrid повинні з'явитися колонки з іменами створених нами полів. Відображати всі поля в DbGrid нам абсолютно ні до чого, тому 2 рази клацай по компоненту AdoTable і у вікні натискай (можна просто натиснути правою клавішею щури в області вікна і вибрати AddAllFields). Вікно заповниться іменами полів. Виділи будь-яке ім'я поля, і його властивості моментально відобразяться в об'єктному інспектора. Найбільшої уваги заслуговують:

  • DisplayLabel - назва, яке буде відображатися в заголовку колонки DbGrid. Вказуй тут нормальні імена.
  • DisplayWidth - ширина колонки. За замовчуванням ширина колонки в DbGrid дорівнює розміру поля. У більшості випадків це незручно, тому краще вказати розмір вручну.
  • Name - ім'я для доступу до поля.
  • Visible - видимість поля.
  • У своєму прикладі я дав всім полям нормальні імена, поміняв розмірність і зробив невидимими поля Description і ID. Значення поля Description у нас буде відображатися в DbMemo, а значення ID бачити взагалі не потрібно.

    імпортуємо RSS

    Для імпорту новин нам доведеться відкрити файл з новинами і пропарсіть його, витягуючи інформацію про них. Назви найбільш важливих елементів формату RSS я описав, тому можеш написати парсер самостійно. Але мінуси подібного шляху - клопітно налагодження і проблеми з сумісністю. Інший спосіб вирішення цього завдання передбачає використання готового xml-парсера. Їх досить багато, тому є з чого вибрати. Для нашого прикладу ми так і зробимо - скористаємося розробкою від Microsoft - MSXML. Модуль для роботи з цим парсером вже є в складі Delphi, тому тобі не доведеться нічого додатково качати і встановлювати. Робота з парсером відбувається через об'єкт XMLDOMDocument. Об'єкт має безліч методів, найбільш важливі з них перераховані в таблиці.

    Метод Значення Load (url) Завантажує xml-документ LoadXML (xmlString) Завантажує xml-документ Save (targerStr) Зберігає документ в файл CreateElement (name) Додавання нового елемента CreateTextNode (text) Запис тексту в документи / елемент CreateAttribute (name) Установка атрибутів для елемента SelectSingleNode (patternString) Посилання на об'єкт типу IXMLDOMNodeList CloneNode (deep) Копіювання поточного елемента

    Як я вже сказав, методів досить багато, тому, якщо тобі потрібно дізнатися про призначення того чи іншого методу / властивості, щось не полінуйся зазирнути в бібліотеку msdn. У ній знайдеш відповіді на всі питання. Код імпорту новин з файлу наведено трохи нижче. Перепиши весь код і повертайся сюди за поясненням. Перед переписуванням не забудь підключити модуль MSXML і ActiveX.

    імпорт новин

    var _rss_doc: IXMLDOMDocument; _node: IXMLDOMNode; i: Integer; begin if not (openDialog1.Execute) then Exit; // Ініціалізція _rss_doc: = CoDomDocument.Create; _rss_doc.async: = false; // Завантажуємо документ _rss_doc.load (OpenDialog1.FileName); // Якщо виникла помилка, то показуємо повідомлення if _rss_doc.parseError.errorCode <> 0 then begin ShowMessage ( 'При завантаженні файлу сталася помилка!' + # 13 # 10 + 'Код помилки:' + IntToStr (_rss_doc.parseError.errorCode) + # 13 # 10 + 'Текст помилки:' + _rss_doc.parseError.reason + # 13 # 10 + 'Рядок з помилкою:' + IntToStr (_rss_doc.parseError.line) + # 13 # 10 + 'Символ в рядку з помилкою: '+ IntToStr (_rss_doc.parseError.linepos)); CoUnInitialize; Exit; end; // Отримуємо доступ до елементу rss _node: = _rss_doc.selectSingleNode ( '// rss'); // У циклі отримуємо кожну новину for i: = 0 to _node.selectNodes ( '// item'). Length-1 do begin try adotable1.Insert; title.value: = _ node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'title'). Text; link.value: = _ node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'link'). Text; description.Value: = _ node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'description'). Text; pubDate.Value: = _ node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'pubDate'). Text; author.Value: = _ node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'author'). Text; adotable1.Post; adotable1.Post; except End; end;

    Перед тим як почати парсити, нам потрібно форматувати об'єкт типу IXMLDomDocument. У моєму випадку це змінна _rss_doc. Ініціалізація відбувається стандартним способом - за допомогою виклику методу Create у сокласса CoDomDocument. Після ініціалізації необхідно відключити асинхронний режим. Для нашого прикладу він не знадобиться. Тепер треба спробувати виконувати саму завантаження. Завантаження виконується за допомогою методу load. Як параметр йому потрібно передати ім'я файлу, який і буде завантажений. Завантаживши файл, парсер почне перевіряти його на коректність. У разі знаходження помилок процес парсинга перерветься, і нам доведеться показати повідомлення про помилку, звільнити виділену пам'ять і зупинити подальше виконання процедури.

    При виникненні помилки є можливість показати додаткові відомості, які допоможуть виправити документ, і спробувати завантажити його знову. Серед таких я показую код помилки (parseError.errorCode), текст помилки (parseError.reason), номер рядка з помилкою (parseError.line) і символ в рядку, з якого починається помилка (parseError.linepos). Маючи в своєму розпорядженні цією інформацією, легко знайти і виправити помилку.

    Повернемося до нашого коду і уявімо, що ніяких помилок не виникло, і отже, нам можна починати висмикувати новини. У змінну _node ми отримуємо посилання на елемент. Для отримання посилання я використовую метод SelectSingleNode.

    _node: = _rss_doc.selectSingleNode ( '// rss');

    В якості єдиного параметра йому потрібно передати ім'я елемента. Отримавши батьківський елемент, ми запросто зможемо звернутися до будь-якого дочірньому (згадай структуру RSS-файлу, всі наявні елементи / теги якраз і є дочірніми по відношенню до). Кожна новина в RSS - це окремий блок. Щоб дізнатися кількість певних елементів в xml-документі, потрібно заглянути в властивість length. Наприклад, щоб подивитися, скільки всього в документі елементів title, варто звернутися до length таким чином:

    _node.selectNodes ( '// title'). length

    Так само я дізнаюся, скільки всього в документі елементів. Знаючи їх кількість, легко написати цикл, в якому реалізується послідовний перебір всіх елементів і отримання укладеної в них інформації. Після запуску циклу починається найцікавіше - читання самих новин і їх подальше їх збереження. Оскільки всі дані ми домовилися зберігати в БД, то, перед тим як в неї щось додати, необхідно викликати метод Insert нашої таблиці:

    adotable1.Insert;

    При виклику цього методу в таблиці створюється нова порожня запис. Нам лише залишається заповнити всі поля. Як значення для поля title (заголовок) я привласнюю вміст елемента title поточного елемента item.

    _node.selectnodes ( '// item'). item [i] .selectSingleNode ( 'title'). Text;

    Решта поля отримують значення тим же способом. Коли всі поля будуть заповнені, бажано зберегти внесені в таблицю зміни. Для цього я викликаю метод post компонента adoTable.

    Експорт новин в RSS

    Провести імпорт новин нам люб'язно допоміг парсер від дядька Білла. Експорт новин з бази в файл можна здійснити таким же способом. Все, що тобі потрібно, - це трохи часу на розбір методів: CreateElement (), CreateTextNode (), CreateAttribute (), CreateNode ().

    Робота з цими методами нітрохи не складна, крім того, всі нюанси розписані в msdn. Тому експорт новин описаним способом я залишаю під твою відповідальність. В крайньому випадку ти завжди можеш поставити мені запитання по милу. У своєму прикладі експорт новин я організував простішим способом. Найбільш важливі моменти коду наведені нижче. Весь процес організований на стандартних функціях додавання / збереження тексту в файл. Коментарі зайві. Єдине, на що варто звернути увагу, - це перебір всіх записів в таблиці нашої БД. Кількість записів зберігається у властивості RecordCount. Перед тим як перебирати записи, потрібно встановити курсор на найпершу. Це робиться за допомогою методу First компонента AdoTable. Після читання значень всіх полів чергового запису, потрібно пересунути курсор, інакше ми постійно будемо отримувати одні і ті ж значення. Перехід на наступний запис здійснюється методом Next все того ж AdoTable.

    Експорт новин в файл

    var _header: string; _bottom: string; _rss_file: TStringList; _temp: Widestring; i: integer; begin _header: = '<? xml version = "1.0&quot; encoding = "windows-1251"?>' + # 13 # 10 + '<rss version = "2.0">' + # 13 # 10 + '<channel>' + # 13 # 10 + '<title> Новини мого суперпортала </ title>' + # 13 # 10 + '<link> http://vr-online.ru </ link>' + # 13 # 10 + '< description> Суперпопулярний канал </ description> '+ # 13 # 10 +' <lastBuildDate> Sun, 05 Aug 2007 7:30:01 +0400 </ lastBuildDate> '+ # 13 # 10 +' <ttl> 1 </ ttl > '; adoTable1.First; for i: = 0 to adoTable1.RecordCount-1 do begin _temp: = '<item>' + # 13 # 10 + '<title>' + ClearText (title.AsString) + '</ title>' + # 13 # 10+ '<link>' + ClearText (link.AsString) + '</ link>' + # 13 # 10 + '<description>' + ClearText (description.AsString) + '</ description>' + # 13 # 10+ '<author>' + author.AsString + '</ author>' + # 13 # 10 + '<pubDate>' + pubDate.AsString + '</ pubDate>' + # 13 # 10 + '</ item>' ; _rss_file.Add (_temp); adoTable1.Next; end;

    Coding complete

    Отже, твій перший RSS-агрегатор готовий, треба починати тестувати. Як тест спробуємо згодувати йому файл зі стрічкою новин сайту твого улюбленого журналу (www.xakep.ru). Беремо качалку (причому не будь-яку, а свою - читай статтю «Delphi для качків») і зберігаємо дані з asp?rss_cat=post> www.xakep.ru/articles/rss/default.asp?rss_cat=post . Одержаний файл пробуємо відкрити в нашій програмі. У разі відсутності помилок твоя база даних заповниться останніми новинами www.xakep.ru .

    Стаття опублікована журналі "Хакер" (http://xakep.ru). Жовтень 2007 р

    Посилання на опубліковану статтю сайту видання: http://goo.gl/FDkh2W

    Посилання на журнал: http://goo.gl/OiGHYi

    Вихідні тексти RSS-агрегатора на Delphi

    Як встежити за кожним з них?
    Постійно бігати по десяткам посилань, ганяючи дорогоцінний трафік?
    Quot; encoding = "windows-1251"?
    Com </ link > <description> Все, що вам потрібно, є тут?
    Quot; encoding = "windows-1251"?
    Asp?

    Новости

    Banwar.org
    Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.