Немножко велосипедостроения под Linux или RSS-агрегатор на коленке своими руками

в 16:36, , рубрики: linux

Навеяно статьей «Google продолжает уничтожать RSS».

Некоторое время назад возникла у меня надобность читать несколько rss-лент. Вопрос для меня был относительно новым, ранее с rss я дело имел весьма эпизодически, так что начал изучать эту тему и выбирать ридер с чистого листа.

Результаты были… скажем так — не радующими.

На облачные сервисы с веб-интерфейсами, у меня хроническая аллергия пополам с паранойей, и последовавшие похороны гугльридера лишний раз подтвердили, что паранойя плохого не посоветует. Да и регулярные изменения привычных интерфейсов у веб-сервисов тоже не радуют.

Среди локально ставящихся ридеров нашлось несколько штук, которыми я попытался пользоваться, но ни один из них так и не был выбран в качестве рабочего. Тут и раздражающие мелочи, вроде плохо настраиваемого интерфейса, убогих инструментов по фильтрации или странная логика сохранения; и более глобальная проблема с тем, что одной из лент, которые хотелось смотреть, были флибустянские отзывы о книгах, где за сутки запросто может обновиться вся лента, и часть постов в итоге будет пропущена; постоянно же держать ридер запущенным — совершенно не вдохновляющий вариант. А кроме того зоопарк из разнородных читалок на машине разводить не хотелось совершенно.

И тогда, после некоторого времени размышлений о несовершенстве этого мира, и формулирования хотелок — в руки привычно был взят напильник и пара дней была посвящена велосипедостроению.

Результат успешно работает уже год с лишним. Возможно, готовый рецепт кому-то сэкономит время и силы, хотя конечно, рецепт может подойти далеко не всем, поскольку основан он был на том, что уже имелся домашний сервер под Centos 6, круглосуточно подключенный к интернету.

Итак, для построения собственного агрегатора из спичек и желудей, кроме собственно сервера, мне понадобились дополнительно пакеты:
rsstool
ssmtp
fdupes
… а также некоторое время и желание повозиться с perl.

В итоге был написан довольно примитивный скрипт, приводить который полностью нет особого смысла, достаточно будет общей логики работы:

После запуска скрипт считывает список лент из текстового конфига в виде:
habrahabr#http://habrahabr.ru/rss — то есть заголовок, который будет использоваться дальше для работы с лентой, разделитель "#" и сам адрес ленты. Все это, плюс сгенерированные по заголовку имена файлов для сохранения промежуточных данных, заносится в несколько массивов. Затем по этим массивам проходимся foreach(), в котором выполняются следующие действия:

1. Через rsstool скрипт скачивает саму ленту в виде csv с разделителями @, iconv конвертирует скачанное в кодировку koi-8, grep отрезает заголовок, и все это сохраняется в файл для свежескачанного.

rsstool --wget --csv=@  @url[$i](то есть http://habrahabr.ru/rss) | iconv -c -f UTF-8 -t KOI8-R| grep SITE@DATE@URL@TITLE@DESC -v >/path_to_rss2email/feed_new_@rssname[$i].rss (то есть /path_to_rss2email/feed_new_habrahabr.rss)  

2 Натравливаем diff на файл с архивом ленты и файл со свежескачанным. Разница между ними, помеченная ">" и будет требующимися нам новостями, которые появились с момента последнего скачивания. Эта разница записывается в отдельный файл, а также в архив ленты — чтобы при следующем скачивании эти сообщения были отмечены как уже полученные.

diff -iaEbwB --strip-trailing-cr $path_temp/@rssarcfile[$i] (т.е. /path_to_rss2email/habrahabr.rss) $path_temp/feed_new_@rssname[$i].rss (т.е. /path_to_rss2email/feed_new_habrahabr.rss) | grep ^\>\  >$path_temp/@rssdiffer[$i] (т.е. /path_to_rss2email/habrahabr.diff)  

3. Теперь можно начинать радоваться — мы получили файл habrahabr.diff с последними сообщениями ленты, и теперь с этим файлом мы можем сделать вообще всё. Что и делаем, построчно считывая файл, а затем, разбирая строчки вида:

«Хабрахабр / Захабренные / Тематические / Посты»@«1399799340»@«habrahabr.ru/post/222391/»@«Google продолжает уничтожать RSS»@«На этой неделе, а именно 8 мая, Google отключил RSS-ленту <...cut...>. Читать дальше →»

… создаем в отдельном каталоге файлы согласно формату RFC2822. После этого скрипт продолжает свою работу, обрабатывая следующую ленту в списке, или же засыпает минут на -дцать; а сформированные письма, тем временем, обрабатывает запускающийся по cron'у второй скрипт. Он при помощи fdupes удаляет в каталоге с файлами RFC2822 все одинаковые файлы, кроме одного… (Да, знаю, это костыль. Да, стыдно. Но проблема с тем, что отдельные дублирующиеся строки, несмотря ни на что, всё же не вычищаются diff'ом, всплыла несколько позже написания скрипта, а времени разбираться не нашлось.)… а затем, используя ssmtp, отправляет их на специально заведенный почтовый ящик.

И теперь, получив ленту на почту, мы сможем спокойно, не страдая от очередного приступа креативности дизайнеров и судьбоносных решений менеджеров, читать её везде, в одном и том же привычном и любимом почтовом клиенте (том же самом TheBat!, например), пользуясь при этом всем богатым инструментарием в виде фильтров, сортировок, поиска и прочих полезностей, которые сделают чтение ленты удобнее и эффективнее.

ps: Традиционная для песочницы просьба о инвайте.

Автор: hungry_ewok

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js