Статья

Телеграм-бот из чата: как ИИ собирает код-проект и отдаёт архивом

Телеграм-бот из чата: как ИИ собирает код-проект и отдаёт архивом

ProfileProfile·4 ч назад·
4
··0·
Если коротко: вы описываете задачу словами — «телеграм-бот на Python, который по команде /add записывает трату, а по /report присылает сумму за месяц» — и получаете в ответ не совет «попробуйте aiogram», а собранный проект. Несколько файлов с настоящим кодом, файл зависимостей, заготовку под токен и короткую инструкцию «как запустить». Каждый файл показан прямо в переписке отдельным блоком с подсветкой, а всё вместе лежит рядом кнопкой «Скачать архив (.zip)». Чего вы при этом не получаете — запущенного бота. Это исходники, а не хостинг, и про это ниже будет отдельный раздел: именно здесь возникает большинство недоразумений.
Здесь Profile — мы делаем Schai GPT и пишем про него по исходникам, а не по обещаниям. Поэтому дальше будут и цифры пределов, зашитых в инструмент, и честный список того, что придётся сделать руками, и одна вещь, которую делать нельзя ни в коем случае — вписывать свой токен в запрос к ИИ.

Что приезжает в чат: не файл, а проект

Отдельной кнопки «сгенерировать бота» в интерфейсе нет. Умение лежит в общем реестре инструментов ассистента рядом с поиском, документами и созданием сайта, а ИИ берёт его сам, услышав «сделай телеграм-бота, который…», «напиши скрипт на питоне, который…», «собери бота для…». Границы в описании инструмента оговорены прямым текстом: он не для одного файла с текстом и не для реального деплоя и хостинга бота — только исходники плюс инструкция по запуску.
Дальше ваше описание уходит модели — той самой, что выбрана в селекторе чата. Отдельной «модели для кода» нет: проект пишет тот же движок, что отвечает вам в разговоре. Возвращает он не простыню текста, а строгую структуру: имя проекта, список файлов (путь плюс содержимое каждого) и отдельным полем — текст инструкции. Сервер разбирает эту структуру, складывает файлы в .zip и кладёт архив в хранилище.
Как должен выглядеть «настоящий проект», модели расписано заранее: основной файл (bot.py, index.js, main.py — по обстоятельствам), файл зависимостей (requirements.txt или package.json), при необходимости README.md и обязательно .env.example под секреты. Отдельным пунктом стоит требование писать рабочий код, а не заглушки и псевдокод. Если язык вы не назвали, для телеграм-бота по умолчанию берётся Python с aiogram или python-telegram-bot: aiogram — асинхронный фреймворк, который на сентябрь 2026 идёт в версии 3.31 и держит Bot API 10.3.
Границы сборки заданы числами. В архив попадёт не больше 20 файлов; на один файл — не больше 20 000 знаков; на весь проект — 120 000 знаков, всё сверх этого обрезается. Модели отдельно сказано «не создавай больше 15 файлов без явной необходимости», а на генерацию отведено 12 000 токенов и примерно две минуты. Это инструмент для бота, утилиты, небольшого сервиса — не для корпоративного монолита.
Пути файлов сервер чистит сам: ведущие слэши и переходы `..` вырезаются, длина пути ограничена. Это не паранойя, а обычная гигиена архивов — распакованный проект должен лечь туда, куда вы его распаковываете, и никуда больше.

Почему код показан в чате, а не спрятан в архиве

Каждый файл рендерится в переписке отдельным блоком: сверху путь моноширинным шрифтом, под ним код с подсветкой. Язык подсветки определяется по расширению, список широкий: py, js, mjs, cjs, ts, tsx, jsx, json, sh, sql, html, css, php, java, kt, go, rs, yml, xml, md и даже .env. Ниже — блок инструкции: тот самый текст «поставь зависимости, возьми токен, запусти», который модель вернула отдельным полем, а не зарыла в README внутри архива.
Смысл простой: распаковать архив можно только на компьютере, а понять «то это или не то» хочется сразу и желательно с телефона. Увидели, что бот слушает не те команды, — пишете следующей репликой «пусть будет /start и /help, а не /begin» и получаете новую сборку.
Кнопка «Скачать архив (.zip)» ведёт не в публичное хранилище, а на наш собственный маршрут выдачи по подписанной ссылке. Срок жизни везде один — 24 часа: столько живёт подпись, столько лежит объект в хранилище, дальше фоновая уборка его удаляет. Сутки на то, чтобы забрать файл; потом архив придётся пересобрать — благо описание никуда не делось, оно в истории чата.
От реплики в чате до архива — четыре шага внутри одного сообщения и пределы, зашитые в сам инструмент

Как сформулировать задачу, чтобы бот получился рабочим

Главное про формулировку: модель не додумывает за вас ничего из того, у чего есть несколько одинаково разумных вариантов. Не сказали, где хранить данные — выберет сама, и с равной вероятностью это будет SQLite, JSON-файл или словарь в памяти, который умрёт вместе с процессом. Не сказали, на какие команды реагировать — придумает свои. Поэтому в описании инструмента отдельным требованием записано: в запрос нужно перенести все детали, которые назвал пользователь. Ваша задача — чтобы деталей хватало.
Пять вещей, каждая из которых убирает по одному «а он сделал не то»: Что назвать → Что сломается, если промолчать Язык и библиотеку → По умолчанию возьмётся Python + aiogram; если у вас на сервере только Node, переделывать придётся всё Команды и события → Модель придумает свой набор, и он не совпадёт с тем, что вы рисовали в голове Где хранить данные → Молча выберется хранение в памяти: перезапустили бота — всё пропало Что делать при ошибке → Код выйдет «счастливого пути»: первая же сетевая осечка уронит процесс У кого есть доступ → Бота в телеграме найдут по имени; без проверки id командой /report воспользуется кто угодно

Четыре примера: плохо → лучше

Первый — учёт расходов. Строка в одно предложение даёт бота, который что-то умеет, но почти наверняка не то:
Плохо: «Сделай телеграм-бота для учёта расходов».
Лучше: «Телеграм-бот на Python, aiogram. Команда /add 350 продукты записывает трату в SQLite; /report показывает сумму за текущий месяц по категориям; /undo удаляет последнюю запись. Данные каждого пользователя хранить отдельно, по его telegram id. Токен читать из переменной окружения. Если сообщение пришло не по формату — бот отвечает подсказкой и не падает».
Второй — скрипт, а не бот. Здесь забывают про расписание и про то, что сайт иногда не отвечает:
Плохо: «Напиши скрипт, который собирает данные с сайта».
Лучше: «Скрипт на Python: раз в час забирает страницу по адресу из .env, вытаскивает заголовки и цены из блоков с классом item, дописывает строки в CSV с колонками дата, название, цена. Если страница ответила ошибкой или не ответила вовсе — пишет в лог и ждёт следующего часа, не прерывая работу. Путь к CSV — тоже из .env».
Третий — напоминания. Ключевые слова тут — «переживают перезапуск»:
Плохо: «Бот-напоминалка».
Лучше: «Телеграм-бот на Node.js: /remind 18:30 позвонить маме ставит напоминание и присылает сообщение в указанное время по московскому времени; /list показывает активные, /del номер удаляет. Напоминания хранить в SQLite, чтобы они переживали перезапуск. Время разбирать в двух форматах: ЧЧ:ММ и «через 20 минут»».
Четвёртый — рассылка. Самый показательный случай: здесь вылезает чужое ограничение, о котором надо сказать вслух:
Плохо: «Бот, который рассылает сообщения подписчикам».
Лучше: «Телеграм-бот на Python (aiogram): команда /broadcast доступна только администратору, его id берётся из .env. Бот достаёт список подписчиков из SQLite и рассылает текст с паузой между отправками, чтобы не упереться в лимиты Telegram. При ошибке 429 ждёт столько секунд, сколько вернул сервер, и продолжает. Тех, кто заблокировал бота, помечает в базе как неактивных».
Почему про лимиты приходится писать самому: модель не обязана знать, насколько массовой будет ваша рассылка. А цифры у Telegram вполне конкретные — в один чат не чаще одного сообщения в секунду, в группу не больше 20 сообщений в минуту, при массовой рассылке порядка 30 сообщений в секунду, дальше начинаются ошибки 429. Bot API при этом возвращает поле `retry_after` — сколько секунд нужно переждать. Если вы про это не сказали, в коде этого не будет.
И совсем мелочь, которая экономит переписку: называйте команды сразу правильно. Команда в телеграме всегда начинается со слэша, содержит до 32 символов, и в ней допустимы только латинские буквы, цифры и подчёркивание. Попросив команду «/отчёт», вы получите либо транслит, либо кнопку, которая не работает.
Граница ответственности: что делает инструмент и что остаётся на вас — включая то, чего нельзя делать никогда

Это исходники, а не запущенный бот

Самый важный раздел статьи. На выходе у вас архив с кодом — и всё. Бота в этот момент не существует: у него нет имени в телеграме, нет токена, он нигде не запущен и никому не отвечает. Чтобы он ожил, нужно сделать три вещи руками.
Первое — завести бота у BotFather и получить токен. Каждому боту при создании выдаётся уникальный токен, и все запросы идут на адрес вида api.telegram.org/bot<токен>/имя_метода. Токен — это и есть ваш бот: у кого он на руках, тот им и управляет. Второе — поставить зависимости: `pip install -r requirements.txt` или `npm install`. Третье — запустить процесс там, где он будет жить: на своём компьютере, пока открыт терминал, или на сервере, где он переживёт закрытую крышку ноутбука.
Почему «разверни за меня» не делается — вопрос честный, и ответ не про лень. Запущенный бот — это чужой код, который бесконечно крутится на нашей инфраструктуре, ходит в сеть, хранит чьи-то данные и действует от имени владельца токена. Предлагать такое — значит быть хостингом: изоляция процессов, лимиты на потребление, логи, реакция на инциденты и ответственность за то, что этот код делает с чужими людьми. Инструмент объявлен как «исходники плюс инструкция по запуску» — ровно это он и делает. Кнопка «поднимем и будем держать», за которой ничего нет, была бы враньём прямо в интерфейсе.
Практическое следствие: пока бот не запущен, проверять нечего — ни в коде, ни в логике. Хороший первый шаг здесь советует сама документация Telegram: создайте у BotFather второго, тестового бота и запустите код на его токене, чтобы отладка не задевала тех, кто уже пользуется основным.

Токен в запросе к ИИ — ровно та ошибка, которую делают

Типичный сценарий выглядит так: человек уже завёл бота, у него на руках строка токена, и он вставляет её прямо в сообщение — «вот мой токен, подставь его в код». Так делать нельзя. Причина не в том, что кто-то сделает с этой строкой что-то злое прямо сейчас.
Причина в том, куда эта строка поедет дальше. В историю переписки. В текст сгенерированного файла. В архив. Потом — в папку «Загрузки», в репозиторий, в сообщение коллеге, которому вы перешлёте архив «посмотри». Утечки секретов почти никогда не выглядят как взлом; они выглядят как файл, который кто-то куда-то скопировал. OWASP в руководстве по управлению секретами описывает это ровно так: ключи и пароли лежат захардкоженными в исходниках и разбросанными по конфигам — и утекают именно оттуда.
Поэтому в задании модели прописано обратное: настоящие токены в код не вставлять, только плейсхолдер вида ВАШ_ТОКЕН_ЗДЕСЬ, секреты вынести в отдельный .env.example, а в инструкции объяснить, откуда токен взять. Это не наша выдумка, а стандартная практика. Двенадцатифакторная методология предлагает для неё простой лакмусовый тест: код должен быть таким, чтобы его можно было в любой момент выложить в открытый доступ, не скомпрометировав ни одного пароля.
На практике это значит: в репозиторий уезжает .env.example с пустыми строками, а рядом лежит настоящий .env, добавленный в .gitignore. И если токен всё-таки где-то мелькнул — в чате, на скриншоте, в общем документе — его не «подчищают», а отзывают и выпускают новый у BotFather. Тридцать секунд, и вопрос закрыт. Та же логика для любого ключа от чужого API и пароля к базе.

Когда это не тот инструмент

Три умения в чате внешне похожи — «попросил, получил файл», — и развести их полезно заранее: выбор инструмента ИИ делает по вашей формулировке.
Нужен один файл с текстом или таблицей — Word, Excel, PDF — это другое умение и другой результат: готовый документ, который можно сразу открыть и отправить, а не проект из файлов.
Нужен одностраничный сайт — лендинг, визитка, промо-страница — это отдельное умение с живым превью в переписке: страницу видно в сообщении, по ней можно кликать, правится она репликами. Но как только речь заходит о многостраничном сайте или сайте с базой данных, описание того инструмента прямо отправляет задачу сюда, в сборку проекта.
Нужен ответ на вопрос «как это написать» — это просто разговор. Сборщик проектов не объясняет и не учит, он возвращает файлы. Если вы ещё выбираете между библиотеками или не решили, как хранить данные, обсудите это обычной репликой, а уже потом просите собрать проект: тогда в задание попадут ваши решения, а не догадки модели.

Что проверить в коде перед первым запуском

Код, который пишет модель, обычно корректен по синтаксису и честно работает на «счастливом пути»: правильная команда, сеть на месте, сервер ответил. Проблемы начинаются там, где сценарий перестаёт быть счастливым, и это три конкретных места.

Первое: что происходит при ошибке

Найдите в главном файле места, где бот ходит наружу: отправка сообщения, запрос к чужому API, запись в базу. Если такой вызов не обёрнут ни во что и после него нет ни записи в лог, ни ответа пользователю — первая же осечка уронит процесс, и бот просто замолчит, не сказав никому ни слова. Чинить это самому не обязательно, достаточно попросить следующей репликой: «оберни обращения к API в обработку ошибок, при сбое пиши в лог и отвечай пользователю, что попробуешь позже».

Второе: лимиты чужого API

Если бот что-то рассылает или часто дёргает внешний сервис, в коде должна быть пауза между вызовами и реакция на ответ «слишком часто». У Telegram это ошибка 429 и поле `retry_after` с числом секунд, которые нужно переждать. Код, который игнорирует это поле и шлёт дальше, доведёт бота до временной блокировки. То же касается любого другого API: лимиты есть у всех, и однажды они срабатывают.

Третье: что будет, когда порвётся сеть

У долгоживущего бота связь рвётся регулярно — у вас, у провайдера, у самого Telegram. Библиотеки вроде aiogram и python-telegram-bot переподключаются к Telegram сами, но ваши собственные походы наружу — нет. Отдельно проверьте таймауты: запрос без таймаута может повиснуть навсегда, и бот перестанет отвечать, формально оставаясь «запущенным». Это самый неприятный вид поломки: процесс жив, мониторинг молчит.
И два быстрых пункта напоследок. Сверьте список зависимостей с импортами: бывает, что в коде используется библиотека, которую забыли внести в requirements.txt. И первый раз запускайте вручную, из терминала, глядя в вывод, — половина проблем видна в первые десять секунд.

Коротко

Что получаете. Архив с исходниками: основной файл, зависимости, .env.example, README и инструкция по запуску отдельным блоком. Код показан в чате по файлам с подсветкой — можно оценить, не скачивая. Пределы. До 20 файлов, до 20 000 знаков на файл, до 120 000 на проект. Ссылка на архив живёт 24 часа. Чего не получаете. Запущенного бота, хостинга, деплоя. Токен у BotFather, установка зависимостей и запуск — на вас. Как просить. Назовите язык, библиотеку, команды, место хранения данных, поведение при ошибке и лимиты чужого API. Всё неназванное модель выберет сама. Чего не делать. Не вставляйте токены, ключи и пароли в запрос к ИИ — только плейсхолдер и переменные окружения. Засветившийся токен отзывается у BotFather за полминуты.
0

Пока нет комментариев

Телеграм-бот из чата с ИИ: код-проект архивом