В 2013-м Google закрыл Google Reader. Медиа писали некрологи про никому не нужный XML. Покойник работать не перестал.
Через двенадцать лет тот же фид читают в Telegram и не знают, что это фид. Оранжевой иконки больше нет. Голубой самолётик на месте.
RSS перестал быть пользовательской проблемой. Как кофе: важен вкус, не pH.
Почему ридеры проиграли, а протокол нет
Агрегаторы двухтысячных были правы и непригодны. Отдельное приложение, понятие «фид», ссылка спрятана в <head>, вечер на папки и теги. Люди хотели нажать и читать.
Подписки были только ваши. Прочитали сильную статью: никто не узнает. Нет реакций, нет репоста. Рекламодателю некого таргетировать. Благородно и без кассы.
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, обработка недоступного фида и лимитов, фильтр по словам, хештеги.
Зачем это не только гикам
Канал без собственного текста. Пять-десять фидов, которые сами читаете по утрам. Мост на каждый. Десять минут в день на выкидывание мусора. Рекрутеры из ниши платят за доступ к аудитории, курсы отдают комиссию, раз в неделю можно продать свой разбор.
Конкурент уже выпустил три фичи, пока вы планировали спринт. Его блог в приватный канал команды. Ключевые слова: релиз, партнёрство, увольнения. Публично чужой текст копировать нельзя. Внутри смотреть можно.
Свой 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%.
Внутри компании в ту же трубу падают деплои, релизы, правки в 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 дал ему лицо. Если контент уже отдаёт фид, второй раз набирать его руками незачем.



