Рекомендации для обхода блокировки

Создание бота на левый/чужой аккаунт. Или создание на виртуальные симки. Скорей всего вы быстро потеряете своего бота!
Ник бота надо делать с умом. Его нельзя будет больше никогда поменять.
ВАЖНО! Советуем создавать бота на свой основой номер телефона. И это будет хозяин бота, не светить этот аккаунт нигде. А для поддержки использовать дополнительный аккаунт, который не жалко потерять.!
1. Чтобы создать бота нужно обратиться к телеграмм инструменту создания ботов — это @BotFather Ссылка для получения токена
2. Далее вводим токен у нас на сайте. (Это возможно только после авторизации)
Основные ошибки при создании бота в телеграм?
Ошибки, которые могут возникнуть при создании бота в Telegram, включают:
1. Неправильное имя бота: Имя бота должно быть уникальным и оканчиваться на «bot». Если имя уже занято или не соответствует требованиям, BotFather сообщит об ошибке.
2. Неправильный токен: При копировании токена от BotFather важно не допустить ошибок или лишних пробелов. Это может привести к неправильной аутентификации вашего бота.
3. Отсутствие подключения к интернету: Для создания бота и получения токена необходимо иметь активное интернет-соединение. Убедитесь, что ваше устройство подключено к интернету перед началом процесса создания бота.
4. Ограничения на создание ботов: В некоторых странах или регионах может быть ограничение на создание ботов в Telegram. Если вы сталкиваетесь с такой проблемой, попробуйте использовать VPN или обратитесь в службу поддержки Telegram для получения дополнительной информации.
5. Неправильная команда: Если вы отправляете неправильную команду BotFather, он может не распознать ваш запрос или ответить ошибкой. Убедитесь, что вы правильно вводите команды и следуете инструкциям BotFather.
Если вы столкнулись с какой-либо из этих ошибок, рекомендуется внимательно прочитать инструкции и повторить процесс создания бота снова. Если проблема не устраняется, обратитесь в службу поддержки https://t.me/BOTT_SUPPORT_BOT для получения дополнительной помощи.
Как изменять команды бота в botfather (описание, картинку и тп.)?
Настройка бота
Вот примеры написания основных команд и их расшифровка:
/newbot — зарегистрировать нового бота
/mybots — редактировать своих ботов
Редактирование бота — edit bot
/edit name — изменить имя бота;
/edit description — изменить описание бота;
/edit about — изменить информацию о боте;
/edit botpic — изменить фотографию профиля бота;
/edit commands — изменить список команд;
/deletebot — удалить бота.
Общие настройки в Botfather

Настройка бота общие
/revoke — отозвать токен доступа к боту или поменять токен;
/inline mode — включить встроенный режим (позволяет обращаться напрямую к боту из любого канала, группы или чата, написав его имя в поле отправки сообщений)
/setinlinegeo — переключать запросы местоположения при использовании бота во встроенном режиме.
/setinlinefeedback — изменить настройки обратной связи (сбор статистики наиболее часто отправляемых боту команд)
/allow groups — определяет возможность добавления вашего бота в группы;
/group privacy — переключить режим конфиденциальности в группах
/transfer Ownership — передать бота человеку
Создаем бота в BotFather: инструкция, команды, настройки
BotFather – «бот над всеми ботами» в Телеграмме. БотФазер представляет собой интерфейс доступа к API (Application Programming Interface) мессенджера Telegram. С помощью BotFather вы можете создавать ботов и управлять существующими.
Что такое бот в Телеграмме и чем отличается от обычного пользователя?
- Для создания бота не нужен номер телефона (с декабря 2022 Телеграмм убрал это требование и для обычных юзеров).
- Нет статуса «онлайн» или «последний визит». Вместо этого прописывается «бот».
- Bot не может сам начать общение с пользователем. Но юзеры могут вызвать его в чате.
- Имя пользователя должно заканчиваться на «bot».
- У ботов в Телеграмме ограниченное облачное хранилище (cloud storage), поэтому старые сообщения удаляются после их обработки.
В официальной документации Телеграмма указано, что пользователи и разработчики создали более 10 млн ботов.
Варианты использования разные: интеграция с другими сервисами (1С, умный дом, сайт), перевод текстов, напоминания, опросы, отображение погоды, расчет курсов валют и многое другое.
Как создать бота для Телеграма через BotFather: инструкция и пошаговые действия
Чтобы сделать бота в Telegram без кода и навыков программирования, необходимо:
Зайти в аккаунт и указать в поиске BotFather. Нас интересует именно официальный @BotFather с синей галочкой верификации.

В диалоговом окне указываем команду /start, чтобы запустить сервис. Система показывает доступные команды (редактирование бота, настройки, игры). Вписываем /newbot, чтобы запустить процесс создания.
Система просит указать название (к примеру, в нашем случае ChatLabs_bot). После этого необходимо вписать username – BotFather сразу предупреждает, что юзернейм бота должен заканчиваться на слово bot. Вписываем ChatLabs_bot.
В случае успеха видим сообщение о том, что наш бот для Телеграмма создан и готов к работе.

На этом этапе вы получаете токен для доступа к HTTP API Telegram. Не передавайте token третьим лицам.
Все! Вы создали бота для Телеграма при помощи БотФазера. В информационном сообщении найдете ссылку на него (в нашем примере это t.me/ChatLabs_bot).
Если перейти по урлу, увидите бота.

Чтобы начать работу с ним, нажмите «Старт».
Создать бота в Телеграме самостоятельно и без навыков программирования можно. Но если вы хотите добавить кастомные функции (вывод погоды, показ курса валют, близлежащих заведений и так далее), то необходимо написать код. К примеру, мы в ChatLabs используем Python и реализуем для заказчиков проекты любой сложности.
Создавали бота доставки еды (интеграция с iiko, прием оплат, уведомление пользователя о статусе заказа), бота для дилера напольных покрытий (добавление партнеров через 1С, просмотр остатков на складе, поиск аналогов, работа с корзиной), чат-бота для службы такси (заказ авто на определенное время, заявки на работу для водителей и другие). Предлагаем посмотреть примеры решений для интернет-магазина, стартапа, мероприятия.
Чтобы посмотреть список ваших ботов, просто задайте команду /mybots. В диалоговом окне увидите названия.

Команды BotFather: редактирование и удаление ботов в 2023 году в 1 клик
Выше мы уже разобрали 2 основные команды БотФазера:
- /newbot – создание нового бота;
- /mybots [beta] – получение списка существующих.
Редактирование ботов осуществляется командами:
- /setname – выбрать имя (или изменить его). Это то, что будет отображаться в диалоговом окне.
- /setabouttext – добавить приветствие. Это тот текст, который будет видеть пользователь до того, как нажмет на «START» для запуска.
- /setdescription – указать описание (если нужно). Дескрипшен будет виден в профиле. Как правило, в описании перечисляют, как работает бот, для чего создан, какие правила.
- /setuserpic – установить фото / аватар. Обратите внимание, что есть 2 вида: ботпикча и дескрипшен-пикча. Первый используется как аватар. Второй появляется в блоке What can this bot do. В качестве дескрипшен-фото принимаются и GIF (требования к разрешению фото – 640×360, ограничения по гифкам – 320×180, 640×360 or 960×540).
- /setcommands – установить список команд, которые будут доступны для использования. Система просит прописать их в формате «command1 — Description» (т.е. «команда – описание»). На практике это выглядит как Buy – купить, Order – заказать.
- /deletebot – удалить бота. Сделать это в 1 клик не получится. Система получает команду, затем просит вас еще раз подтвердить действие. Только после этого удаляет.
Управление настройками осуществляется при помощи команд BotFather. Интерфейс интуитивно понятный.

Настройки BotFather: токен, платежи, управление группами, передача прав и другие
Во вкладке Bot Settings представлены основные настройки, которые предоставляет @BotFather.

Вы можете задать команду /mybots, выбрать нужного и использовать кнопки управления.

API token в Телеграм от BotFather: как получить и сгенерировать новый
Чтобы увидеть токен для доступа к API Telegram, кликаем на «API token». Система автоматически покажет уникальную комбинацию из букв, цифр, знаков препинания.
Если старый токен попал в руки мошенников или был утерян, используйте команду «Revoke current token».
Bot Settings в Telegram от BotFather: добавление в группы, права админа, privacy mode и другие

В каждой из вкладок находятся дополнительные настройки.
- «Allow Groups?» – можно или нельзя добавлять бота в группы.
- «Group Privacy» – активирует или деактивирует режим конфиденциальности «Privacy mode».
- «Group Admin Rights» – какие права у администратора (добавлять новых администраторов, приглашать новых пользователей, удалять сообщения, банить / разбанить юзеров, управлять голосовыми, а также другие).
- «Channel Admin Rights» – аналогично предыдущему, но касается прав администратора канала.
- «Domain» – привязать веб-сайт, чтобы использовать виджет входа в Telegram.
- «Payment» – список доступных платежных систем для вашего бота (Юкасса, Сбербанк, PayMega, CasCad, iPay88, Робокасса и другие). Доступно более 15 методов проведения платежей для 200+ стран мира.
Чтобы передать Телеграмм-бота другому лицу, используйте «Transfer ownership». В новом окне необходимо будет указать логин рецепиента – того, кому передаете бота.

Что такое Inline mode (инлайн мод) в ботах Телеграмм?
Режим встроенных запросов для взаимодействия с ботом.
Классический вариант – команды через кнопки или ввод /mybots и тому подобных.
Чтобы активировать опцию, задаем команду БотФазеру /setinline. Дальше указываем текст-заполнитель, который будет показываться в поле ввода после указания имени бота.

Инлайн-режим в Телеграмме позволяет вводить запрос через @, не отправляя никаких сообщений.
Inline mode в Telegram поддерживает 20+ типов контента, среди которых:
- @gif – поиск по GIF;
- @vid – поиск по видео;
- @pic – картинки из Yandex;
- @bing – изображения из Bing;
- @wiki – поиск по Wikipedia;
- @imdb – IMDB;
- @bold – изменение стиля текста;
- @youtube – работа с Ютюб (предлагает войти, а затем показывает персонализированные результаты);
- @music – музыка;
- @foursquare – найти и отправить адреса мест;
- @sticker – стикеры, а также многие другие.
Вот как это выглядит в Телеграмме:

Как сделать игру в Телеграмм: кнопки BotFather и настройки развлечений
Настройки БотФазера позволяют создавать HTML5-игры, а затем предлагать их в группе или приватных чатах. Типичные примеры – викторины, шашки и шахматы, а также другие. Список команд BotFather, которые используются для создания, редактирования, просмотра и удаления игр.

Созданную игру можно отправлять как обычное сообщение или при помощи инлайн-режима (с кнопкой для старта). Когда пользователь нажимает на запуск игры, бот получает callback с информацией о выбранном развлечении. Дальше система отвечает юзеру ссылкой. Игра открывается во встроенном браузере.
Теперь вы знаете основные кнопки BotFather и настройки для управления ботами. Чтобы наш ChatLabs_bot заработал полноценно, необходимо взаимодействовать с Telegram Bot API и писать код.
Поделиться
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
- Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
Команды BotFather и ботов Telegram
Как создать бота в Телеграме и настроить команды: ограничения, правила BotFather, лайфхаки для новичков и разработчиков – полная инструкция в обзоре!
О том, как сделать первого Телеграм-бота через БотФазер и что для этого нужно, рассказывали в статье «Создаем бота в BotFather: инструкция, команды, настройки». В этом материале остановимся на командах для Telegram и работы с мессенджером:
- для BotFather – создание бота, редактирование, установка описания / аватара и т.д., управление играми в Telegram;
- для разработчиков – какие команды поддерживает бот в Телеграме, как устанавливать их, какие требования к названиям, как устанавливать через БотФазэра или пакетно.
Как настроить команды чат-бота в Телеграм через BotFather
Чтобы задать команды нашему боту, созданному ранее в пошаговой инструкции, идем в BotFather и выбираем /setcommands.
БотФазер предлагает задавать новые таким образом:
- command1 — Description;
- command2 — Another description.
Если перевести на русский, нам нужно ввести команду и ее краткое описание. В данном примере это command1 — info about ChatLabs. БотФазер уведомляет о том, что обновил лист (список) команд, и теперь в нем будут заданные нами.

Давайте проверим, что удалось создать. Запрашиваем список ботов через /mybots, выбираем нужный и видим, что у него есть 1 заданная command.

Давайте теперь перейдем в бота и проверим, действительно ли наша команда добавлена. Да, она вызывается и имеет короткое описание – все так, как мы и задавали. Теперь вы знаете, как сделать команды в Телеграм боте через @BotFather. Правда, нужно добавлять логику (что будет происходить после вызова, откуда приходят данные, какие они и т.д.).

Команды BotFather для создания ботов Telegram и управления ими
Чтобы увидеть список команд Бот Фазер, необходимо перейти в Телеграм (@BotFather, обязательно проверяйте галочку верификации!) и ввести команду /help. Также можно запросить меню с клавиатуры. Команды Телеграм, которые доступны сегодня, могут дополняться завтра. К примеру, в 2023 появился целый набор функций для работы с веб-приложениями Web Apps.

Давайте разберем команды для бота Телеграм через BotFather.
Как создать бота в Telegram
Бот Фазэр предоставляет команды:
- /newbot – создаем нового бота в Телеге;
- /mybots – редактирование chat bots на аккаунте.
Как редактировать бота в Telegram
Телеграм предоставляет следующие команды из категории «Edit Bots»:
- /setname – установить имя для чат-бота;
- /setabouttext – добавить информацию в раздел «О боте»;
- /setuserpic – установить фотографию профиля (обратите внимание, что сегодня тг поддерживает и иные форматы аватара);
- /setdescription – изменить дескрипшен (это короткое описание, которое имеет chatbot);
- /setcommands – изменить набор команд (задать все необходимые);
- /deletebot – удалить бота.
Как изменить настройки бота в Телеграм
Набор команд из категории «Bot Settings» в BotFather Телеграм выглядит таким образом:
- /token – сгенерировать токен авторизации;
- /revoke – отозвать авторизационный token;
- /setinline – перейти в inline mode (инлайн-режим позволяет взаимодействовать с чат-ботом без клика на «Start»);
- /setinlinegeo – активировать инлайн-запросы геолокации;
- /setinlinefeedback – изменить настройки инлайн-режима;
- /setjoingroups – параметры добавления в группы;
- /setprivacy – активация приватного (прайваси) доступа для работы с группами.
Как задавать настройки Web Apps (веб-приложений) в Телеграм
WebApp внешне напоминает сайт с каталогом или другой функциональностью. Команды для работы с веб-приложениями в Telegram:
- /myapps – редактировать веб-приложение;
- /newapp – создать новый веб-аппликейшн;
- /listapps – получить список Web Apps на аккаунте;
- /editapp – редактировать веб-приложение;
- /deleteapp – удалить web app.
Как создавать игры и управлять ими
Команды для Games были в режим beta, но сегодня доступны и работают полноценно. Разработчикам чат-ботов функциональность игр сегодня позволяет реализовать любую механику:
- Play2Earn (p2e) – играй, чтобы зарабатывать;
- Move2Earn (m2e) – двигайся, чтобы зарабатывать;
- Learn2Earn (l2e) – изучай, чтобы зарабатывать;
- Free2Play (f2p) – играй бесплатно и так далее.
Появление раздела с играми в Телеграмме открыло целое направление – геймификация в мессенджере. К примеру, мы делали бота для игры в шахматы в Телеграм (Web Apps).
Команды BotFather Телеграм, чтобы создать и отредактировать игру:
- /mygames – запросить игры;
- /newgame – создать новую игру в ТГ;
- /listgames – запросить список игр в Телеграме;
- /editgame – отредактировать игру;
- /deletegame – удалить игру в ТГ.
Естественно, дерево команд разветвленное. К примеру, после выбора /newbot Бот Фазер предложит задать имя и юзернейм, после чего выдаст ссылку и токен доступа.

Команды БотФазер в Телеграм позволяют создать простого бота. Чтобы chat bot работал по нужным сценариям с кнопками «Купить», «Оплатить», «Заказать», «Посмотреть» и так далее, нужно использовать дополнительные команды. Условно мы назвали их «Commands for developers». Т.е. команды чат-ботов для разработчиков – те, которые не предоставляет BotFather, но которые нужны для прикручивания определенного функционала. Они все равно задаются через БотФазера и /setcommands (или при взаимодействии с API напрямую).
Команды бота в Телеграм для разработчиков
Команда – ключевое слово, которое пользователь отправляет в чат-бот. Основные правила для работы с командами чат-ботов для девелоперов:
- Команда боту в Телеграм всегда начинается со слеша (/) и выглядит как /keyword. Ключевое слово после слэша указывает чат-боту, что нужно делать.
- Хайлайтс команд в сообщениях. Когда юзер нажимает на команду, она отправляется снова.
- Список поддерживаемых ботов команд лучше делать с описанием. Короткий дескрипшен появляется после знака / и отвечает на вопрос, что произойдет после вызова команды. Чтобы реализовать функционал, нужно предоставить список команд @BotFather или через метод API.
- Команды должны быть максимально конкретными. При этом разработчики Telegram делятся лайфхаком: /newlocation или /neworder лучше, чем просто команда /new. Причина в том, что в последнем случае нужно делать «двухходовку» и после команды /new вводить дополнительный параметр /location или /order.
Что касается кастомных команд, которые задает разработчик при создании бота, здесь есть нюансы:
- / обязателен (команда должна начинаться со слэша);
- длина – до 32 символов;
- буквы – только латиница (английские).
Допускается задавать команды с использованием цифр и знаков (настройки Телеграмма поддерживают подчеркивания).
Примеры команд для чат-бота:
- /next;
- /profile;
- /cancel;
- /newlocation;
- /newrule и так далее.
Можете посмотреть, как реализован чат-бот @ChatLabs_bot. Он – помощник в работе с входящими запросами от клиентов.

Глобальные (общие) команды ботов в Телеграмме
Мессенджер просит использовать при разработке так называемые «Глобальные» (Global Commands). Они нужны, чтобы привести всех ботов в Telegram к единообразному и удобному интерфейсу.
Глобальные (общие, публичные) команды для чат-бота в Телеграмме:
- /start – начало взаимодействия (к примеру, когда bot отправляет пользователю приветственное сообщение). Глобальная /start используется также для передачи боту дополнительных параметров через Deep Linking.
- /help – справка. Глобальная command в Телеграм нужна для короткого описания робота и его функциональности. В пару кликов юзер может увидеть список команд и «способностей» robot.
- /settings – настройки для конкретного пользователя и команды редактирования (если применимо).
Кнопку «Start» пользователи видят при первом взаимодействии с роботом. Ссылки на /help и /settings будут доступны после добавления их в @BotFather.
Области действия команд (Command Scopes, скоупы), настройка ролей
Функционал нужен для того, чтобы распределить роли. Если коротко, то бот может показывать одни команды администраторам, а совершенно другие – обычным пользователям. Command Scopes – продвинутая функция Телеграм.
На бекенде всегда нужно проверять: а) есть ли вообще запрашиваемые команды; б) имеет ли пользователь право работать с ними. Учитывайте, что у ботов Телеграм с включенным режимом конфиденциальности работа строится иначе.
Команды ботам в Privacy Mode (прайваси, режим конфиденциальности)
Privacy Mode используют для управления группами и выполнения специфических задач, связанных с модерацией и менеджментом. Соответственно, и команды для них в Телеграмме будут отличаться.
К примеру, chat bots в Privacy Mode в Telegram видят только команды:
- явно предназначенные для них (к примеру, имеющие формат /command@forthis_bot).
- общие (/start, /settings, /help), если bot был последним отправившим сообщение группе.
Режим конфиденциальности нужен, чтобы сделать робота более эффективным (особенно на хайлоад-проектах). Активированный Privacy Mode уменьшает количество вводных данных, которое должен обработать robot в TG.
Как создать команды для бота в Телеграм для администрирования группы, чата, канала
Команды Telegram бота для администрирования групп нужны для «поддержания порядка». Сегодня на рынке есть роботы-администраторы и модераторы, которые значительно упрощают работу с сообществами. Бесплатные боты для Телеграмм-каналов и чатов разбирали в отдельной инструкции.
Условия просты: команды отправляются в ответ на сообщение нарушителя, к которому применяются санкции. Основные commands:
- !kick – выбросить человека из чата (возможен возврат в любой момент);
- !unban – разбанить (снять бан);
- !mute – мут / читалка (участник получает ридонли, т.е. может читать чат, но не будет отправлять сообщения);
- !ban – забанить (в случае временного бана на определенный период может выглядеть как !ban 20d);
- !unmute – анмут, снимает действие !mute;
- !warn – выдает предупреждение (после трех / пяти предупреждений участник получает бан);
- !unwarn – снять все предупреждения, а также многие другие.
Команд Телеграм-бота для групп и сообществ может быть значительно больше: вывести статистику, понизить репутацию, получить информацию о пользователе, вывести ТОП участников (по определенному критерию), почистить чат или многие другие.
В Телеграм бот настройка команд проста. При работе с БотФазером проблем не возникает. Но сложности появляются, когда необходимо писать собственную логику на Питоне, Джаваскрипте или других языках программирования. Именно поэтому часто приходят в студию ChatLabs, а не пытаются создать чат-бота самостоятельно.
Благодаря пошаговой инструкции с обзором вы знаете, как прописать команды боту в Телеграм. В обзорах и материалах разберем кнопки с командами Телеграм бота, скрытые команды и многие другие фишки telegram bot API.
Ответы на часто задаваемые вопросы (FAQ)
Как сделать команды в Телеграм боте?
«@BotFather –> /mybots –> название бота –> Edit commands –> ввести название команды». Также есть и более простая пошаговая инструкция, как прописать команды боту в Телеграм. Нужно вызвать /setcommands в настройках робота в @BotFather и задать необходимые.
Как добавить несколько команд в тг бота?
Задать через /setcommands в БотФазере или использовать API. Формат – «command — короткое описание» (command1 — Description).
Почему Телеграм бот не реагирует на команды?
Ошибка в программировании логики чат-бота на Python, Javascript или других языках – самая частая причина (не передали аргументы, не добавили обработчики и т.д.). Среди причин, почему не работают команды бота в Телеграм, настройки конфиденциальности профиля, параметры получения уведомлений бота, работа сервера, проблемы интернет-подключения, некорректный ввод и так далее.
Как удалить команду в боте Телеграм?
Прямой функции «Удалить команду №1» в Botfather нет. Вместо этого администратор запрашивает /setcommands в Ботфазер и задает новый список команд. К примеру, чат-бот работает с тремя:
- /start – начало работы;
- /viewlocation – показать локацию;
- /newlocation – новая локация.
Мы хотим удалить команду для задания новой локации. Для этого выбираем /setcommands в БотФазере и задаем новый набор commands:
- /start – начало работы;
- /viewlocation – показать локацию.
Botfather перезапишет их. Новый набор отобразится приблизительно через 10 минут (не переживайте, если информация обновилась не сразу).
Как добавить несколько команд в тг бота?
Запустить /setcommands в Botfather Телеграмма и вписать новые команды в формате: название – дескрипшн.
Почему команды бота недоступны в группе Телеграм?
Проверьте настройки приватности (Disable, group privacy). Также обратите внимание, что в Телеграме боты не видят сообщения друг друга и не могут на них реагировать.
Как увидеть в Телеграм боте список команд?
«@BotFather –> /mybots –> название бота». Если нужно редактирование, выбираем Edit commands.
Какие в Telegram команды iOS геопозиции?
В Telegram Bot API геопозиция доступна после запроса /setinlinegeo. Объект содержит обязательные параметры longitude и latitude. Дополнительно (опционально) в API предусмотрены horizontal_accuracy, live_period, heading, proximity_alert_radius.
Какая у Botfather инструкция – на русском команды вводить можно?
Инструкция для БотФазера и создания чат-ботов на русском есть на сайте. Bots Telegram поддерживают только английский (/newtoken, /neworder, /newlocation). При попытке задать значение на русском Бот Фазер покажет ошибку.
Какие есть интересные и прикольные команды в ТГ?
Они связаны не столько с разработкой, сколько с ежедневным использованием. Среди интересных фишек установка пароля на чаты, отложенные сообщения (можно настраивать дату публикации), пометить сообщение как непрочитанное, настроить счетчик уведомлений, установить скрытый текст и так далее.
Поделиться
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
- Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
Просто добавь команд: как реализовать диалоговый Телеграм бот на основе шаблона
В предыдущей статье я рассказала, как быстро создать инфраструктуру для диалогового бота на основе Yandex Serverless Functions и базы данных YDB. В качестве примера использовался примитивный бот, реализованный в моём репозитории ydb_serverless_telegram_bot.
Это вторая статья цикла – в ней я покажу, как воспользоваться шаблоном и добавить боту новые команды. В результате читатели смогут реализовать своего собственного бота на основе шаблона.
Все статьи цикла

- Создаём основу для диалогового Телеграм бота в облаке
- — вы здесь —
- Стейты, БД и логи — разбираем шаблон диалогового Телеграм бота
Подготовка
В этой статье я предполагаю, что читатели уже выполнили инструкцию из предыдущей статьи и создали своего собственного бота. Для выполнения инструкций из этой статьи важно:
- Скачать код из репозитория ydb_serverless_telegram_bot – будем дополнять именно его, вооружитесь вашим любимым редактором кода.
- Освоить заливку кода в функцию (см. раздел Запускаем бота в предыдущей статье).
Также полезно прочесть раздел Поговорите с ботом! предыдущей статьи, чтобы вспомнить, как в консоли Яндекс.Облака:
- Проверять содержимое таблиц базы данных YDB.
- Смотреть логи serverless функции для дебага
Что бот умеет сейчас?
Если вы ещё не успели сделать свою версию бота по инструкции из предыдущей статьи, то с моей реализацией бота можно познакомиться по ссылке — YDB serverless example.
Бот поддерживает 4 основные команды:
- /start — показать приветственное сообщение
- /register — “зарегистрировать” пользователя, т.е. спросить пошагово его имя, фамилию, возраст и сохранить в базу
- /show_data — показать данные, которые сохранены в базе про текущего пользователя
- /delete_account — спрашивает подтверждение, что пользователь действительно хочет удалить аккаунт, и, если пользователь подтверждает, удаляет все данные про него из базы данных
Дополнительно во время регистрации доступна команда /cancel , прерывающая процесс.
Текущая схема работы бота:

Что добавим?
В этой статье добавим боту новую команду — /change_data , которая будет давать пользователю выбрать, какое поле нужно изменить: имя, фамилию или возраст, спрашивать новое значение для поля и обновлять запись в базе.
- Пользователь, который ещё не зарегистрировался, не может менять данные.
- Выбор поля для изменения должен быть реализован кнопками, при этом неизвестное название поля, введённое вручную, приниматься не дожно.
- Во время всего процесса должна быть доступна команда /cancel , завершающая процесс без изменений.
- Значение возраста, как и в сценарии регистрации, должно проверяться: если введено не число, пользователь получает замечание и предложение попровать ещё раз до тех пор, пока не будет введено число или команда /cancel .
Вот верхнеуровневая схема сценария, которая поможет нам написать код:

Реализация нового сценария
Скачайте код из репозитория ydb_serverless_telegram_bot, откройте его в вашем любимом редакторе кода.
Чтобы вам было удобнее ориентироваться в инструкции, я использую условные обозначения:
Облачком с троеточием будут обозначаться куски кода, которые нужно скопировать в ваш редактор. Чтобы не путать объяснения и финальную версию.
❗️Восклицательным знаком помечены дополнительные замечания.
❓Вопросительным — те места, которые сейчас могут быть не до конца понятны, но будут разобраны в следующей статье.
Готовим каркас для сценария
Логика бота задаётся функциями-обработчиками сообщений (как команд, так и текстов в свободной форме) и фильтрами, которые определяют, в какой ситуации какой обработчик применяется к очередному сообщению пользователя. Разберём обработчики и фильтры отдельно, а затем соберём вместе в каркас логики бота.
Обработчики
Прежде всего продумаем, какие обработчики нам понадобятся:
- Обработчик команды /change_data , который проверяет регистрацию пользователя и предлагает выбор полей для изменения.
- Обработчик команды /cancel на протяжении всего процесса.
- Обработчик выбранного поля, который проверяет, что поле валидно, и предлагает ввести значение для этого поля.
- Обработчик нового значения, который проверяет корректность и записывает его в базу.
Обработчики определяются в файле bot/handlers.py .
Добавим плейсхолдеры для обработчиков в конец файла bot/handlers.py :
@logged_execution def handle_change_data(message, bot, pool): pass @logged_execution def handle_cancel_change_data(message, bot, pool): pass @logged_execution def handle_choose_field_to_change(message, bot, pool): pass @logged_execution def handle_save_changed_data(message, bot, pool): pass
О реализации каждого обработчика поговорим дальше в статье. Сейчас, чтобы не запутаться в деталях, начнём со структуры.
❓ В сниппете кода выше декоратор logged_execution помогает логировать выполнение функций. О нём подробнее в следующий раз, сейчас примем его как необходимость.
Фильтры
Метод register_message_handler библиотеки TeleBot предусматривает дефолтный набор фильтров — по команде, по типу контента в сообщении (текст, фото, видео, …), по регулярному выражению, произвольной функции от сообщения и т. д. В библиотеке также реализованы специальные фильтры. В данном боте-шаблоне удобной основой являются фильтры по стейтам (состояниям) пользователя, которые позволяют легко и компактно обрабатывать контекст сообщения.
❗️ В библиотеке доступны и другие специальные фильтры, которые мы не будем использовать в этой статье, например, текст сообщения — число или автор сообщения — админ , больше примеров можно найти в репозитории библиотеки TeleBot.
Подробно про то, как реализовано хранилище стейтов и зачем оно нужно, расскажу в следующий раз, а сейчас примем, что нам необходимы два вида фильтров для реализации сценария, и научимся их объявлять в коде:
- Фильтр по команде
- Фильтр по стейту (состоянию) пользователя
Фильтры по команде не требуют подготовки, а вот для фильтрации по состояниям пользователей необходимо их продумать и создать.
В новом сценарии состояния пользователя меняются так:
- В начале сценария состояние пустое, ожидаем команду /change_data .
- После начала сценария бот ждёт от пользователя, какое поле необходимо поменять, поэтому пользователь находится в статусе “выбирает поле”.
- После выбора поля бот ожидает новое значение для поля, чтобы записать его в базу, поэтому пользователь находится в состоянии “придумывает новое значение”.
- В конце сценария или при отмене процесса состояние пользователя снова обнуляется.
Таким образом, для целей фильтрации необходимо завести 2 новых уникальных состояния. Состояния объявляются в файле bot/states.py и для удобства объединяются по сценарию.
Заведём новый класс для сценария изменения данных и состояния в нём, для этого в конец файла bot/states.py добавим:
class ChangeDataState(StatesGroup): select_field = State() write_new_value = State()
Теперь можно присваивать пользователю статусы ChangeDataState.select_field и ChangeDataState.write_new_value и задавать их в качестве условия обработчикам.
Собираем обработчики и фильтры вместе
Верхнеуровневая логика бота собрана в файле bot/structure.py . Для удобства поддержки каждый сценарий задаётся функцией, возвращающей список правил-хэндлеров. Как говорилось выше, правило определяется функцией-обработчиком сообщения и фильтрами.
Например, следующее правило означает, что по команде /register будет вызвана функция handle_register из файла bot/handlers.py .
Handler(callback=handlers.handle_register, commands=["register"])
А такое правило говорит, что функция handle_finish_delete_account будет вызвана, если любое текстовое сообщение придёт от пользователя в состоянии DeleteAccountState.are_you_sure .
Handler( callback=handlers.handle_finish_delete_account, state=bot_states.DeleteAccountState.are_you_sure, )
Также можно комбинировать команды и состояния, а ещё перечислять в качестве фильтра список из нескольких состояний и / или команд, например, как в следующем правиле. Оно значит, что только команда /cancel от пользователя в одном из перечисленных в списке состояний вызовет обработчик handle_cancel_registration .
Handler( callback=handlers.handle_cancel_registration, commands=["cancel"], state=[ bot_states.RegisterState.first_name, bot_states.RegisterState.last_name, bot_states.RegisterState.age, ], )
❗️ Последовательность правил в списке важна! Из всех подошедших правил выполнится первое, поэтому надо внимательно выбирать порядок правил. Если ни одно правило не подошло, сообщение будет проигнорировано.
Итак, мы готовы описать новый сценарий.
Для этого в файле bot/structure.py , например, после функции get_delete_account_handlers добавим новую функцию:
def get_change_data_handlers(): return [ Handler(callback=handlers.handle_change_data, commands=["change_data"]), Handler( callback=handlers.handle_cancel_change_data, commands=["cancel"], state=[ bot_states.ChangeDataState.select_field, bot_states.ChangeDataState.write_new_value, ], ), Handler( callback=handlers.handle_choose_field_to_change, state=bot_states.ChangeDataState.select_field, ), Handler( callback=handlers.handle_save_changed_data, state=bot_states.ChangeDataState.write_new_value, ), ]
❗️ Здесь Handler — это простой класс для упрощения синтаксиса регистрации правил. Он принимает такие же аргументы, как и более традиционный метод register_message_handler библиотеки TeleBot.
❗️ Обратите внимание на последовательность правил — правило для команды /cancel должно быть зарегистрировано раньше, чем правило для обработки исправляемого поля или обработки нового значения поля, иначе сообщение /cancel будет восприниматься как текст для этих двух правил.
Далее необходимо добавить новый сценарий в бота
Для этого в функции create_bot в файле bot/structure.py нужно пополнить общий список правил правилами из нового сценария:
handlers = [] handlers.extend(get_start_handlers()) handlers.extend(get_registration_handlers()) handlers.extend(get_show_data_handlers()) handlers.extend(get_delete_account_handlers()) # new scenario handlers.extend(get_change_data_handlers())
На этом каркас готов, можно переходить к деталям реализации обработчиков.
Готовим тексты, которые увидит пользователь
Все тексты, которые в том или ином сценарии видит пользователь, собраны в файле user_interaction/texts.py .
Чтобы не усложнять туториал, добавим сразу все тексты для нового сценария в конец файла user_interaction/texts.py :
FIELD_LIST = ["first_name", "last_name", "age"] UNKNOWN_FIELD = "Unknown field, choose a field from the list below:" SELECT_FIELD = "Choose a field to change:" WRITE_NEW_VALUE = "Write new value for the field <>" CANCEL_CHANGE = "Cancelled! Your data is not changed." CHANGE_DATA_DONE = "Done! Your data is updated."
В реальности удобнее заполнять тексты по мере реализации функций-обработчиков.
Создаём интерфейс обращения в базу данных
Работа с базой данных YDB реализована в директории database . SQL запросы перечислены в файле database/queries.py , а интерфейс для выполнения запросов из Python кода — в файле database/model.py .
Запросы пишутся на особенном диалекте SQL — YQL (документация). Потренироваться писать запросы можно, нажав кнопку Новый SQL-запрос во вкладке Навигация базы данных YDB, созданной для бота по инструкции из предыдущей статьи.
В нашем случае понадобится добавить запрос, обновляющий данные для user_id в таблице user_personal_info , которая была создана запросом:
CREATE TABLE `user_personal_info` ( `user_id` Uint64, `last_name` Utf8, `first_name` Utf8, `age` Uint64, PRIMARY KEY (`user_id`) );
Такой запрос нужно добавить в конец файла database/queries.py :
update_user_info = f""" DECLARE $user_id AS Uint64; DECLARE $first_name AS Utf8; DECLARE $last_name AS Utf8; DECLARE $age AS Uint64; REPLACE INTO `` SELECT $user_id AS user_id, $first_name AS first_name, $last_name AS last_name, $age AS age, FROM `` WHERE user_id == $user_id; """
Запрос ищет в таблице user_personal_info строку для переданного user_id и меняет значения в строке на переданные в переменные first_name , last_name и age .
Если бы мы писали запрос в интерфейсе Яндекс.Облака, нажав во вкладке Навигация базы данных кнопку Новый SQL-запрос , то он бы выглядел так:
$user_id = CAST(123 AS Uint64); $first_name = CAST("Michael" AS Utf8); $last_name = CAST("Scott" AS Utf8); $age = CAST(42 AS Uint64); REPLACE INTO `user_personal_info` SELECT $user_id AS user_id, $first_name AS first_name, $last_name AS last_name, $age AS age, FROM `user_personal_info` WHERE user_id == $user_id;
В Python-коде нам придётся подставлять для каждого вызова свои значения параметров, поэтому объявляем их с помощью DECLARE .
❓ Почему запрос устроен именно так — рассмотрим подробно в следующий раз. Сейчас будем рассматривать шапку запроса как объявление параметров, значения которых будут подставляться из Python кода.
Теперь нужно создать Python функцию, которая будет выполнять запрос.
Для этого в файле database/model.py добавляем:
def update_user_data(pool, user_id, first_name, last_name, age): execute_update_query( pool, queries.update_user_info, user_id=user_id, first_name=first_name, last_name=last_name, age=age, )
❗️ Для выполнения запросов созданы две функции-помощника — execute_update_query и execute_select_query . Первая подразумевает изменение содержимого базы (добавление, удаление, обновление) и не возвращает никаких данных, а вторая, наоборот, возвращает результат SELECT . В данном случае мы только обновляем базу, поэтому используем execute_update_query . Пример использования execute_select_query можно найти в репозитории.
❗️ Задача обновления данных пользователя может быть достигнута гораздо проще — заменой операции INSERT INTO на UPSERT INTO (документация) в уже существующем запросе add_user_info. Но здесь мне хотелось продемонстрировать полноценное заведение новых запросов в коде.
Заполняем код обработчиков
Вернёмся в файл bot/handlers.py , где мы оставили заготовку для обработчиков, и завершим их реализацию.
Каждый обработчик принимает на вход:
- message: telebot.types.Message — обрабатываемое сообщение, объект класса Message.
- bot: telebot.TeleBot — бот, объект класса TeleBot.
- pool: ydb.SessionPool — пул для соединения в базой данных YDB.
Здесь снова нужно вспомнить про состояния пользователей, которые мы создали в файле bot/states.py , потому что нам предстоит назначать подходящие состояния пользователям по мере продвижения по сценарию или очищать их состояния после завершения сценария.
Для назначения и удаления состояния воспользуемся методами объекта bot класса TeleBot :
bot.set_state(user_id: int, state: StatesGroup, chat_id: int) -> None bot.delete_state(user_id: int, chat_id: int) -> None
Также нам потребуется передавать дополнительную информацию о пользователе между обработчиками. Запись и чтение дополнительной информации происходит с помощью контекст-менеджера:
with bot.retrieve_data(user_id, chat_id) as data: data["field"] = "some value" # set any json-serializable value some_variable = data["field"] # read value of "field" into variable some_variable
❗️ Переназначение состояния с помощью метода bot.set_state не изменяет дополнительную информацию.
❗️ Удаление состояния методом bot.delete_state удаляет также дополнительную информацию.
❗️ Дополнительная информация оборачивается в json перед записью в хранилище состояний, поэтому дополнительная информация должна быть json-сериализуемой.
Напоминание — обновление кода в функции
На данном этапе наш код технически готов к заливке в функцию, несмотря на то, что функциональность до конца не готова. Полезно по мере заполнения логики обновлять бота и проверять, что он работает, как ожидается.
О том, как заливать код в функцию можно прочитать в предыдущей статье в разделе Запускаем бота. Для обновления кода повторяйте Шаг 1 и Шаг 2 подраздела В ручном режиме или выполняйте файл create_function_version.sh из подраздела С помощью командной строки (Linux, MacOS), если вы выбрали обновление через командную строку.
Приступим к реализации обработчиков.
Обработчик команды /change_data
Правило, вызывающее этот обработчик, выглядит так:
Handler(callback=handlers.handle_change_data, commands=["change_data"]),
Когда пользователь присылает команду /change_data , первым делом нужно проверить, что данные про пользователя уже есть в базе, то есть пользователь зарегистрирован. Если пользователь ещё не зарегистрирован — отправим ему сообщение об этом и прекратим сценарий.
Данные в базе хранятся по ключу user_id . Информация об отправителе сообщения, в том числе идентификаторы пользователя и чата, содержится в аргументе message :
message.from_user.id
Получить сохранённые регистрационных данные пользователя можно с помощью функции get_user_info из database/model.py .
А отправить сообщение — методом bot.send_message. Наш бот иногда использует специальную клавиатуру ReplyKeyboardMarkup для упрощения выбора ответа из списка, поэтому в случаях, когда клавиатура не требуется, будем заявлять об этом явно с помощью значения аргумента reply_markup=keyboards.EMPTY .
Таким образом, проверка на наличие сохранённых данных выглядит так:
current_data = db_model.get_user_info(pool, message.from_user.id) if not current_data: bot.send_message( message.chat.id, texts.NOT_REGISTERED, reply_markup=keyboards.EMPTY ) return
Иначе, если пользователь уже зарегистрирован, предлагаем ему выбрать одно из полей из списка texts.FIELD_LIST для изменения и выставляем ему статус ChangeDataState.select_field — чтобы следующее сообщение пользователя имело контекст.
Для выбора пользователем одного поля из списка нужно создать ReplyKeyboardMarkup — клавиатуру с опциями для следующего ответа пользователя. Для создания можно воспользоваться конструктором get_reply_keyboard(options, additional=None, **kwargs) из файла bot/keyboards.py . В options передаётся список строк с основным выбором, а в additional удобно передать технические команды, которые будут отображаться в нижнем ряду клавиатуры, в нашем случае — /cancel .
bot.set_state( message.from_user.id, states.ChangeDataState.select_field, message.chat.id ) bot.send_message( message.chat.id, texts.SELECT_FIELD, reply_markup=keyboards.get_reply_keyboard(texts.FIELD_LIST, ["/cancel"]), )
Собираем обработчик целиком и заполняем плейсхолдер в bot/handlers.py :
@logged_execution def handle_change_data(message, bot, pool): current_data = db_model.get_user_info(pool, message.from_user.id) if not current_data: bot.send_message( message.chat.id, texts.NOT_REGISTERED, reply_markup=keyboards.EMPTY ) return bot.set_state( message.from_user.id, states.ChangeDataState.select_field, message.chat.id ) bot.send_message( message.chat.id, texts.SELECT_FIELD, reply_markup=keyboards.get_reply_keyboard(texts.FIELD_LIST, ["/cancel"]), )
Если сейчас залить код в функцию и написать боту команду /change_data , то в зависимости от наличия регистрации получим две разные реакции.
Скриншот — что увидит незарегистрированный пользователь

Скриншот — что увидит зарегистрированный пользователь

В базе данных в таблице states для зарегистрированного пользователя меняется хранимое состояние.
Скриншот — состояние пользователя после начала сценария

Скриншот — изначальные регистрационные данные в базе

Обработчик команды /cancel
В bot/structure.py мы добавили правило для обработки команды /cancel в любом состоянии нового сценария.
Handler( callback=handlers.handle_cancel_change_data, commands=["cancel"], state=[ bot_states.ChangeDataState.select_field, bot_states.ChangeDataState.write_new_value, ], ),
В случае отмены нужно сбросить состояние пользователя и отправить ему сообщение-подтверждение о том, что процесс отменён. Это просто — все эти действия мы уже умеем делать!
Заполняем плейсхолдер обработчика кодом в bot/handlers.py :
@logged_execution def handle_cancel_change_data(message, bot, pool): bot.delete_state(message.from_user.id, message.chat.id) bot.send_message( message.chat.id, texts.CANCEL_CHANGE, reply_markup=keyboards.EMPTY, )
Залейте обновлённый код в функцию и проверьте, что получилось.
Скриншот — /cancel во время выбора поля для изменения

Состояние пользователя в таблице states после выполнения команды /cancel снова должно стать пустым.
Обработчик выбора поля для изменения
Handler( callback=handlers.handle_choose_field_to_change, state=bot_states.ChangeDataState.select_field, ),
обработчик вызывается, когда пользователь присылает любое текстовое сообщение, находясь в состоянии ChangeDataState.select_field .
Несмотря на то, что на предыдущем шаге мы с помощью ReplyKeyboardMarkup ограничили выбор ответа, всё равно необходимо проверить корректность содержания сообщения, так как клавиатура не запрещает ввод сообщения в свободной форме. Поэтому первым делом убеждаемся, что текст сообщения — одно из доступных полей, а если нет — отправляем пользователю замечание и не меняем его состояние.
Текст сообщения можно получить так — message.text .
if message.text not in texts.FIELD_LIST: bot.send_message( message.chat.id, texts.UNKNOWN_FIELD, reply_markup=keyboards.get_reply_keyboard(texts.FIELD_LIST, ["/cancel"]), ) return
Теперь, когда мы знаем, что в message.text содержится допустимое значение, можем сохранить его в дополнительную информацию, поменять статус пользователя на ChangeDataState.write_new_value и послать ему сообщение с предложением ввести новое значение для выбранного поля. Кнопка /cancel должна быть по-прежнему доступна.
Меняем статус и сохраняем выбранное поле:
bot.set_state( message.from_user.id, states.ChangeDataState.write_new_value, message.chat.id ) with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data["field"] = message.text
Отправляем сообщение, подставляя в текст название выбранного поля, и оставляем в клавиатуре одну кнопку для отмены процесса:
bot.send_message( message.chat.id, texts.WRITE_NEW_VALUE.format(message.text), reply_markup=keyboards.get_reply_keyboard(["/cancel"]), )
Собираем весь код целиком и заполняем плейсхолдер в bot/handlers.py :
@logged_execution def handle_choose_field_to_change(message, bot, pool): if message.text not in texts.FIELD_LIST: bot.send_message( message.chat.id, texts.UNKNOWN_FIELD, reply_markup=keyboards.get_reply_keyboard(texts.FIELD_LIST, ["/cancel"]), ) return bot.set_state( message.from_user.id, states.ChangeDataState.write_new_value, message.chat.id ) with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data["field"] = message.text bot.send_message( message.chat.id, texts.WRITE_NEW_VALUE.format(message.text), reply_markup=keyboards.get_reply_keyboard(["/cancel"]), )
Залейте новый код в функцию и проверьте, что получилось! Обратите внимание, что команда /cancel работает и на этапе после выбора поля без каких-либо дополнительных действий.
Скриншот — выбор поля last_name

Скриншот — отмена после выбора поля last_name

В таблице состояний после выбора поля произошли изменения: обновилось название состояния и добавилась дополнительная информация — название изменяемого поля.
Скриншот — состояние пользователя после выбора поля

Обработчик нового значения поля
Правило вызова обработчика — любое текстовое сообщение от пользователя в состоянии ChangeDataState.write_new_value :
Handler( callback=handlers.handle_save_changed_data, state=bot_states.ChangeDataState.write_new_value, ),
В сообщении должно содержаться новое значение для поля, но обработчик handle_save_changed_data уже не знает, какое именно поле нужно обновить, поэтому сначала получим название поля из сохранённой дополнительной информации:
with bot.retrieve_data(message.from_user.id, message.chat.id) as data: field = data["field"]
Если изменяемое поле — имя или фамилия, то никаких ограничений на новое значение не накладывается. Однако в случае возраста необходимо проверить, что пользователь прислал число. Если это не так, то нужно сообщить об этом пользователю и оставить его в прежнем состоянии. message.text — это всегда строка, поэтому воспользуемся методом isdigit() и приведём значение к числу, если меняется возраст.
new_value = message.text if field == "age" and not new_value.isdigit(): bot.send_message( message.chat.id, texts.AGE_IS_NOT_NUMBER, reply_markup=keyboards.get_reply_keyboard(["/cancel"]), ) return elif field == "age": new_value = int(new_value)
На этом этапе переменная new_value содержит новое значение в том формате, в котором мы готовы записать его в базу: имя и фамилия такие, как ввёл пользователь, а возраст — число типа int . Осталось записать изменения в базу, сообщить пользователю об успехе и очистить его состояние.
Записываем изменения в базу с помощью заранее подготовленной функции update_user_data :
bot.delete_state(message.from_user.id, message.chat.id) current_data = db_model.get_user_info(pool, message.from_user.id) current_data[field] = new_value db_model.update_user_data(pool, **current_data)
Отправляем сообщение о завершении процесса с пустой клавиатурой:
bot.send_message( message.chat.id, texts.CHANGE_DATA_DONE, reply_markup=keyboards.EMPTY, )
Собираем код обработчика целиком в bot/handlers.py :
@logged_execution def handle_save_changed_data(message, bot, pool): with bot.retrieve_data(message.from_user.id, message.chat.id) as data: field = data["field"] new_value = message.text if field == "age" and not new_value.isdigit(): bot.send_message( message.chat.id, texts.AGE_IS_NOT_NUMBER, reply_markup=keyboards.get_reply_keyboard(["/cancel"]), ) return elif field == "age": new_value = int(new_value) bot.delete_state(message.from_user.id, message.chat.id) current_data = db_model.get_user_info(pool, message.from_user.id) current_data[field] = new_value db_model.update_user_data(pool, **current_data) bot.send_message( message.chat.id, texts.CHANGE_DATA_DONE, reply_markup=keyboards.EMPTY, )
Зальём окончательную версию кода в функцию и протестируем сценарий.
Скриншот — успешное изменение фамилии

Скриншот — 2 попытки поменять возраст

Состояние пользователя по окончанию процесса должно оказаться пустым, а данные в базе — обновиться. Также обновлённые данные должны показываться после команды /show_data .
Скриншот — обновлённые данные в базе
I say, I say, I say, I’ll sit on you!

Успех! Подводим итоги.
В этой статье мы научились создавать обработчики сообщений, регистрировать их и добавлять сценарии в бота. Для этого создавали новые наборы состояний пользователей. По пути добавляли тексты для пользователя и обогатили интерфейс общения с базой данных новым запросом.
Я уверена, что вы справились с инструкцией, но если есть необходимость подсмотреть в полный код с реализаций — загляните в ветку репозитория. Мой бот YDB serverless example также поддерживает команду /change_data , хотя она и отсутствует в меню – это тайная функциональность, о которой знают только избранные!
Полученных умений достаточно, чтобы реализовать диалогового бота, который будет делать то, что вам захочется. Создавайте новые таблицы в базе данных, изучайте документацию TeleBot, добавляйте функциональность и не забывайте смотреть во вкладку Логи функции для поиска ошибок.
Скорее всего у вас уже есть море своих идей, но, если хотите ещё потренироваться на шаблоне, – реализуйте игрушечную аутентификацию: добавьте к процессу регистрации задание кодового слова, чтобы показывать данные /show_data и менять данные /change_data только после его проверки.
Удачи и хороших вам ботов!
Что дальше?
Несмотря на то, что в этой статье мы добавили в бота целый сценарий, я всё ещё не вдавалась в подробности реализации шаблона, которые позволили нам это сделать. В следующей статье бота менять уже не будем, а поговорим о том, как устроен шаблон: о деталях пользовательских стейтов, логировании и корректном взаимодействии с базой данных. После этого хочу рассказать об end-to-end тестировании бота. Kiitos lukemisesta ja nähdään!