Собрал автономного бота для игровых новостей и скидок Steam
Пару месяцев назад мне надоело каждое утро вручную листать DTF, реддит и Steam в поисках нормальных новостей и скидок. Подумал: я же учусь программировать, почему бы не автоматизировать это раз и навсегда? В итоге получился бот, который работает 24/7 на VPS и сам наполняет ленту, пока я на парах.
Начал с простого: скормил скрипту RSS с r/Games. И тут же получил первый сюрприз - лента мгновенно забилась "Daily Discussion" и "Weekly Megathread". Оказалось, Reddit отдаёт их в топе почти каждый день. Пришлось писать фильтр, который проверяет заголовки топ-10 постов на стоп-слова и пропускает весь этот мусор, забирая первую нормальную новость. Звучит элементарно, но я потратил на это целый вечер.
Со скидками Steam история была ещё интереснее. Их API стабильно подсовывает одни и те же игры в топе, и через пару дней лента превращалась в день сурка. В итоге завёл файл published_discounts.json - бот сверяет топ-20 скидок с историей и берёт только то, чего ещё не было. А когда история заканчивается, запускает циклическую ротацию с самых старых записей. Повторов больше нет.
Отдельная боль - картинки. В какой-то момент бот начал падать посреди дня из-за битых ссылок и защиты от хотлинкинга на DTF. Теперь функция загрузки делает три попытки с таймаутом и подставляет заголовки вроде Referer: dtf. Если картинка всё равно не грузится, пост выходит просто текстом. Стабильность важнее идеальной вёрстки.
Тексты прогоняю через YandexGPT, чтобы посты звучали живо, а не как сухая сводка. Расписание получилось такое: в 12:00 - топ DTF, в 14:00 - Reddit, по будням в 15:00 - мемы через meme-api, в 19:00 - скидка Steam. Ещё добавил мониторинг DTF каждые полчаса на ключевые слова вроде "анонс", "релиз", "раздача", чтобы срочные новости не пропускать.
Всё это крутится через systemd и вываливается в мой пет-проект @grifonerloot - использую его как песочницу, чтобы смотреть, как контент выглядит в реальном Telegram, и собирать первые метрики. Раз в неделю бот присылает мне отчёт с приростом аудитории, что удобно.
Собственно, пишу сюда за советом. Сейчас история скидок и новостей хранится в обычных JSON-файлах, и я понимаю, что со временем они раздуются. Как вы решаете эту проблему на маленьких проектах, чтобы не поднимать полноценную базу данных, но и не тонуть в гигабайтных JSON? Буду рад любым мыслям.



