Задание готово — превращаем его в живого бота. Ты уже создал тестового бота через @BotFather в онбординге и получил токен. Теперь соберём вокруг него рабочий продукт.
🎯 После урока сможешь: собрать рабочего Telegram-бота с Claude Code и запустить его.
Шаг 1. Папка, токен и задание
Создай папку проекта, положи токен в .env (никогда в код!), запусти Claude Code и отдай ему задание из прошлого урока. Команды для Windows:
mkdir bot-zayavki
cd bot-zayavki
Set-Content -Encoding utf8 .env 'BOT_TOKEN=твой-токен-от-botfather'
claude
Welcome to Claude Code!
Почему
Set-Content -Encoding utf8, а не привычноеecho … > .env. В интернете ты чаще встретишь второй вариант — на Windows он записывает файл в другой кодировке, и бот потом не сможет прочитать свой токен. Причём молча: ошибки не будет, просто бот не отвечает, и ты полдня ищешь причину не там. Пишем сразу правильно.
На Mac и Linux та же строка выглядит привычно:
echo "BOT_TOKEN=твой-токен-от-botfather" > .env. Остальные команды одинаковые.

Шаг 2. Что сгенерировал Claude Code
Claude Code создаёт файл bot.py. Читать код целиком не нужно — важно понимать его каркас. Сердце бота — обработчик: функция, которая срабатывает на определённое действие (команду или сообщение).
import os
from aiogram import Bot, Dispatcher
from aiogram.filters import Command
from aiogram.types import Message
bot = Bot(os.getenv("BOT_TOKEN")) # токен из .env, не из кода
dp = Dispatcher()
@dp.message(Command("start"))
async def start(message: Message):
await message.answer("Здравствуйте! Оставьте заявку — как вас зовут?")
Как работает обработчик:
пользователь шлёт /start
│
▼
срабатывает функция start() ──▶ бот отвечает текстом
один обработчик = реакция на одно действие
Обрати внимание: токен берётся
os.getenv("BOT_TOKEN")— из окружения (.env), а не вписан в код. Так и должно быть в любом боевом проекте.
Шаг 3. Запускаем — бот отвечает
Попроси Claude Code запустить бота (или запусти сам). Бот подключится к Telegram и начнёт отвечать на сообщения. Открой его в Telegram и напиши /start.

Если бот молчит, причин обычно три: бот не запущен; токен скопирован не полностью; файл
.envсоздан не той командой и записан в кодировке, которую бот не читает (см. выше — на Windows нуженSet-Content -Encoding utf8). Не лезь в код руками — скажи Claude Code: «бот не отвечает, вот что вижу в терминале …», и он поможет разобраться. Заодно попроси его показать содержимое.env— если вместо строки с токеном там непонятные символы, дело в кодировке.
Контрольный вопрос. Что такое обработчик (handler) в боте?
Подсказка: Вспомни функцию start(): на что она реагирует и что делает.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Откуда бот берёт токен в этом коде: из файла с секретами или прямо из кода? Впиши имя файла, где лежит токен.
Исходный код для этого задания:
bot = Bot(os.getenv("BOT_TOKEN"))Подсказка: os.getenv читает значение из окружения — из того самого файла секретов с точкой в начале имени.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Claude Code сгенерировал бота, но он не отвечает. Как поступить правильнее?
Подсказка: Ты управляешь агентом словами — сначала расскажи ему, что не так.
Онлайн-проверка ответа появится позже
Что дальше
Бот отвечает на /start — каркас готов. В следующем уроке научим его принимать заявку по шагам, сохранять её в базу и уведомлять администратора.
