Серия «Автономный бот для новостей»

Апдейт по боту для игровых новостей: как я победил CDN DTF и пустую ленту

Серия Автономный бот для новостей

Недавно писал здесь про своего автономного бота, который собирает игровые новости и скидки Steam. За последние сутки столкнулся с парой неочевидных проблем, которые, кажется, будут знакомы всем, кто работает с парсингом из-за рубежа. Делюсь решениями, вдруг кому сэкономит вечер отладки.

Главная победа — картинки с DTF

Апдейт по боту для игровых новостей: как я победил CDN DTF и пустую ленту

Всё работало стабильно, пока я не заметил, что посты с DTF регулярно выходят без изображений. Оказалось, что их CDN (leonardo.osnova.io) начал блокировать или таймаутить запросы с моего VPS во Франкфурте. Сначала пытался играть с заголовками и прокси-серверами, но решение оказалось неожиданно простым и бесплатным - wsrv.nl. Теперь, если бот видит ссылку на картинку с Osnova, он автоматически оборачивает её в https://wsrv.nl/?url=.... Тесты показали, что прокси не режет качество и отрабатывает стабильно даже под нагрузкой. Посмотрим как будут выходить дальнейшие посты.

Страховка на случай 403

Reddit (и иногда другие источники) периодически начал отдавать 403 Forbidden - мгновенный отказ. Раньше бот в такой ситуации молча пропускал все новости, и канал просто оставался пустым в час публикации. Это было обидно. Теперь внедрил жёсткую логику fallback'а: если ни одна картинка из доступных новостей не скачалась, бот обязан опубликовать последнюю новость голым текстом с inline-кнопками. Лента больше никогда не пропускает время выхода.

Возврат DTF и мелкие улучшения

Поэкспериментировал с заменой DTF на PC Gamer, но в итоге откатился обратно - DTF всё-таки даёт более релевантную для русскоязычной аудитории повестку. Заодно починил заголовки для Reddit: теперь передаю правильный Referer: https://www.reddit.com, и 403-х ошибок стало заметно меньше.

Вся эта механика со всеми прокси, страховками и fallback'ами сейчас крутится на VPS и вываливается в @grifonerloot - использую его как живой стенд, чтобы смотреть, как контент переживает все эти грабли в реальных условиях. Заодно удобно отслеживать, не сломал ли очередной апдейт парсинг.

Собственно, вопрос к тем, кто тоже парсит внешние API: как вы вообще относитесь к публичным прокси вроде wsrv.nl в продакшене? Стоит ли закладывать свой резервный прокси-сервер, или для пет-проекта такого уровня это overkill?

Показать полностью

Собрал автономного бота для игровых новостей и скидок 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? Буду рад любым мыслям.

Показать полностью 2
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества