Федеральный портал школ России
Закрыть

Урок 25. Программирование*: простой Telegram-бот через API

15.10.2026 - Андрей -

  • Учебные программы
  • Информатика

9 класс · Урок 25 из 34 · 45 минут

Вся программа 9 класса · 5.8. Некоторые приемы программирования для работы с искусственным интеллектом*

Программа написана правильно, но без учительского токена она не подключается к Telegram. Можно ли проверить обработчики и изучить API без регистрации ученика и без публикации секрета?

Результат урока: запускает проверяемую заготовку aiogram, прослеживает обработку сообщения и отличает офлайн-испытание кода от подключения живого бота.
Учителю: подготовка и план на 45 минут

Подготовьте: экран или распечатки, тетради, ручки и калькулятор; компьютер с подготовленным Python и aiogram. Все таблицы, тексты и ключи находятся в статье и PDF. Ключи открывайте после самостоятельной попытки; ученические листы печатайте отдельно от раздела учителя.

Вариант без регистрации: работайте по готовым материалам и учебным журналам на экране или бумаге. Ученики не создают аккаунтов и не передают личных данных. Учебная имитация позволяет проверить рассуждение, но не заменяет настоящий эксперимент с сервисом.

До урока учитель устанавливает aiogram==3.31.0 в отдельную среду и проверяет offline.py. Для дополнительного живого испытания взрослый получает токен собственного учебного бота через официальный BotFather, проверяет возрастные условия и запускает teacher_launch.py. Ввод скрыт, токен остаётся только в окружении процесса; запуск останавливается Ctrl+C. Нужен один процесс polling, а не несколько копий. Урок и код полностью доступны без аккаунтов учеников; офлайн-тест не называют живым сервисом.

ВремяЭтапРезультат
0–5Проблемная ситуацияПервое решение и основания
5–14Теория и разобранный примерПонятия, доказательства и ограничения
14–25Практика 1Проверяемый результат по критериям
25–33Практика 2Перенос в новые условия
33–40ОбсуждениеАргумент, возражение, общее решение
40–45Индивидуальная проверкаСамостоятельный ответ и сверка

Что собрать: результаты двух практик, основания вывода и индивидуальную проверку. Минуты включают чтение, обсуждение и запись; раздел соответствия программе предназначен учителю вне этих 45 минут. При 0–1 балле в проверке вернитесь к разобранному примеру; при 2–3 уточните пропущенное звено; при 4 предложите новый случай. Критерии нужны для обратной связи, не задают обязательную школьную отметку.

01. Проблемная ситуация

Программа написана правильно, но без учительского токена она не подключается к Telegram. Можно ли проверить обработчики и изучить API без регистрации ученика и без публикации секрета?

За 1 минуту прочитайте ситуацию; за 2 запишите предварительное решение и основание; за 2 сравните с соседом и назовите недостающую проверку. Случаи, числа и реплики условного ИИ созданы для обучения, не являются результатами испытания действующего сервиса.

02. Объяснение и разобранный пример

5–14 минут: 4 минуты — понятия; 3 — совместный разбор; 2 — проверка ограничений примера.

API — правила обмена между программами. Бот получает обновление, диспетчер направляет его роутеру, фильтр выбирает подходящее событие, обработчик выполняет действие и отправляет ответ через API. Обычный бот по готовым правилам ещё не является нейросетью.

Токен разрешает доступ к конкретному боту. Его получает учитель для своего учебного бота через официальный BotFather, проверяет правила сервиса и не отправляет секрет в статью, чат, скриншот или репозиторий. Код читает BOT_TOKEN из переменной окружения. Ученики работают с подготовленной средой; отдельный аккаунт им не нужен.

asyncio запускает асинхронные функции. async def определяет такую функцию, await ожидает операцию без обязательного блокирования всех других задач. Это не команда «сделать всё одновременно» и не гарантия отсутствия ошибок. Точка входа — блок, запускающий main при выполнении файла, а не при его импорте.

Заготовка проверена 15 октября 2026 на Python 3.12 и aiogram 3.31.0: настоящая маршрутизация библиотеки испытана на шести искусственных обновлениях с заменой сетевого транспорта. Реальный токен и соединение Telegram при подготовке не использовались. Поэтому мы подтверждаем работу кода в офлайн-испытании, но не существование работающего публичного сервиса.

Разобранный пример. Сообщение /start проходит фильтр CommandStart и вызывает start. Обычный текст попадает в text_message, фотография — в other_message. Порядок обработчиков существенен: широкий обработчик без фильтра, поставленный первым, может перехватить команду. Наша программа не сохраняет и не повторяет личный текст пользователя.

03. Практика 1: Запустите минимальный код и проследите маршрут

Подготовленная папка содержит bot.py, offline.py и teacher_launch.py. Установка в отдельной среде: python -m venv .venv; затем её Python выполняет python -m pip install aiogram==3.31.0. Учитель делает это до урока и запускает python offline.py для проверки. Основной код ниже полностью совпадает с комплектом PDF. Python 3.10+ поддерживается библиотекой; здесь испытана версия 3.12. Код в таблицах ниже показан для чтения. Для запуска используйте исходники из PDF или готового комплекта: там сохранены обычные пробелы и отступы; не переносите в Python неразрывные пробелы из экранной таблицы.

bot.py — строки кода
import asyncio
import os
from aiogram import Bot, Dispatcher, F, Router
from aiogram.filters import Command, CommandStart
from aiogram.types import Message
 
 
def make_dispatcher():
    router = Router()
 
    @router.message(CommandStart())
    async def start(message: Message):
        await message.answer("Учебный бот. Команда /help.")
 
    @router.message(Command("help"))
    async def help_message(message: Message):
        await message.answer("Команды: /start и /help.")
 
    @router.message(F.text)
    async def text_message(message: Message):
        await message.answer("Текст получен. Личные данные не нужны.")
 
    @router.message()
    async def other_message(message: Message):
        await message.answer("Этот тип сообщения здесь не используется.")
 
    dispatcher = Dispatcher()
    dispatcher.include_router(router)
    return dispatcher
 
 
async def main():
    token = os.getenv("BOT_TOKEN")
    if not token:
        raise SystemExit("BOT_TOKEN задаёт учитель вне кода.")
    dispatcher = make_dispatcher()
    async with Bot(token=token) as bot:
        await dispatcher.start_polling(
            bot, allowed_updates=dispatcher.resolve_used_update_types()
        )
 
 
if __name__ == "__main__":
    asyncio.run(main())
ВходОжидаемое действие
/startУчебный бот. Команда /help.
/helpКоманды: /start и /help.
приветТекст получен. Личные данные не нужны.
фотографияЭтот тип сообщения здесь не используется.
  1. За 2 минуты найдите точку входа, диспетчер, роутер, фильтры и две строки обращения к API.
  2. За 4 минуты запустите python offline.py и сопоставьте четыре входа из таблицы с обработчиками. Запишите PASS только после реального вывода программы; ошибка тоже входит в протокол.
  3. За 3 минуты проследите цепочку /start и объясните, где данные сообщения превращаются в запрос SendMessage. При подготовленном учителем живом боте взрослый может дополнительно отправить /start и /help в свой учебный чат.
  4. За 2 минуты оформите протокол: среда, входы, ожидаемые/фактические ответы, офлайн или Telegram, что пока не проверено.

Форма результата: Таблица четырёх входов и протокол среды/статуса.

Критерии: По 1 баллу: элементы; реальный запуск/разбор ошибки; маршрутизация; честный протокол. Всего 4.

Ответ, объяснение и критерии для учителя

Точка входа — if __name__ == "__main__"; диспетчер создан через Dispatcher, роутер через Router и включён include_router. CommandStart, Command("help") и F.text фильтруют события. message.answer формирует отправку ответа; в офлайн-тесте её исполняет NoNetwork. Четыре входа соответствуют таблице. PASS подтверждает проверенные пути библиотеки, не реальный токен, сеть или доступность Telegram.

Оценка: По 1 баллу: элементы; реальный запуск/разбор ошибки; маршрутизация; честный протокол. Всего 4.

04. Практика 2: Испытайте неизвестную команду и безопасный отказ

offline.py — строки кода
import asyncio
from datetime import datetime, timezone
from aiogram import Bot
from aiogram.client.session.base import BaseSession
from aiogram.methods import GetMe, SendMessage
from aiogram.types import Chat, Message, Update, User
from bot import make_dispatcher
 
 
class NoNetwork(BaseSession):
    def __init__(self):
        super().__init__()
        self.sent = []
 
    async def close(self):
        pass
 
    async def make_request(self, bot, method, timeout=None):
        if isinstance(method, GetMe):
            return User(id=123456, is_bot=True, first_name="Test",
                        username="ii_lesson_test_bot")
        if not isinstance(method, SendMessage):
            raise AssertionError("Неожиданный метод API")
        self.sent.append((method.chat_id, method.text))
        return Message(message_id=1, date=datetime.now(timezone.utc),
                       chat=Chat(id=method.chat_id, type="private"),
                       text=method.text)
 
    async def stream_content(self, url, **kwargs):
        raise AssertionError("Сеть запрещена в офлайн-тесте")
        if False:
            yield b""
 
 
async def check():
    # Фиктивный идентификатор только для конструктора теста, не токен API.
    session = NoNetwork()
    async with Bot(token="123456:NOT_A_REAL_TOKEN", session=session) as bot:
        dispatcher = make_dispatcher()
        cases = [
            ("/start", "Учебный бот. Команда /help."),
            ("/help", "Команды: /start и /help."),
            ("привет", "Текст получен. Личные данные не нужны."),
            (None, "Этот тип сообщения здесь не используется."),
            ("/start@ii_lesson_test_bot", "Учебный бот. Команда /help."),
            ("/unknown", "Текст получен. Личные данные не нужны."),
        ]
        for number, (text, expected) in enumerate(cases, 1):
            message = dict(message_id=number, date=0,
                           chat={"id":1,"type":"private"},
                           from_user={"id":2,"is_bot":False,"first_name":"Test"})
            if text is None:
                message["photo"] = [dict(file_id="test",file_unique_id="test",
                                         width=1,height=1)]
            else:
                message["text"] = text
            update = Update(update_id=number, message=Message(**message))
            before = len(session.sent)
            await dispatcher.feed_update(bot, update)
            assert len(session.sent) == before + 1, number
            assert session.sent[-1] == (1, expected), number
        print("PASS: 6 случаев, настоящая маршрутизация aiogram, без сети")
 
 
if __name__ == "__main__":
    asyncio.run(check())

Новые случаи теста: /start@ii_lesson_test_bot и /unknown. В NoNetwork используется фиктивная строка только для конструктора; это не действительный токен API. Ни один вызов не выходит в сеть. Дополнительно рассмотрите запуск bot.py без BOT_TOKEN и идею поставить обработчик @router.message() первым.

  1. За 2 минуты предскажите ответы на два новых входа; объясните разницу между командой с адресатом и неизвестной командой.
  2. За 3 минуты запустите все шесть случаев и сравните фактический вывод с прогнозом; если меняете код, сначала сохраните отдельную копию.
  3. За 3 минуты объясните отказ без BOT_TOKEN и последствия широкого первого обработчика; предложите безопасную исправляющую проверку, не вставляя настоящий секрет в файл.

Форма результата: Шесть проверок, объяснение двух отказов и план исправления.

Критерии: По 1 баллу: два прогноза; запуск шести случаев; безопасный отказ; порядок и повторная проверка. Всего 4.

Ответ, объяснение и критерии для учителя

Команда с адресатом проверенного тестового бота вызывает start; /unknown попадает в обработчик текста и получает его фиксированный ответ. Без BOT_TOKEN main завершает запуск с понятным сообщением, не открывая соединение. Широкий первый обработчик может перехватить команды; исправление — сохранить специфические фильтры перед общим и повторить шесть тестов. Офлайн-проверка не проверяет настоящий секрет и сеть.

Запуск только учителем без записи секрета в файл: python teacher_launch.py. Файл teacher_launch.py полностью приведён ниже.

teacher_launch.py — строки кода
import asyncio
import getpass
import os
from bot import main
 
try:
    os.environ["BOT_TOKEN"] = getpass.getpass("BOT_TOKEN (только учитель): ")
    asyncio.run(main())
finally:
    os.environ.pop("BOT_TOKEN", None)

Оценка: По 1 баллу: два прогноза; запуск шести случаев; безопасный отказ; порядок и повторная проверка. Всего 4.

05. Обсуждение: аргумент и возражение

За 2 минуты защитите тезис «Бот автоматизирует ответы». За 3 возразите против автоматической передачи личного сообщения в будущую нейросеть. За 2 сформулируйте предел этой версии.

Ожидаемое рассуждение и критерии обсуждения

Бот ускоряет обмен по правилам, но не является универсальным ИИ. В этой версии не подключена языковая модель, не хранится переписка и не подтверждена реальная служба Telegram. Дальнейшее расширение требует отдельной проверки данных, разрешений, ошибок и фактических ответов.

Критерии: аргумент по материалу; содержательное возражение; условие итогового решения; роль человека. По 1 баллу, всего 4.

06. Индивидуальная проверка понимания

Код не читает BOT_TOKEN и содержит настоящий секрет прямо в тексте. Ученик хочет опубликовать файл после одного удачного /start. Назовите четыре нужных действия.

За 3 минуты запишите ответ; за минуту сверьте ключ и исправьте другим цветом; за последнюю минуту сдайте запись. По 1 баллу за каждый из четырёх содержательных элементов.

Ключ и критерии: 4 балла

Не публиковать секрет; учителю отозвать скомпрометированный токен через официальный инструмент и задать новый вне кода; читать переменную окружения; повторить разные тесты и отделить проверку маршрутизации от живого подключения. По 1 баллу за каждый содержательный пункт.

07. Связь с исходной программой

Пункт программы → действие → проверяемый результат
Пункт программыДействие ученикаЧто проверяет учитель
Создавать бот на Python с использованием библиотеки aiogram и библиотеки асинхронного программирования asyncio.Запускает подготовленный кодШесть реальных офлайн-тестов настоящей библиотеки
Раскрывать смысл понятий «токен», «роутер», «хендлер», «точка входа». «фильтр».Объясняет маршрут обновленияСвязывает понятия со строками кода
Получать токен – уникальный код телеграм-бота.Учитель подготавливает собственный учебный ботСекрет вне публикации; фактический статус подключения
Писать минимальный код для запуска бота.Разбирает main и точку входаЗапуск и безопасный отказ без переменной

Матрица относится к результатам данного урока. Другие существенные результаты модуля раскрываются в остальных уроках по опубликованному плану.

Источники и права на материалы

Основа содержания и результатов — исходная программа класса. Поурочное название и учебные случаи — авторская методическая развёртка, не дословные названия модулей программы. Числовые наборы, реплики условных помощников и ситуации специально подготовлены для урока. Учебные журналы не являются результатами испытания реального ИИ.

aiogram 3.31.0: официальная документация; проверено 15 октября 2026 — источник для понятий и проверки; учебные задания разработаны отдельно.

Telegram: официальный Bot API — источник для понятий и проверки; учебные задания разработаны отдельно.

Python 3.12: asyncio, официальная документация — источник для понятий и проверки; учебные задания разработаны отдельно.

Логотип «Школы России» используется в материалах портала; авторские схемы предназначены для учебной работы. Внешние материалы сохраняют указанные условия использования.