Как я чтение всего контента на RSS переводил

Обложка

Обложка

TL; DR В статье рассказывается о том, как мне удалось перевести чтение лент в ВКонтакте**, Telegram, Facebook*, Instagram**, Reddit и почтовых рассылок в единый сервис InoReader. Причем почти без написания своих велосипедов.

Дисклеймеры

Общий дисклеймер • О личности автора • Отказ от ответственности • Об использовании нейросетей

Аннотация

В статье рассказывается о том, как автор дошёл до жизни такой, когда ему потребовалось единое «окно» для чтения контента. Описывается, что это за контент (в основном текстовый и мемчиковый), сколько времени уходило на его переваривание (до-фи-га) и как автора достала необходимость прыгать по разным сервисам для прочтения чего-либо. Написано, сколько времени затрачено на миграцию (неделя), проблемы при миграции, стоимость (€ 56) и собственно цель всего мероприятия.

Введение

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

Так уж повелось, что первым сервисом для потребления контента у меня стал VK**, в котором зарегистрировался где-то в 2010-м. Ну, тогда выражения «потребление контента» особо не было, а за его озвучивание в моей деревне можно было получить статус «по горшкам дежурного» и заодно ещё и классическое «по морде».
Вовремя не спрыгнув с соцсеточки, когда появились не то, что первые звоночки -, а уже целый букет цветочков, я провёл исследование запощенного и потребляемого контента, стоимости миграции, поиск альтернатив (их нет до сих пор). Как итог, решил всё равно остаться в ВК, предаваясь забвению в виде чтения постироничного контента, за ор после которого и присесть на бутылку побольше не жалко. Теперь я подписан на примерно 300 пабликов по копипастам, мемам, разного рода постиронии и метаиронии, которые разбиты на 7 фидов. Рекомендую!

Пытался что-либо писать на Facebook*, но после парадигмы пользования VK** «мордокнига» никак не поддавалась освоению. Ни в 2013-м, ни в 16-м, ни в 20-м, ни в 22-м. Попытки были ленивые, но настойчивые, пусть и размазанные по времени. Вердикт — «ниасилил», и никогда не осилю. Зато Meta Business Suite (там тоже можно постить) прям неплохо зашёл, но об этом когда-нибудь потом…

Что там из альтернатив? Instagram*, который функционально настолько урезан, что отошёл от формата квадратных фото лишь пару лет назад? X/Twitter с ограничениями СМСки и невозможностью оставлять непубличные комментарии к посту? Не смешите мои подковы, они даже 5% от функционала ВК не имеют, лол. Ну, и плюс, там никого из моих постироничных знакомых с Двача особо нет.

Справедливости ради, создать соцсеть, которая настолько широчайше поддерживает различные типы контента и одновременно гибкое в настройке — это надо постараться. У Павла Дурова получилось — и миру явился Telegram. Проблем у него хватает, но с точки зрения публикации и чтения разнородного контента он максимально приблизился по возможностям к ВК. Им и пользуюсь по сей день, 250 каналов разбросаны по 8 папкам.

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

В последние несколько лет, особенно после четвёртого «клубничного» бунта на Пикабу***, я окончательно и публично отказался от портала, основательно засев на местном r/Pikabu и на Reddit в целом. Кроме него, ещё слежу за новыми сообщениями в нескольких форумах типа iXBT, Ru-Board, OSZone, Cyberforum, 4PDA.

Помимо всего вышеперечисленного, слежу за артами на DeviantArt, Pinterest, ArtStation, читаю в Feedly сайты по хайтек-тематике. Вроде бы перечислил всё. В общем, наберется с 700–800 источников, контент которых я потребляю.

Серьёзная проблема заключается в том, что каждый источник контента требует присутствия на своей площадке и, как правило, установки своего приложения. Это неудобно, а сервисы, как вы уже поняли, у меня разнородные и чуть ли не взаимоисключающие. Почему бы не попробовать собрать все эти камни бесконечности весь этот поток информации в одном месте?

Как решить проблему?

Чтобы понять, что проблема есть, мне пришлось дожить до 2024 года. Три монитора, на которых в обязательном порядке открыты все мыслимые соцсети и мессенджеры: VK**, FB*, X, TG, WA*, Reddit, DA, Pinterest, ArtStation, форумы — решительно не давали работать, а постоянное отвлечение внимания и переключение контекста разгоняли мой СДВГ до неприличных уровней. Решать непосредственно корень проблемы — это не про меня, мне по нраву купировать проблему и написать о её героическом «решении» на Хабре.

Итак, вот то, что мы имеем, ну, или дано:

Может, ещё что-то не учел, но выходит до 700 разношёрстных лент.

Задача: хочу читать всё в едином сервисе.

Способы решения проблемы:

Из доступных есть:

  1. Перенести всё в Telegram. Пошерстив по Хабру и GitHub’у, заметил, что уже есть кое-какие боты, которые умеют конвертировать RSS из сайтов, в сообщения. Как пример.

    • + Из плюсов: тексты и разные медиа будут загружаться, скорее всего, в облако Telegram и оставаться там «навсегда». Ну, как минимум, явно дольше, чем в CDN;

    • — У этого решения есть минусы: лента публикуется в личном диалоге с ботом или в группе, плохо тегируется и маркируется, поиск затруднителен. Единая лента часто обновляется, можно случайно сбить место чтения и улететь куда-то вниз. Даже если будет несколько групп с разными источниками контента, всё равно тяжело систематизировать материалы и экспортировать их куда-то ещё — Telegram ведь тоже платформа, заинтересованная в купировании аудитории внутри себя. А ещё у Павла Дурова очень серьёзные планы на подписку Premium, которую я приобретать не собираюсь, и иногда ради преимуществ подписки разработчики отбирают функционал у бесплатных клиентов. Мало ли, вдруг в течение 10 лет боты станут платными? Да и вообще есть риск, что Telegram исчезнет или (д)эволюционирует до чего-то такого, что будет несовместимо с моей задачей.

  2. RSS (и Atom).

    • + Легко создать, легко подписаться. Тим Бёрнерс-Ли доволен ваш вклад в децентрализацию Сети, вам выдан кошка-веб1.0-жена. Все остальные плюсы полностью ложатся на клиент, который будет читать фиды. Свобода, кристально чистая и идентичная натуралам! Прям как в 00-х;

    • — Все современные социальные сети и мессенджеры будут максимально сильно сопротивляться потреблению «их» контента вне их юрисдикции, потому что через RSS на рекламе зарабатывать тяжело, согласитесь? Это будет тяжелая битва.

Выбрал второе по причине децентрализованности, зрелости технологии и просто по тому факту, что это тупо XML’ка, простая и понятная. Не какой-нибудь B2C SaaS, который сегодня есть, а завтра он пропадёт или будет ограждён пейволлом. Отличный инструмент, простой и надёжный.

Гипотеза: RSS может объединить контент со всех источников в любой читалке RSS-фидов. Ведь фид — это всего лишь подмножество XML, а сервер для выплевывания XML можно и самому накодить, в крайнем случае.

Требования: «единое окно» для чтения контента должно быть доступна на любой популярной платформе (Windows (web) и Android), а также должно поддерживать получение информации от 3000 источников и больше, в идеале не должно быть ограничений по количеству читаемых RSS-фидов.

Полезные ресурсы, выбор клиентов и схема работы

Где окунуться в мир RSS?

Что ж. С RSS я знаком, в Feedly вон уже какие-то подписки крутятся, они читаются, но всё как-то не всерьёз.

Я уж даже поначалу и не знал, как основательно подступиться. Давайте прочитаем про RSS, пройдясь по списку популярных ресурсов:

  • All-about-RSS: лучший сборник в Интернете по всем сервисам, утилитам и исходникам, которые относятся к этой технологии;

  • Топик на 4PDA где-то под Технотрепалкой: всё объяснят, подскажут, для новичков обряд посвящения (надо поплеваться в иконку Feedly и публично от него отречься);

  • r/RSS, чтобы почитать о свежих анонсах и актуальных ответах пользователей.

Читаем вдумчиво день-два, представляем себе принципиальную схему формирования фидов.
Спасибо Web 2.0, где после вливания сотен нефти где-то с начала 10-х годов связность между крупными платформами настолько ослабла, что мне надо аж думать, как вычленить контент из какой-нибудь соцсеточки!
Так как соцсети, мессенджеры и прочие платформы для публикации контент стараются максимально долго удержать набранную аудиторию внутри себя, они очень слабо интегрированы с остальным вебом, но программно автоматизировать веб-скрапинг текстов и картинок можно даже с них.

Выбор читалки

А ещё давайте пройдемся по кросс-платформенным RSS-читалкам. В общем-то, после небольшого исследования осталось только два кандидата:

  1. ❌ Feedly — драконовские ограничения на бесплатном тарифе, платный тариф только на год и то имеет ограничения по количеству источников. Есть различные интеграции, местный ИИ, threat hunting, слежение за упоминаниями бренда. В общем, зрелое, надежное и дорогое решение, за которое (так думают авторы) можно и приплатить побольше;

  2. ✅ InoReader — чуть менее драконовские ограничения, платный тариф со скидкой вполне себе демократичен, широкая возможность для разных автоматизаций, правил, фильтров, и доп. сервисов типа тегирования материалов, избранного, списки для чтения, пересылка, реэкспорт лент, социальные функции, подборки и прочее-прочее… А самое главное — нет лимита по количеству источников, ещё можно реэкспортировать созданные тобой фиды кому-нибудь ещё.

Feedbin, Feeder, Digg и прочие облачные решения отпали по причине незрелости или меньшем количестве фич и лимитов при сопоставимой цене.
От self-hosted решений я отказался, так как в таком случае поддержка работы сервера, покупка железа, пролонгация и прочие рутинные вещи ложатся на мои плечи, а на них уже положены десятки проектов, которые я должен поддерживать. Ещё минус — как правило, self-hosted требуют некислого такого объема постоянной памяти для хранения базы данных. При 700 источниках с их картинками, нужен сервер хотя бы в 100 ГБ памяти — это если брать с сильным запасом. И то БД придется регулярно, раз в пару лет, подчищать, я боюсь…

-56 € с баланса как нефиг делать!

-56 € с баланса как нефиг делать!

Как вы поняли, был выбран InoReader. Прости, Feedly, но твой основной конкурент на лопатки кладёт всех, с учетом моих требований о большом количестве источников.
Донатнул на годовой тариф, чтоб жаба заставила меня пользоваться им и отрабатывать каждый потраченный евробакс.

Кто будет парсить вилкой это всё?

Если кратко, то в основном favicon.pngRSS-Bridge — self-hosted сервис для удобного «выдирания» контента откуда угодно (если сообщество озаботилось написанием кому к нему), есть публичные серверы для разных локаций. Все мои источники информации им поддерживаются: VK**, FB*, IG*, X, TG… удобно! Оно на колени кладёт любые PolitePol, RSS.app, TT-RSS и прочие «выдираловки» контента по финансовой и технической доступности.

RSS-Bridge умеет предоставлять ленты в виде Atom, MRSS (пользуюсь им по дефолту), JSON, SFeed и просто в PlainText.

Решено было делать так:

  1. RSS-Bridge выдирает контент, формирует RSS;

  2. InoReader на него подписывается.

Все довольны? Ну, почти…

Моя борьба (с VK**)

Что я обычно читаю в ВКшечке

Что я обычно читаю в ВКшечке

Началось утро в деревне… По итогам двухдневных тестов InoReader с ссылками на ВКонтакте** в связке RSS-Bridge замечено, что где-то половина запросов валится из-за агрессивной защиты соцсети. А ведь это всего лишь 150 источников из 300. Кстати, я тогда ещё понятия не имел о других публичных экземплярах RSS-Bridge на других доменах и локациях, как-то мимо информация прошла.

Зато встретил золото — это woxcab/vkrss, PHP-сервер для выдачи постов из VK** в RSS. Очень подробные инструкции в комплекте. Минус — не докеризирован.

Форкнул, за два дня упаковал, как умел, в Docker этот проект, так что его можно пощупать и развернуть здесь (позже солью в master). Бонусом можно спрятать access_token от приложения VK** в .env-файл.
Арендовал дешманский сервер в PureServers, залил и запустил. Работает!

Как пользоваться (кратко, в ином случае читаем инструкцию):

  1. Заимейте свой домен, укажите A-запись на IP вашего сервера;

  2. Регистрируем Standalone-приложение в VK**;

  3. Проходим Authorization Flow (не Implicit Flow) в два этапа, получаем бессрочный токен;

  4. Токен и прочую инфу вписываем в .env-файл;

  5. Запускаем docker compose up -d certbot webserver для получения сертификатов;

  6. После успешного получения SSL-сертов раскомментируем sed -i 's/### //' templates/default.conf.template SSL-секцию в конфиге NGINX;

  7. Полноценно запускаем: docker compose restart webserver && docker compose up -d php.

Теперь сервер будет выдавать RSS на любой запрос а-ля: https://<ВАШ_ДОМЕН>:8082/api/vkrss/index.php?id=<ЮЗЕРНЕЙМ_ПАБЛИКА_ВК>&vkrss_access_token=<ВАШ_ТОКЕН_ДОСТУПА_В_DOTENV>. Практически всё в этом URL конфигурируется.

Скорость выполнения довольно медленная: 3–7 секунд -, но не критичная для InoReader. Ни одной ошибки при обновлении 300 лент в ВК!

Ru-Board наносит ответный удар

Легендарный форум, который даже в век доминирования социальных сетей и мессенджеров и после внутренних трясок продолжает доживать жить!

Проблема в том, что RSS-лента, которую они предоставляют, очень плохо кастомизируется — нет нормальной сортировки, нельзя подписаться на сообщения внутри определенной темы. А мне именно последнее и надо. Ну, движок самописный, что ты ему прикажешь?

К счастью, нашёлся умелец, который сделал бо́льшую часть работы за меня. Помог тот же RSS-Bridge!

Reddit по-прежнему поддерживает RSS, несмотря на дальнейшее прикрытие сторонних приложений и своего API, и всё это ради выхода на IPO.

А что остальные?

С ними проблем не было. RSS-Bridge всему голова! Вбиваешь туда, к примеру, Telegram — он тянет с Телеграма контент как миленький. Главное, чтобы канал был публичный. С другими формумами тоже 0 проблем — в них нет мега-тредов, как в Ru-Board, а подписки на новосозданные топики форумы умеют предоставлять.

Подписки Youtube импортировались двумя кликами. Бюллетени я подписал, создав для каждого отдельный почтовый ящик (InoReader имеет такую фичу) и переподписав туда еженедельные рассылки.

Вот как выглядят подписки Youtube в интерфейсе InoReader. Я так музыку и слушаю

Вот как выглядят подписки Youtube в интерфейсе InoReader. Я так музыку и слушаю

Полезные советы для массового импорта в InoReader (и в другие сервисы, поддерживающие импорт OPML)

В Inoreader есть фича по массовому импорту ссылок на фиды, но только в виде OPML-файлов. Если вам лень вручную импортировать свои подписки, делаем следующее…

  1. В процессе переноса выяснилось, что мне лень выполнять ручные операции, поэтому написал парочку скриптов:

    1. Можно экспортировать все ссылки из определенной ленты VK**: https://gist.github.com/Kenya-West/d2fc748958a88e8b7288bba6179f2b7f;

    2. Можно экспортировать все ссылки из определенной папки TG: https://gist.github.com/Kenya-West/0e489eb750bbdd240d372032c8b7d595.

  2. Как только получил нужные юзернеймы пабликов в VK**, я сформировал из них ссылки:

    1. Для VK**: https://<ВАШ_ДОМЕН>:8082/api/vkrss/index.php?id=<ЮЗЕРНЕЙМ_ПАБЛИКА_ВК>&vkrss_access_token=<ВАШ_ТОКЕН_ДОСТУПА_В_DOTENV>, ну, тот самый из секции выше.

    2. Для TG: https://rss-bridge.org/bridge01/?action=display&bridge=TelegramBridge&username=%40<ЮЗЕРНЕЙМ_ПАБЛИКА_ТГ>&format=Mrss.

  3. Список этих ссылок, разделенных новой строкой, я вставил в сервис OPML Maker и получил готовый OPML файл. Можно создать несколько OPML файлов, каждый для определенной папки в InoReader;

  4. Импортировал это дело в InoReader. Для VK** пришлось ждать довольно долго — для каждого паблика лента формировалась на моём сервере до 7 секунд, а таких лент 300. Но в итоге всё успешно импортировалось!

Улучшения качества жизни

Все проблемы, указанные ниже, относятся к веб-версии, так как в мобильном InoReader легко можно кликнуть по превьюшке, перекинуться в другое мобильное приложение и смотреть контент там.

Telegram

По TG вышло лучше, чем я ожидал! RSS-Bridge выдает ленту со встроенным тегом , который можно смотреть, кликнув по картинке…, но ничего не происходит. Оказалось, надо вручную через правую кнопку мыши включить элементы управления у видео и вручную же его запустить.
Гениально, InoReader, просто гениально! Значит, надо это автоматизировать.

VK**

С VK** вышло сложнее. Видео точно не присутствует на ленте, зато есть картинка со ссылкой на видеоролик. Можно было бы родить