Перейти к содержимому

RSS в 2025 живёт в Telegram

Константин Потапов
10 мин

Google Reader закрыли в 2013-м. XML не умер. Он стал трубой, а лицом трубы стал канал.

RSS в 2025 живёт в Telegram

В 2013-м Google закрыл Google Reader. Медиа писали некрологи про никому не нужный XML. Покойник работать не перестал.

Через двенадцать лет тот же фид читают в Telegram и не знают, что это фид. Оранжевой иконки больше нет. Голубой самолётик на месте.

RSS перестал быть пользовательской проблемой. Как кофе: важен вкус, не pH.

Почему ридеры проиграли, а протокол нет

Агрегаторы двухтысячных были правы и непригодны. Отдельное приложение, понятие «фид», ссылка спрятана в <head>, вечер на папки и теги. Люди хотели нажать и читать.

Подписки были только ваши. Прочитали сильную статью: никто не узнает. Нет реакций, нет репоста. Рекламодателю некого таргетировать. Благородно и без кассы.

RSS-агрегатор (2010)
Telegram-канал (2025)
Время подписки
5 минут (найти RSS, добавить)
1 клик (ссылка на канал)
100%
Взаимодействие
Только чтение
Реакции, комменты, репосты
Аналитика
Счётчик скачиваний фида
Охваты, просмотры, вовлечённость
Монетизация
Сложно отследить ROI
Прямая реклама, подписки

Telegram решил те же задачи и слово RSS не произнёс. Приложение уже стоит у родителей. Реакции и комментарии из коробки. Пуш сам стучится. Охваты и просмотры видны автору. Из благотворительности получился канал, который можно продавать.

Мост

Бот раз в пять минут смотрит фид, находит новое, форматирует, кладёт в канал.

Готовый @RobotRSSBot. IFTTT за $2.5. Zapier от $20. n8n или Make, если хочется свой сервер. Свой скрипт: Python, feedparser, python-telegram-bot.

Сайт с фидом становится каналом один раз. Потом годы без ручного копирования.

# Пример на Python (упрощённо)
import feedparser
import asyncio
from telegram import Bot
 
RSS_URL = "https://example.com/feed.xml"
TELEGRAM_CHANNEL = "@my_channel"
CHECK_INTERVAL = 300  # 5 минут
 
bot = Bot(token="YOUR_BOT_TOKEN")
seen_entries = set()
 
async def check_feed():
    feed = feedparser.parse(RSS_URL)
 
    for entry in feed.entries[:5]:  # Последние 5 записей
        entry_id = entry.get('id') or entry.link
 
        if entry_id not in seen_entries:
            # Форматируем сообщение
            message = f"<b>{entry.title}</b>\n\n"
            message += f"{entry.summary[:300]}...\n\n"
            message += f"🔗 <a href='{entry.link}'>Читать далее</a>"
 
            # Отправляем в канал
            await bot.send_message(
                chat_id=TELEGRAM_CHANNEL,
                text=message,
                parse_mode='HTML'
            )
 
            seen_entries.add(entry_id)
 
# Запускаем цикл проверки
while True:
    await check_feed()
    await asyncio.sleep(CHECK_INTERVAL)

Дальше обычно: картинки через send_photo(), seen_entries в SQLite или Redis, обработка недоступного фида и лимитов, фильтр по словам, хештеги.

Зачем это не только гикам

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

0 руб
на создание контента
2 часа
на настройку
10-20%
комиссия с рекламы
24/7
автоматическая работа

Конкурент уже выпустил три фичи, пока вы планировали спринт. Его блог в приватный канал команды. Ключевые слова: релиз, партнёрство, увольнения. Публично чужой текст копировать нельзя. Внутри смотреть можно.

Свой Medium, YouTube и GitHub releases тоже отдают RSS: medium.com/feed/@username, youtube.com/feeds/videos.xml?channel_id=XXX, github.com/user/repo/releases.atom. Три моста, одна точка входа.

B2B-дайджест: фиды отрасли, фильтр, раз в неделю пять новостей с комментарием. Письмо ловит спам. Канал нет. Open rate почты 15-25%, канала 60-80%.

Email-рассылка
Telegram-канал
Open Rate
15-25%
60-80%
300%
CTR
2-3%
8-12%
300%
Спам-фильтры
Да
Нет

Внутри компании в ту же трубу падают деплои, релизы, правки в Confluence и закрытые задачи Jira. История остаётся в чате, рассылку на всех слать незачем.

Что видно и чего не видно

У фида видно число скачиваний XML, user-agent и время запроса в 03:42. Не видно, кто подписан, дочитывают ли и какая запись живая. Боты качают тоже.

Telegram показывает охваты, просмотры, репосты, реакции, прирост и часы активности.

Тест гипотезы:
- Публикуем пост в 9:00 → 1000 просмотров
- Публикуем пост в 18:00 → 3000 просмотров
Вывод: Аудитория активна вечером, настраиваем RSS-мост на вечернюю публикацию

Фид даёт <title>Update: New Features</title>. Бот пишет человеческий заголовок. Сравниваете CTR.

# RSS даёт ссылку: https://blog.com/post
# Бот добавляет UTM:
link = f"{entry.link}?utm_source=telegram&utm_medium=rss_bot&utm_campaign=auto"

Дальше воронка в аналитике: публикация, клик, конверсия.

Грабли

pubDate иногда прыгает на старой записи. На дату не опираюсь. Беру id и хеш содержимого.

# Не полагайтесь только на pubDate
# Используйте уникальный ID + hash контента
import hashlib
 
def get_entry_hash(entry):
    content = entry.title + entry.link + entry.get('summary', '')
    return hashlib.md5(content.encode()).hexdigest()
 
seen_hashes = set()
 
for entry in feed.entries:
    entry_hash = get_entry_hash(entry)
    if entry_hash not in seen_hashes:
        # Публикуем
        seen_hashes.add(entry_hash)

Bot API: 30 сообщений в секунду в один канал. Между постами пауза в две секунды или дайджест раз в час.

import asyncio
 
async def publish_with_delay(entries):
    for entry in entries:
        await bot.send_message(...)
        await asyncio.sleep(2)  # 2 секунды между постами

В фиде бывает кривой HTML.

from bs4 import BeautifulSoup
import html
 
def clean_html(text):
    # Парсим HTML
    soup = BeautifulSoup(text, 'html.parser')
 
    # Убираем теги, оставляем текст
    text = soup.get_text()
 
    # Экранируем спецсимволы для Telegram HTML
    text = html.escape(text)
 
    return text[:500]  # Обрезаем до 500 символов

Картинки часто нет. Беру первую из content:encoded или description.

# Парсим первую картинку из <content:encoded> или <description>
soup = BeautifulSoup(entry.content[0].value, 'html.parser')
img = soup.find('img')
 
if img and img.get('src'):
    await bot.send_photo(
        chat_id=CHANNEL,
        photo=img['src'],
        caption=message,
        parse_mode='HTML'
    )
else:
    await bot.send_message(...)  # Без картинки

Протокол, не продукт

Подкасты внутри до сих пор RSS. YouTube отдаёт фид на каждый канал. Substack генерирует его рядом с письмом. Notion и Obsidian Publish дышат тем же XML.

Это ленивый API: без токена, с кешем CDN, со схемой, которая переживёт очередной модный JSON.

Крупные медиа дублируют фид в канал. Редактор не копирует руками каждый заголовок. Часто 80% автомат, 20% рука.

2005: RSS → Google Reader
2013: Google Reader закрыт
2020: боты RSS-to-Telegram
2025: люди читают RSS и называют это Telegram

Искать фид: /feed, /rss, /atom.xml, расширение в Chrome, rss.app, feed43.com. Канал, бот через @BotFather, бот админом с правом постить. Либо @RobotRSSBot и /add, либо скрипт на VPS и systemd, либо IFTTT.

RSS пережил Google Reader. Telegram дал ему лицо. Если контент уже отдаёт фид, второй раз набирать его руками незачем.