rawdog — аггрегатор RSS без завышенных запросов

в 17:53, , рубрики: rawdog, Микроформаты, Настройка Linux

Лирическое вступление

В связи с недавним отпочкованием от Хабрахабра нового ресурса, у меня возникла нужда обустроить удобный способ чтения обоих ресурсов. Первая мысль, разумеется, была об RSS, благо движок у обоих сайтов его поддерживает. Оставались сущие пустяки — найти хороший RSS-аггрегатор, который можно было бы установить на малосильную VPS (поскольку участь Google Reader'а несколько охладила желание полагаться на сторонний сервис).

Поначалу наводка от Tsyganov_Ivan вывела на аггрегатор Tiny Tiny RSS, показавшимся настоящей «серебряной пулей». Однако более близкое знакомство с системными требованиями несколько охладило мой пыл — громоздить полноценный LAMP на машинку с дай бог 256 метрами незанятой памяти, и всё это ради ресурса буквально на одного человека? Тем более что знакомство с FAQ, содержавшим ссылки на откровенно издевательские ответы на форуме пакета, окончательно отбило желание иметь с tt-rss дело.

Первый раунд поиска завершился неудачей, поскольку альтернативы (вроде FeedHQ) требовали примерно то же самое. Отчаявшись, я уже собрался писать нужный мне инструмент сам и стал подыскивать подходящие библиотеки для Python (к которому я питаю слабость), когда наткнулся на практически то, что нужно.

Само название RAWDOG намекает, что автора во время написания обуревали схожие чувства. Эта утилита предназначена для запуска вручную или по cron и умеет только одно: распарсить указанные RSS-ленты и записать новые элементы в выходной файл по заданному шаблону.

Установка и настройка

Поскольку rawdog присутствует в репозитории Ubuntu, получение пакета сложностей не представляет. А вот настройка имеет свои особенности.
Во-первых, вам придется самим добавить вызов rawdog в crontab, либо в cron.*. Это будет выглядеть примерно так:

rawdog --dir WORKDIR --log /var/log/rawdog --no-lock-wait --update --write

где ключ --no-lock-wait не даст запустить вторую копию rawdog, а WORKDIR — рабочий каталог утилиты.

Дело в том, что rawdog ищет конфигурационный файл и держит все свои временные файлы в одном рабочем каталоге — по умолчанию ~/.rawdog. Это может быть удобно для рабочей станции, но противоречит обычной практике. Если вы, как и я, любите порядок и единообразие, указать другую рабочую директорию можно с помощью ключа --dir, что позволило отправить рабочий каталог в /var/cache/rawdog (поскольку его основное содержимое, судя по всему, кэш скачанных лент). Поскольку конфигурационный файл тоже ищется там же (ключ --cfg позволяет задать дополнительный конфиг, но не отменяет поиск основного), он был заменен на символическую ссылку, после чего отправился вместе с шаблонами в /etc.

Хорошо документированный пример файла конфигурации можно найти в Сети, поэтому я только коротко укажу основные директивы:

  • maxarticles N позволяет задать длину ленты результатов (выдача одностраничная, что может быть неудобно);
  • maxage T указывает, записи за какой временной интервал будут показаны в ленте выдачи;
  • expireage T задает, как долго будут оставаться записи, исчезнувшие в оригинальной RSS-ленте. Если этот интервал меньше, чем maxage, то в случае часто обновляющейся ленты устаревшие записи будут пропадать из результатов еще до истечения обычного срока.
  • pagetemplate FILEPATH и itemtemplate FILEPATH позволяют указать файл с шаблонами для страницы в целом и для отдельной записи соотетственно. По умолчанию (значение default) используется простенький встроенный шаблон.
  • outputfile FILEPATH — куда будут записываться результаты выдачи. Настройку вебсервера для отдачи этой статической странички лучше оставить за рамками этой статьи (я, например, использую lighttpd). Единственное, удостоверьтесь что к этому файлу будет доступ на запись у rawdog (не проблема, если утилита запускается через cron с правами root) и доступ на чтение у веб-сервера.
  • и, наконец, директива feed interval URL [params] позволяет добавить RSS-ленту для просмотра с заданным интервалом (поскольку вызов обычно осуществляется через cron, то rawdog просто проигнорирует «не устаревшие» ленты если его вызвать раньше положенного). Среди параметров стоит выделить id (о нём ниже) и http_proxy, позволяющий задать прокси сервер для обращения к конкретной ленте (если вам хочется странного, вроде агрегации RSS-ленты из Tor, ну или просто с попавшего под РосКомКаток сайта).

Наводим красоту

Встроенный шаблон у rawdog минималистичен, если не сказать жестче, поэтому имеет смысл задать свои файлы шаблонов. Самый важный — шаблон pagetemplate, поскольку именно в нём можно задать стили и подключить необходимые скрипты. Чтобы увидеть шаблон страницы по умолчанию, можно использовать следующую команду (обязательно укажите --dir WORKDIR если вы, как и я, переместили рабочий каталог):

rawdog -s pagetemplate >template.html

Любой встроенный шаблон можно посмотреть аналогичной командой, заменив pagetemplate на название шаблона. Шаблонизация реализована посредством простого поиска с заменой, хотя есть и условный оператор, позволяющий вставить заглушку при отсутствии значения. К слову, вы можете определять свои переменные с помощью директивы define VARNAME VARIABLE VALUE (глобально) или параметра define_VARNAME=VALUE (для отдельной RSS-ленты).

Следует заметить, что каждая запись по умолчанию помечается CSS-классом feed-FEEDID, где FEEDID — id источника, заданный в параметрах выше. Это позволяет задавать свой дизайн для записей из разных источников (например, показывать иконку сайта рядом с заголовком).

И напоследок

Навскидку можно придумать один способ, позволяющий сравнительно просто создать несколько сосуществующих подборок лент.

Для этого в cron.* вместо описанного выше вызова помещается что-то в духе:

for CFG in /etc/rawdog/*.conf
do
	WORKDIR="/var/cache/rawdog/"`basename $CFG .conf`
	[ -d "$WORKDIR" ] || mkdir -p "$WORKDIR"
	[ -f "$WORKDIR/config" ] || ln -sf /etc/rawdog/config "$WORKDIR/config"
	rawdog --dir "$WORKDIR" --cfg "$CFG" --log /var/log/rawdog --no-lock-wait --update --write
done

Принцип работы прост: для каждого файла *.conf в /etc/rawdog будет (при необходимости) создан соответствующий подкаталог в /var/cache/rawdog, в него будет помещена ссылка на конфигурационный файл /etc/rawdog/config с настройками по умолчанию, и будет вызван rawdog с указанием считать настройки конкретной группы лент из файла *.conf (в первую очередь, отдельные подписки и отдельный файл для записи выдачи).

Автор: Vindicar

Источник

Поделиться

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