<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.mymakerbot.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=172.69.54.99</id>
	<title>wiki-MyMakerBot - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.mymakerbot.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=172.69.54.99"/>
	<link rel="alternate" type="text/html" href="http://wiki.mymakerbot.com/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/172.69.54.99"/>
	<updated>2026-06-28T08:40:13Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>http://wiki.mymakerbot.com/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D0%B1%D0%BE%D1%82%D0%B0&amp;diff=25</id>
		<title>Как писать бота</title>
		<link rel="alternate" type="text/html" href="http://wiki.mymakerbot.com/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D0%B1%D0%BE%D1%82%D0%B0&amp;diff=25"/>
		<updated>2019-05-24T07:19:47Z</updated>

		<summary type="html">&lt;p&gt;172.69.54.99: Новая страница: «= Что такое бот, как его понять изнутри =   Если описать внутреннее представление бота в дв…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Что такое бот, как его понять изнутри = &lt;br /&gt;
&lt;br /&gt;
Если описать внутреннее представление бота в двух словах, то бот (в рамках этого конструктора) это совокупность именованных страниц с текстом и кнопками. Текст и кнопки на экране вашего клиента - это результат выполнения какой либо команды. Имя блока текста совпадает с менем команды для простоты восприятия.&lt;br /&gt;
&lt;br /&gt;
Если оглядываться на разные библиотеки, которые используют программисты, то подходы к написанию бота будут разными. Наиболее часто используется функциональный подход, когда мы пишем функцию команды и к ней функцию обработчика. Но этот подход надо попытаться понять и в двух словах мне будет сложно объяснить что это. Мы не будем использовать это представление бота.&lt;br /&gt;
&lt;br /&gt;
Так давайте попытаемся понять - что такое бот. Посмотрим ссылку на любой сайт. После имени сайта вы видите несколько, зачастую английских слов, разделенных символом / (слеш), например, https://www.reg.ru/support в данном случае запись /support - это ничто иное, как страница которую сайт вам должен показать. Не кажется ли вам, что это и есть команды ботам, которые мы используем в телеграме? Так вот бота можно представить как сайт. И когда вы пишете бота, то представьте, что вы пишете сайт. А что такое сайт - это совокупность отдельных страничек с ссылками-переходами. Адрес ссылки вы также прописываете на сайте как /help /support и т.д. Так вот в боте мы то же будем придерживаться этой системы - страницы с именем. Именем страницы и будет наша команда. Например, первая же страница любого бота это /start - совпадает с именем команды?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Пишем бота =&lt;br /&gt;
&lt;br /&gt;
Если мы уже поняли, что мы будем писать сайт, простите, бот, то мы будем писать каждую страничку отдельно. В любом боте это реализовано точно также. Ссылками перехода у нас будут инлайн кнопки под сообщением. Кнопки, которые вы часто видите под строкой ввода сообщения я намеренно использовать не буду. По мне они некрасивые, портят вид, портят единый стиль. Все можно сделать с инлайн кнопками.&lt;br /&gt;
&lt;br /&gt;
Второй момент. По умолчанию интерфейс с такими инлайн кнопками рассчитан на то, что у нас каждый раз меняется сообщение, меняется текст и новый состав кнопок. А значит нам надо в каждом экране (сообщении, блоке - можно по разному называть) надо ВСЕГДА предусматривать кнопки для возврата назад или перехода куда-нить дальше.&lt;br /&gt;
&lt;br /&gt;
В ботах у которых есть и инлайн кнопки и кнопки внизу сообщения, я очень часто видел сатуацию, когда серия диалогов заканчивалась и дальше мы нажимаем инлайн кнопку, а ничего не происходит. Нам нужно после этого нажать кнопку под сообщением для запуска новой цепочки диалога. А по сути получается, что программисты просто бросили ветку и не написали обработчик на законченном диалоге. С одной стороны правильно - пользователю больше нечего ответить, а с другой стороны выглядит как откровенный баг в боте. Ибо кнопка если есть, значит она должна что-то делать и точка.&lt;br /&gt;
&lt;br /&gt;
Интерфейс данного конструктора лишен такого недостатка. Каждая кнопка у вас будет запускать команду (вида /команда), т.е. являтся ссылкой на какой-то существующий (вами написанный) блок. А из него дальше и дальше. Как вы построите карту переходов зависит только от вашей фантазии.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Подготовка ТЗ =&lt;br /&gt;
&lt;br /&gt;
Чтоб не путаться во время написания своего бота, настоятельно рекомендую взять листок бумаги и написать ТЗ&lt;br /&gt;
&lt;br /&gt;
ТЗ - это некое волшебное слово, которое вам поможет значительно быстрее сделать своего бота.&lt;br /&gt;
&lt;br /&gt;
ТЗ - это техническое задание. Нарисуйте диаграмму бота со стрелками. В каждом блоке вы пишете, какой текст будет выводиться. Стрелками вы соединяете свои блоки и вверху каждого блока вы пишете имя самого блока. Все имена блоков на английском языке без пробелов. Например, имена могут быть help support menu backlog и т.д.&lt;br /&gt;
&lt;br /&gt;
После вы соединяете стрелками блоки - это будут ваши переходы. Предположим стрелка идет в блок help, значит на самой стрелке подпишите help. оно вам поможет при формировании кнопок. Позже вы будете просто смотреть в какой блок приходит стрелка - так она и будет именоваться и, забегая вперед, скажу, что именно это имя и будет вписано в команду на кнопке. Как только вы построили диаграмму - вы сделали 50% работы. Вам остается только перенабрать тексты в бота.&lt;br /&gt;
&lt;br /&gt;
= Что такое контроллеры и экшены =&lt;br /&gt;
&lt;br /&gt;
В предыдущей главе мы рисовали ТЗ. Но тз может быть на столько большим, что вам не хватило листика и вы потянулись за другим. А теперь внимание! Возьмите и напишите в уголке предыдущего листика английское имя - какие блоки на этом листике, например это catalog,&lt;br /&gt;
&lt;br /&gt;
далее вы берете второй листик и сразу подписывайте в углу, например, это будут экраны с вашими реквизитами, формой оплаты и отправки сообщения вам о том, что клиент оплатил. Вы подписали этот листик pay.&lt;br /&gt;
&lt;br /&gt;
Таким образом вы разбили ваше тз на некое количество законченных блоков. Но Не забывайте о том, что вы можете рисовать стрелки, как угодно и куда угодно и не обязательно стрелки будут внутри одного листика. Они могут и будут вести и на другие листики. Так вот на выручку как раз и приходят подписи на самих стрелках.&lt;br /&gt;
&lt;br /&gt;
А теперь плано переходим от наших листиков в конструктор. Те имена которые вы подписали над самим блоком - это экшены. А те имена которыми озаглавили сам лист - это контроллер. К примеру у вас лист озаглавлен support, а на листе есть блоки show, about и т.д Нам надо как-то именовать функции. Мы смело можем написать так support__show (разделено двумя знаками подчеркивания). Так вот это и будет ваше полное имя функции.&lt;br /&gt;
&lt;br /&gt;
Чтоб легче понять представьте, что у вас семья - и в семье Вася, Петя. И фамилия у все семьи Ивановы. Полное имя у каждого будет иванов__вася и иванов__петя. И есть другая семья - там тоже есть петя и слава и фамилия у них петровы. Их полные именя будут петров__петя и петров__слава&lt;br /&gt;
&lt;br /&gt;
Вот мы и подошли к тому, что контроллер - это просто визуальное представление, которое помогает разделить большой проект на законченные логические группы. Основной контроллер в боте у нас всегда есть - я его сразу обозвал main И в данном контроллере присутствует наша команда старт (start) Полное имя команды будет выглядеть как /main__start Так же для команд контроллера main можно не писать main, а просто писать /start (Но это только для контроллера main и только!) если у вас в контроллере main будет еще одна команда help - то ее имя будет /help и /main__help Бот будет одинаково выполнять и то и то. Для других контроллеров всегда надо писать имя /контроллер__экшн&lt;br /&gt;
&lt;br /&gt;
Вот именно так выглядят ВСЕ команды нашего бота - сколько бы их ни было.&lt;br /&gt;
&lt;br /&gt;
= Давайте на практике попробуем бота с самой простейшей навигацией =&lt;br /&gt;
&lt;br /&gt;
1. Созадаеде бота в @BotFather, регистрируйте токен в боте. После добавления токена ваш бот стартует в системе. Если вы не хотите, чтоб пользователи тыкали кнопки в боте - остановите. Тогда бот будет работать только для вас. Остальным будет выдавать информацию о техническом обслуживании&lt;br /&gt;
&lt;br /&gt;
2. Перейдите в конструктор ботов и в экшене напишите какое-нибудь приветствие. Напишите сообщение своему боту /start - по сути выполните команду. Вы увидите свое сообщение. Поздравляю - ваш первый простой бот, который может приветствовать с порога и выдавать пользователю на команду start любой текст.&lt;br /&gt;
&lt;br /&gt;
3. Создайте второй экшн и назовите его help. Впишите туда так же любой текст и сохраните. В боте выполните команду /help Вы получите текст помощи, который только что написали. Вы получили вторую команду. Таких команд вы можете делать сколько угодно.&lt;br /&gt;
&lt;br /&gt;
Так сделано большинство старых ботов без особой навигации. Вы стартуете бота и получаете список команд, выполнив которые вы получите тот или иной текст в ответ. И как правило всегда делают команду /help, которая возвращает справку по командам бота. Таким образом вы уже можете создать бота визитку со своими текстами и командами /start /help /contacts ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Теперь наш бот растет. У нас очень много текстов. Делаем бота каталог чего-нибудь. =&lt;br /&gt;
&lt;br /&gt;
Итак, у нас растет количество текстов. Для каждой товарной позиции мы будем делать новый экшн и туда заполнять карточку товара. И у нас слева в редакторе выделено main и количество экшенов катастрофически растет. При том у нас еще и товары разделены на группы - например, часы, конфеты, футболки, куртки. А в каждой группе десятка два-три товаров. Вот для такой ситуации и придуман контроллер - для логического деления на группы.&lt;br /&gt;
&lt;br /&gt;
Создаем новый контроллер watch и внем создаем экшн например brand1 и в этот экшн вписываем описание товара. Как вызвать эту карточку в боте? &lt;br /&gt;
Пишем /watch__brand1 - у нас карточка. &lt;br /&gt;
Теперь карточки разделены по группам и мы быстро можем найти нужный нам товар и поправить.&lt;br /&gt;
&lt;br /&gt;
Примерный текст в команде start&lt;br /&gt;
Наш каталог товаров:&lt;br /&gt;
/watch - часы&lt;br /&gt;
/candies - конфеты&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
вопрос - почему /watch а не /watch__show? Можно и так и так. Бот поймет обе записи. В других контроллерах, кроме main, автоматом вам создается волшебный метод show. Он служит для того, чтоб к нему обращались по краткой команде - /ИмяКонтроллера (просто так эстетически удобно).&lt;br /&gt;
&lt;br /&gt;
Примерный текст в команде /watch (контроллер watch экшн show)&lt;br /&gt;
&lt;br /&gt;
Наш каталог часов:&lt;br /&gt;
/watch__brabd1 - часы от марсиан&lt;br /&gt;
/watch__brabd2 - часы от плутонианцев&lt;br /&gt;
/watch__brabd3 - часы от землян&lt;br /&gt;
/start - вернуться в общий каталог&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Остальные имена экшенов мы пишем полными. Так же по образу и подобию мы можем заполнить контроллер candies.&lt;br /&gt;
&lt;br /&gt;
В итоге мы создали каталог товаров с навигацией просто на слеш-командах. Это наш первый бот. И до введения инлайн кнопок именно такие каталоги и делались. Да и сейчас зачастую встречаются, т.к. это очень просто и быстро реализуется. В итоге в конструкторе ботов мы еще не написали ни одной строчки кода. По сути редактор кода, но мы работаем со стандартным человеческим текстом.&lt;/div&gt;</summary>
		<author><name>172.69.54.99</name></author>
		
	</entry>
</feed>