Дисклеймер: я люблю людей и свою карму. И не считаю, что всех нужно заменять ИИ.
Всем привет! Меня зовут Миша Шумовский, я главред Нейромедиа — нового медиа про нейросети. На запуске у нас была задачка: наладить регулярный выпуск новостей, чтобы получать дополнительный поисковый трафик. Нанимать под это отдельного человека не хотелось: такая работа стоит недорого, но для молодого медиа важна каждая копеечка. Да и как будто в медиа про нейросети часть процессов точно должна быть автоматизирована, иначе зачем все это.
Поэтому я поковырялся и с нуля собрал себе парсер новостей в виде Telegram-бота — при том, что программировать не умею. Теперь каждые 15 минут бот сам обходит нужные сайты, отбирает важное, пишет нормальный текст новости на русском и присылает мне в телегу. Мне остается нажать одну кнопку. Давайте расскажу, как я такой сервис сделал.
Каждые 15 минут бот проверяет 28 источников и приносит готовые новости в телегу
Сначала покажу, что получилось. В базе парсера 30 источников: официальные блоги OpenAI, Anthropic, Google DeepMind и других вендоров, техиздания вроде TechCrunch и The Verge, Hugging Face, Hacker News, Reddit, пара хабов Хабра. Раз в 15 минут бот обходит их и смотрит, что вышло нового.

Дальше все это добро сортируется:
Если в статье нет ничего про ИИ, то дальше она не проходит.
Если про одну и ту же новость пишут несколько изданий, бот сравнивает тексты по похожести и собирает такие публикации в один кластер — в телегу приедет одна карточка со ссылками на все источники.
По каждому кластеру считается важность в очках, и если новость набрала проходной балл, нейронка читает первоисточник и пишет по нему текст на русском.
Готовая новость прилетает мне карточкой с кнопками: одобрить, отклонить, перегенерировать. Одобренные тексты я забираю и руками выкладываю на сайт.

Автопостинга у парсера пока что нет. Страшно, что нейронка наделает делов. Но он точно появится, когда я научу агента верстать статьи на сайте.
Разработка началась с допроса
Вся разработка велась через Claude Code внутри Cursor. Я, как истинный нуб в коде (вайб-кодер) понимал, что поставить нормальное ТЗ нейронке и грамотно объяснить, как все технически должно работать, не смогу. Поэтому я решил сначала все спланировать, а потом приступить к реализации маленькими задачами. Я описал словами, чего хочу, — так же, как описывал бы потенциальному разрабу:
Хочу Telegram-бота, который собирает новости про нейросети с выбранных сайтов. Бот должен сам понимать, какие новости важные, склеивать дубли с разных сайтов, писать по важным новостям текст на русском и присылать мне на согласование. Сам он ничего не публикует. Давай спланируем, как это построить, и разобьем работу на небольшие задачи. Спроси все, что тебе нужно от меня. |
В ответ нейронка завалила меня вопросами: откуда именно брать новости и что делать, если сайт не отдает контент. Что вообще считать «важной новостью» — по каким признакам. Как быть, если про одно событие напишут десять сайтов. Что происходит с новостью после одобрения. Кто, кроме меня, будет пользоваться ботом и с какими правами.
Допрос длился час, если не больше. И из моих ответов сложилось техзадание обычным человеческим языком: что делает система, из каких шагов состоит путь новости и по каким пунктам мы проверим, что все готово. Начиналось оно так:
Задача: автоматизировать сбор, оценку и написание новостей для медиа про нейросети. Система мониторит источники, определяет важные новости, переписывает их под формат медиа и отправляет на модерацию через Telegram-бот. После одобрения модератором готовый текст передается верстальщику. |
Я несколько раз читал это задание, подмечал ошибки, которые там были, и просил нейронку поправить. Через 2 круга правок лично меня все устраивало.
Потом нейронка перевела мое ТЗ на свой язык
Чуда не случилось и в коде я по-прежнему не шарил, поэтому дальше просто разговаривал с Клодом. Пытался выяснить, что мне вообще надо и как это должно работать, а нейронка рассказывала и подсказывала. Половину слов я видел впервые и просил объяснять каждую непонятную строчку.
Так и собрался стек — набор технологий, на которых все работает. Красиво было бы написать «мы с агентом выбрали PostgreSQL», но по факту я ничего не выбирал: просто просил подсказать, что будет лучше конкретно для моей задачи. В итоге нейронка предложила так (почти дословно).
Код пишем на Python. Все найденные статьи и готовые тексты лежат в базе данных PostgreSQL — по сути это память бота: перезапустишь его, а новости и настройки останутся на месте. Также поставим Redis — быструю память для служебных мелочей вроде того, на каком шаге диалога с ботом ты сейчас находишься. Планировщик каждые 15 минут пинает парсер, чтобы тот обошел источники. А сами новости будем преимущественно тягать через RSS — это лента обновлений, которую отдают почти все сайты. Благодаря RSS мне не придется разбираться с дизайном страницы — я сразу буду видеть готовый список свежих статей. Если RSS где-то не будет, я буду забирать страницу целиком и выцеплять статьи сам. |
Все свои предложения нейронка оформила в техническую спецификацию — то же ТЗ, только переписанное на ее язык: какие технологии берем, как все устроено и что происходит на каждом этапе. Туда же легла схема пути новости — от источника до карточки в телеге:

В какие-то мелкие технические детали я не лез — боялся, что утону в вечных обсуждениях и в итоге все равно ничего путного не выберу. Поэтому шел путем MVP: разобраться в самом главном и запуститься, а мелкое доработать со временем в ходе тестов.
Так мы поехали дальше — к декомпозиции.
Каждая фича — это папка со спекой и списком задач
Со спекой на руках я попросил нейронку продумать, как разбить всю работу, чтобы с ними было удобно работать и агент сам четко понимал, что делать в каждой. Он ответил в духе: «Давай разобьем наше большое техзадание на маленькие — это будет декомпозиция». На том и порешали.
В итоге мое больше техническое задание разделилась на кучу мелких: «собери скелет бота с базой», «научи склеивать дубли», «прикрути подсчет важности».
У каждой фичи в проекте создавалась своя папка: ТЗ, техспека и файлы задач. В задаче всегда было четыре части: цель, что входит в работу, критерии приемки и как проверяем. Вот так это выглядело:
Задача 004: очки только за уникальные источники Цель: считать «независимые подтверждения» по уникальным источникам, а не по количеству статей. Критерии приемки: — несколько похожих статей одного сайта не накручивают кластеру очки; — статьи с разных сайтов учитываются как раньше; — счетчик источников у кластера показывает уникальные источники. Проверка: тесты скоринга для кластера с одним и с тремя источниками, полный прогон всех тестов. |
Уже точно не вспомню, сколько подобных задачек мы прошли с агентом. Но точно помню, что первая версия бота появилась через 10–15 часов от моего первого сообщения агенту. Я при этом не написал ни строчки кода и почти его не читал — только отвечал на вопросы, утверждал планы, тыкал в бота и говорил, что не так.
Как бот понимает, что новость важная
Это, наверное, самая важная и интересная часть парсера. Каждая новость получает очки, и от них зависит, доедет ли она до меня.
У каждого источника есть вес от 1 до 10. Официальный блог OpenAI или Anthropic — десятка, потому что мусорных публикаций там не бывает. Новостные сайты и агрегаторы весят меньше, но в среднем все получают минимум пятерку. Вес лучшего источника в кластере умножается на три — это дает до 30 очков. Дальше идут бонусы:
+15 очков за каждый независимый источник сверх первого: если про релиз написали трое, это точно не проходняк;
+30 за всплеск — несколько публикаций за короткое время;
+10 за слова-триггеры в заголовке: introducing, new model, «запускаем», «вышла»;
+15, если первым новость выпустил официальный блог компании.
Допустим, в блоге OpenAI выходит пост со словом introducing в заголовке: это сразу 30 очков за вес источника, 10 за триггер и 15 за первоисточник. А если новость подхватывают крупные издания вроде TechCrunch и The Verge — еще 30 за подтверждения и 30 за всплеск. Итого новость набирает далеко за сотню.
Дальше тоже есть градация. Чтобы бот взялся писать, новость должна набрать минимум 50 очков. До этого момента новость лежит в базе, но текст по ней никто не пишет.
Если новость набирает больше 80 очков, то нейронка сразу пишет текст и присылает его мне. А новости между 50 и 80 «дозревают»: бот ждет до получаса — вдруг подтянутся другие сайты и добавят очков.
Чтобы бот писал по-человечески, я выдал ему редполитику
После скоринга вторая по важности задача — настроить правильный стиль письма. Чтобы бот писал тексты, за которые не стыдно и которые можно без правок забрать на сайт. Иначе зачем оно все надо;)
Чтобы его собрать, я написал несколько десятков новостей в обычных чатах внутри ChatGPT. Работал итерациями: сначала давал ссылку и в общих чертах просил написать новость. Получал посредственный текст и правил его — объяснял нейронке, почему сделал так и просил вывести из моих замечаний редполитику. Потом открывал новый чат, кидал туда редполитику и новую новость — опять ее правил и просил поправить редполитику. И так до момента, пока качество текстов меня не устроило.

Сейчас редполитика занимает больше страницы и сюда вставлять ее не буду, чтобы не засорять материал. Но небольшой фрагмент все же покажу:
Ты — редактор медиа про нейросети и искусственный интеллект. Твоя аудитория — маркетологи, диджитал-специалисты и люди, которые интересуются технологиями, но не имеют глубокого технического бэкграунда. Они не знают узкоспециальных терминов и не должны гуглить их, чтобы понять новость. Категория новости: {category} На основе следующего источника напиши новость на русском языке: {sources_block} Как работать с материалом Перед тем как писать, просканируй весь текст источника — включая списки, таблицы и подзаголовки. Именно там чаще всего прячутся конкретные цифры, названия и детали, которые делают новость ценной. Затем выполни три шага. Шаг 1. Напиши черновик Структура новости: Заголовок — одно предложение с подлежащим и действием. Несёт самую острую деталь события: если в материале есть сильная цитата-характеристика, числовая оценка или неожиданный факт — они идут в заголовок, а не в тело. Без вопросов, восклицаний и эмодзи. Не дублирует лид. Лид — одно-два предложения. Отвечает на вопрос «что произошло» и «в чём суть». Если в материале есть числовая оценка или прямая цитата, которая передаёт суть события — она идёт в лид. Читатель должен понять масштаб и градус событий уже после первых двух предложений. Не начинается с даты или цитаты. Не содержит оценок. Добавляет деталь, которой нет в заголовке. |
Правда, написать редполитику — это полдела. Заставить бота ее соблюдать оказалось сильно сложнее.
Первое время бот относился к редполитике как к пожеланиям. Темы формулировал так, что из заголовка было не понять, о чем новость. Поэтому я не придумал ничего лучше, как ужесточить формат ответа: если текст приходил не по шаблону, парсер его отбраковывал и отправлял на повторную генерацию. Но даже с такими жесткими рамками нейронка умудрялась обманывать. Сначала она присылала сообщения по типу «Я не могу обработать эту новость» и следом сразу же писала «А не, я справилась, вот твоя новость». Но новость была выдуманной, а ссылку на источник нейронка «случайно» забывала прикрепить. Побороть все эти проблемы помог обычный старый дедовский… ревью. Через пару дней я несколько раз прогнал весь код через Codex и Claude Code и все крупные проблему решились. Мелкие косяки всплывают до сих пор, и их я уже правлю пачками, когда наберутся. |
Во сколько мне это обходится
Вообще, сразу я хотел сделать все максимально дешево и подключил к боту API DeepSeek. В итоге за неделю работы заплатил 2,7 доллара — а за такую дешевую модель это достаточно много. При этом качество текстов меня не устроило, поэтому я пошел тестить все дешевое по порядку: Minimax, Gemini, Qwen — ни одна модель мне не понравилась.
Поэтому я пошел другим путем — поставил себе на сервер авторизацию через Codex. В итоге теперь весь бот крутится в рамках лимитов подписки ChatGPT Pro за $100 — той самой, которую я и так покупаю для работы.
Лимитов бот почти не ест, да и мне проще — не нужно следить за балансом кредитов. Так что считаю это лучшим решением.
Настроить эту штуку на сервере кстати было легко — я просто сказал Кодексу «а давай сделаем», а он такой «а давай!». Подключился к моему серваку и сам там все сделал. |
Вот так буквально за сутки я собрал себе парсер, который работает уже больше 4-х месяцев и нереально меня выручает. Новости приносят нам немного дополнительного трафика и понимание, про что важное можно написать в блоге. И, что главное — денег мы на это не тратим, я трачу только 10 минут вечером, чтобы опубликовать материал. Поэтому разработку считаю полностью оправданной;)
Ну и напоследок — вот публичная версия парсера на GitHub. Это та же система, что я описал в статье, только без привязки к нейросетям. Можете отправить ссылку на эту систему своему агенту — дальше он сам вас проведет и поможет все настроить под себя.
Вместо заключения: советы вайбкодерам
Начинайте с допроса, а не с кода. Попросите нейронку задать вам вопросы по вашей хотелке. За пять минут она найдет дыры, о которых вы не думали, а из ответов соберет нормальное ТЗ.
Читайте техспеку глазами заказчика. Понимать каждую таблицу не обязательно — важно увидеть, что система будет делать и в каком порядке. Что непонятно, просите объяснить попроще.
Дробите работу на маленькие задачи. Так нейронке будет проще понять, что конкретно нужно сделать. И вам будет проще понять, что вы должны увидеть.
Если появятся вопросы по парсеру или будут идеи, что в нем докрутить, — пишите в комменты, буду рад пообщаться.

