Перейти к содержимому

Replies бот в телеграмме что это

  • автор:

Опросы v2.0

Пятиминутка ненависти к telebot или Привет, aiogram!

Как вы знаете, во всех предыдущих уроках использовалась библиотека pyTelegramBotAPI, именуемая в коде telebot. В 2015-2017 годах, возможно, она ещё была актуальна, но прогресс не стоит на месте. А telebot, увы, стоит. Кривая реализация поллинга, проблемный next_step_handler, медленная поддержка новых версий Bot API и т.д.

В течение 2019 года я постепенно переносил своих ботов на другой фреймворк, который по многим пунктам превосходит pyTelegramBotAPI, и имя ему – aiogram. «Почему?», спросит меня уважаемый читатель. Что ж, приведу следующие аргументы:

  • это полноценный фреймворк, т.е. позволяет сделать больше полезных вещей;
  • асинхронный, что делает его быстрее в некоторых задачах;
  • поддерживается Python 3.7+ и выше, что сподвигнет обновить свой старенький интерпретатор и использовать новые возможности языка;
  • множество встроенных «помощников» (синтаксический «сахар»), улучшающих читабельность кода;
  • оперативные обновления (поддержка новых опросов появилась в тот же день, что и в самом Bot API);
  • русскоязычный чат поддержки и обсуждений, где сидит, в том числе, и сам разработчик фреймворка;
  • мой любимый пункт: нормально работающий поллинг.

Прокомментирую последний пункт: в настоящий момент почти все мои боты работают на aiogram-ном поллинге и не падают ежедневно, как в случае с pyTelegramBotAPI.

Введение получилось очень большим, поэтому давайте уже перейдём к делу.

Плацдарм для бота

Напишем элементарного эхо-бота на aiogram с поллингом, чтобы бегло ознакомиться с фреймворком. Прежде всего, добавим нужные импорты (предполагается, что мы используем Virtual Environment, подробнее о нём – в уроке №0):

#!venv/bin/python import logging from aiogram import Bot, Dispatcher, executor, types logging.basicConfig(level=logging.INFO) 

Теперь создадим объект бота. А за хэндлеры здесь отвечает специальный Диспетчер:

bot = Bot(token="12345678:AABcdeFGhIJkXyZ") dp = Dispatcher(bot) 

Далее напишем простейший хэндлер, повторяющий текстовые сообщения:

@dp.message_handler() async def echo(message: types.Message): await message.reply(message.text) 

Началась магия.
Во-первых, как я написал чуть выше, за хэндлеры отвечает диспетчер (dp).
Во-вторых, подхэндлерные функции в aiogram асинхронные (async def), вызовы Bot API тоже асинхронные, поэтому необходимо использовать ключевое слово await .
В-третьих, вместо bot.send_message можно для удобства использовать message.reply( ) без указания chat_id и message.id , чтобы бот сделал «ответ» (reply), либо аналог message.answer( ) , чтобы просто отправить в тот же чат, не создавая «ответ». Само выражение в хэндлере пустое, т.к. нас устроят любые текстовые сообщения.

if __name__ == "__main__": executor.start_polling(dp, skip_updates=True) 

Параметр skip_updates=True позволяет пропустить накопившиеся входящие сообщения, если они нам не важны.
Запускаем код, убеждаемся в его работоспособности, после чего удаляем хэндлер вместе с функцией echo, нам они больше не понадобятся, в отличие от остального кода.

Запрашиваем викторину у пользователя

В BotAPI 4.6 появилась новая кнопка для обычной (не инлайн) клавиатуры с типом KeyboardButtonPollType. При нажатии на неё в приложении Telegram появляется окно для создания опроса. В самой кнопке можно выставить ограничение по типу создаваемого объекта: опрос, викторина или что угодно. Опросы нас пока не интересуют, поэтому напишем обработчик команды /start , выводящий приветственное сообщение и обычную клавиатуру с двумя кнопками: “Создать викторину” и “Отмена”, причём вторая отправляет ReplyKeyboardRemove, удаляя первую клавиатуру.

# Хэндлер на команду /start @dp.message_handler(commands=["start"]) async def cmd_start(message: types.Message): poll_keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) poll_keyboard.add(types.KeyboardButton(text="Создать викторину", request_poll=types.KeyboardButtonPollType(type=types.PollType.QUIZ))) poll_keyboard.add(types.KeyboardButton(text="Отмена")) await message.answer("Нажмите на кнопку ниже и создайте викторину!", reply_markup=poll_keyboard) # Хэндлер на текстовое сообщение с текстом “Отмена” @dp.message_handler(lambda message: message.text == "Отмена") async def action_cancel(message: types.Message): remove_keyboard = types.ReplyKeyboardRemove() await message.answer("Действие отменено. Введите /start, чтобы начать заново.", reply_markup=remove_keyboard) 

Клавиатура с кнопками

Сохраняем и предлагаем

В 11-м уроке я использовал библиотеку Vedis для сохранения состояний в файле, чтобы те не сбрасывались после перезагрузки бота. В этот раз мы будем сохранять всё в памяти, а выбор постоянного хранилища останется за читателем, чтобы не навязывать то или иное решение. Разумеется, данные в памяти сотрутся при остановке бота, но для примера так даже лучше.

Наше хранилище будет основано на стандартных питоновских словарях (dict), причём их будет два: первый словарь содержит пары (“id пользователя”, “массив сохранённых викторин”), а второй — пары (“id викторины”, “id автора викторины”). Зачем два словаря? В дальнейшем нам нужно будет по идентификатору викторины получать некоторую информацию о ней. Необходимые нам сведения лежат в первом словаре, но в виде значений, а не ключей. Поэтому нам пришлось бы проходиться по всем возможным парам ключ-значение, чтобы найти нужную викторину.

Для ускорения поиска мы заведём второй словарь, чтобы по идентификатору викторины сразу же найти идентификатор её автора, который, в свою очередь, является ключом в первом словаре. А дальше проход по небольшому массиву и вуаля! Наши данные получены. На словах звучит сложно, но на практике реализуется довольно быстро и с минимальной избыточностью. Если придумаете решение лучше — пишите, буду рад исправить текст.

Помимо определения викторины, нам нужно хранить некоторую дополнительную информацию. Поэтому давайте создадим файл quizzer.py , опишем наш класс Quiz со всеми нужными полями в конструкторе класса (обратите внимание, в конструктор передаются не все поля, т.к. часть из них будет заполнена позднее):

from typing import List class Quiz: type: str = "quiz" def __init__(self, quiz_id, question, options, correct_option_id, owner_id): # Используем подсказки типов, чтобы было проще ориентироваться. self.quiz_id: str = quiz_id # ID викторины. Изменится после отправки от имени бота self.question: str = question # Текст вопроса self.options: List[str] = [*options] # "Распакованное" содержимое массива m_options в массив options self.correct_option_id: int = correct_option_id # ID правильного ответа self.owner: int = owner_id # Владелец опроса self.winners: List[int] = [] # Список победителей self.chat_id: int = 0 # Чат, в котором опубликована викторина self.message_id: int = 0 # Сообщение с викториной (для закрытия) 

Если вы раньше не сталкивались с подсказками типов (type hints), код вида “chat_id: int = 0” может ввести в замешательство. Здесь chat_id — это имя переменной, далее через двоеточие int — её тип (число), а дальше инициализация числом 0. Python по-прежнему является языком с динамической типизацией, отсюда и название “подсказка типа”. В реальности это влияет только на восприятие кода и предупреждения в полноценных IDE типа PyCharm. Никто не мешает вам написать quiz_id: int = «чемодан» , но зачем так делать? Вернёмся в наш основной файл (я его далее буду называть bot.py ) и импортируем наш класс: from quizzer import Quiz . Также добавим в начале файла под определением бота два пустых словаря:

quizzes_database = <> # здесь хранится информация о викторинах quizzes_owners = <> # здесь хранятся пары "id викторины id её создателя" 

Теперь будем отлавливать викторины, приходящие в бота. Как только прилетает что-то, похожее на неё, извлекаем информацию и создаём две записи. В первом словаре храним параметры викторины, чтобы потом её воспроизвести, а во втором просто создаём пару викторина-создатель. Идентификаторы, составляющие ключ словаря, конвертируем в строки методом str() :

Раз уж мы сохраняем викторины, давайте теперь позволим пользователям их отправлять, причём через инлайн-режим. Есть одна загвоздка: в BotAPI через инлайн-режим нельзя напрямую отправлять опросы (нет объекта InlineQueryResultPoll), поэтому придётся доставать костыли. Будем возвращать обычное сообщение с URL-кнопкой вида https://t.me/нашбот?startgroup=id_викторины. Параметры startgroup и start — это т.н. “глубокие ссылки” (Deep Linking). Когда пользователь нажмёт на кнопку, он перейдёт по указанной выше ссылке, что, в свою очередь, благодаря параметру startgroup перекинет его к выбору группы, а затем, уже после подтверждения выбора, бот будет добавлен в группу с вызовом команды /start id_викторины .

Начнём разбираться с инлайн-режимом (не забудьте включить его у @BotFather). Когда пользователь вызывает нашего бота через инлайн, показываем все созданные им викторины, плюс кнопку “Создать новую”. Если ничего нет, то только кнопку.

Очень важно выставить флаг is_personal равным True (ответ на запрос будет уникален для каждого Telegram ID) и указать небольшое значение параметра cache_time , чтобы кэш инлайн-ответов оперативно обновлялся по мере появления новых викторин.
Теперь при вызове бота через инлайн мы увидим наши сохранённые викторины, а при выборе одной из них — сообщение с кнопкой, по нажатию на которую нам предложат выбрать группу для отправки сообщения. Как только группа будет выбрана, в неё будет автоматически добавлен бот с сообщением вида /start@имя_бота . Но ничего не происходит! Сейчас разберёмся.

Отправляем викторину и получаем ответы

Помните наш простой обработчик команды /start , возвращающий сообщение с кнопкой? Настало время переписать этот хэндлер. Первым делом, будем проверять, куда отправлено сообщение – в диалог с ботом или нет. Если в диалог, то всё остаётся по-прежнему: приветствие (на этот раз укажем, что викторина принудительно будет сделана неанонимной) и кнопка для создания викторины.

А вот если сообщение отправлено в группу, то применяем следующую логику: проверяем количество “слов” в сообщении. Одно всегда есть (команда /start ), но может быть и второе, невидимое в интерфейсе приложения Telegram – параметр, переданный в качестве параметра startgroup , в нашем случае это ID викторины. Если второго слова нет (количество слов = 1), то показываем сообщение с предложением перейти в личку к боту с принудительным показом кнопки /start .

В случае, если второе слово есть, то считаем его идентификатором и пробуем отправить викторину в ту же группу. При этом мы, по сути, воспроизводим её [викторину] заново, просто от своего имени: повторяем вопрос, варианты ответов и отключаем анонимный режим, т.к. нам нужно знать, кто победитель.

Очень важный момент: при отправке викторины, в объекте Message будет записан уже новый её идентификатор, который нужно подставить в наши словари. Далее по этому новому ID мы будем смотреть и считать ответы. Побочным эффектом такого подхода будет возможность использования конкретной викторины лишь однажды и в одном чате, если отправить сообщение из инлайна в другой чат, то зашитый в ссылке инлайн-кнопки ID будет недействительным.

Далее необходимо научиться как-то обрабатывать новые ответы. В свежем обновлении API добавилось два новых типа обновлений (updates, т.е. входящие события): PollAnswer и просто Poll . Первый срабатывает при получении новых ответов в викторинах и опросах, в последнем случае ещё и при отзыве голоса (массив голосов от пользователя будет пустой). Второй срабатывает при изменении состояния опроса в целом, т.е. не только при получении новых ответов/голосов, но и при смене состояния “открыт/закрыт” и др. Опять-таки, в обучающих целях мы задействуем хэндлеры на оба типа событий.

Начнём с PollAnswer . Когда прилетает событие с новым ответом на викторину, прежде всего достаём её ID, по ней ищем автора во втором словаре. Если находим, то гуляем по всем викторинам этого пользователя и ищем совпадение по ID самой викторины, т.е. в точности обратное действие, только уже в первом словаре. Когда обнаружится нужная викторина, то проверяем, верный ответ или нет (сравниваем с correct_option_id ), и если да, то записываем ID пользователя в список победителей. Если количество победителей при этом достигает двух, то останавливаем викторину.

Остановка викторины (метод stop_poll( )) вызовет срабатывание хэндлера на тип обновлений Poll с условием is_closed is True . Снова извлекаем нужный нам экземпляр класса Quiz, вытаскиваем ID победителей и вызываем метод get_chat_member, после чего, используя aiogram-ный вспомогательный метод get_mention , формируем ссылку на каждого из победителей в HTML-разметке и создаём поздравительное сообщение. Викторины у нас одноразовые, поэтому подчищаем за собой словари, дабы не раздувать объекты в памяти.

Код готов. Закинем викторину в группу и попросим друзей правильно ответить, а сами ответим неправильно. После первого правильного ответа:

2 ответа, только один правильный

После второго правильного ответа:

3 ответа, 2 правильных, опрос закрыт

На этом всё! Если у вас возникли вопросы, не стесняйтесь задавать их в нашем чатике, а если вы нашли ошибку/опечатку, либо есть чем дополнить материал, то добро пожаловать на GitHub (ну, или всё так же в чате). Полный код урока можно найти здесь.

Telegram Автоответчик: Пошаговый гайд [январь 2024]

Telegram — одно из самых популярных приложений для обмена сообщениями, используемых компаниями по всему миру. Если ваш бизнес использует Telegram для общения с клиентами, вы пришли по адресу. В этой статье мы расскажем вам, как настроить автоответ бота и сообщения Telegram с помощью автоматизации respond.io Workflows. Вы также найдете список полезных примеров автоответа в Telegram!

Зачем использовать Телеграм Auto Reply?

Клиенты не любят ждать или чувствовать, что их игнорируют, когда они пишут сообщения компаниям. Они ожидают быстрых и оперативных ответов, поэтому большинство из них предпочитают использовать такие каналы обмена сообщениями, как Telegram, а не email.

Несвоевременные ответы создают плохое впечатление о бренде и приводят к тому, что компании теряют ценных клиентов, уступая их конкурентам, которые отвечают вовремя. Кроме того, не все компании могут позволить себе иметь агентов, готовых отвечать на запросы клиентов 24 часа в сутки 7 дней в неделю.

Так как же лучше всего обрабатывать входящие разговоры для пользователей Telegram Business? Ответ — Telegram auto reply — автоматическое сообщение, запускаемое в ответ на входящее уведомление Telegram.

Почему стоит использовать Телеграм Auto Reply Bot

Вот некоторые из преимуществ использования автоответчика в Телеграм:

1. Создайте отличное первое впечатление

Клиенты, пользующиеся каналами обмена сообщениями, ожидают быстрого ответа на свои сообщения. Произведите отличное первое впечатление, даже в нерабочее время, приветствуя клиентов дружелюбным и внимательным тоном.

2. Управление ожиданиями времени отклика

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

3. Сбор данных о клиентах

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

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

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

Теперь, когда вы знаете основы, мы расскажем вам о том, как настроить автоответчик Telegram на сайте respond.io.

Как настроить автоответчик в Telegram

Есть одна важная вещь, которую вы должны знать: В приложении Telegram нет функции автоматического ответа. Чтобы отправить сообщение с автоответчиком, вам нужно будет создать Telegram-бота и подключить его к платформе обмена сообщениями, например respond.io.

Как настроить автоответчик в Telegram с помощью respond.io

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

После того как вы создали бота Telegram, пришло время настроить автоответчик Telegram. Вот наше руководство по его настройке на сайте respond.io:

1. Перейдите в модуль рабочих процессов конструктора автоматизации. Нажмите на +Добавить рабочий процесс.

Чтобы настроить автоответ бота Telegram, перейдите в модуль

2. Выберите » Разговор открыт» в качестве триггера рабочего процесса. Затем в качестве условий срабатывания выберите Source is equal to Contact.

Выберите триггер respond.io Workflows.

3. Определите , когда должен срабатывать автоответчик. Для этого добавьте параметр Дата и время Шаг и определите часы работы.

Настройте рабочие часы для установки бота Telegram с автоответчиком

Вы можете отправить:

  • Приветственное сообщение в рабочее время
  • Выездное сообщение в нерабочее время

4. Добавьте шаг «Отправить сообщение » в каждой ветке. Затем выберите Telegram в качестве канала.

Составьте сообщение для бота Telegram с автоматическим ответом

5. Напишите приветственные и прощальные сообщения в автоответчике.

Опубликуйте рабочие процессы для автоматизации ответов в Telegram

6. Нажмите кнопку Опубликовать.

И все готово! Чтобы собрать информацию от ваших лидов, вы можете добавить Задать вопрос Шаг к вашему рабочему процессу. Вы даже можете автоматически квалифицировать своих потенциальных клиентов на основе информации, полученной из вопросов.

Остался только один вопрос — что писать в автоответчике Telegram? Давайте посмотрим несколько практических примеров сообщений для автоответа, которые вы можете использовать.

15 вдохновляющих примеров автоответа в Telegram

При составлении автоответчика для Телеграм в большинстве случаев вполне подойдет дружелюбное и доступное приветствие. Однако вы можете улучшить свою игру, настроив вместо этого сообщение об отсутствии или сообщение для сбора лидов.

На этом изображении показаны лучшие варианты использования автоответа в Telegram

Независимо от ваших предпочтений, мы подготовили для вас эти 15 примеров автоответчиков Telegram, которые вы можете использовать для бизнеса.

Приветственные сообщения

Пять сообщений автоответчика Telegram для приветствия клиентов:

1. «�� Добро пожаловать в [название компании]. Чем мы можем вам помочь?»

2. «Здравствуйте, рад вас слышать. Чем мы можем Вам помочь сегодня? �� «

3. «Здравствуйте! Спасибо, что обратились в компанию [название компании]. Пожалуйста, сообщите нам, чем мы можем Вам помочь».

4. «Привет! Рад видеть вас здесь. Чем мы можем быть Вам полезны?»

5. «Привет! Спасибо, что обратились в компанию [название компании]. Мы рады помочь Вам сегодня».

Отдаленные сообщения

Пять сообщений автоответчика Telegram для управления ожиданиями времени ответа:

6. «Привет! К сожалению, в данный момент у нас нет свободных агентов. Мы получили ваше сообщение и свяжемся с вами к [время]. ⏱ «

7. «Спасибо, что связались с нами! Вы получите ответ в течение 24 часов. А пока вы можете ознакомиться с нашим разделом FAQ здесь [URL]».

8. «Здравствуйте! В данный момент мы закрыты, но мы получили Ваше сообщение. Агент свяжется с Вами, как только мы вернемся. Спасибо за терпение. ��»

9. «Спасибо, что обратились к нам! В данный момент мы находимся в отъезде, но обещаем связаться с Вами как можно скорее».

10. «Привет! Мы получили ваше сообщение. Вы можете ожидать ответа в течение [время]».

Сообщения о привлечении потенциальных клиентов

Пять сообщений автоответчика Telegram для захвата лидов:

11. «Здравствуйте! Мы получили Ваше сообщение и скоро свяжемся с Вами. Не могли бы Вы сообщить свою должность и название компании?»

12. «Спасибо, что связались с [название предприятия]! Пожалуйста, оставьте ниже свое имя и название компании. Агент свяжется с вами ��».

13. «Добро пожаловать в [название предприятия]. Можем ли мы получить ваш адрес email ? ��»

14. «Благодарим Вас за интерес к [название предприятия]! Не могли бы Вы поделиться с нами своим адресом email ?»

15. «Здравствуйте! Мы рады получить Ваше сообщение. Пожалуйста, сообщите Ваше имя, должность и название компании. Мы свяжемся с Вами в ближайшее время!»

Respond.io позволяет создать максимальный опыт общения с клиентами на платформе разговорного искусственного интеллекта с помощью таких инструментов, как рабочие процессы, настраиваемые почтовые ящики и передовые средства аналитики. Попробуйте ведущую платформу для обмена сообщениями. Зарегистрируйте бесплатную учетную запись уже сегодня!

Читать далее

Показалась ли вам полезной эта статья? Если да, то эти материалы также могут вас заинтересовать:

  • Автоматические ответы в Инстаграм: Пошаговый гайд
  • Автоматические ответы в Facebook Messenger: Пошаговый гайд
  • Телеграм Бизнес: Полный гайд

Контент-райтер

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

Как автоматизировать подготовку к собеседованиям с помощью Telegram-бота

Разбираем, как создать бота-интервьюера на Node.js, который поможет подготовиться к собеседованию на фронтенд-разработчика.

Эта инструкция — часть курса «Как создавать Telegram-ботов».

Смотреть весь курс

В этой статье мы разработаем бота для подготовки к собеседованиям. Он будет задавать вопросы по HTML, CSS, JS и React. При этом часть из них будет с вариантами ответа, а часть — без. Базу вопросов вы сможете пополнять самостоятельно.

Во время разработки вы научитесь работать с Telegram Bot API с помощью grammY и Node.js, а также — самостоятельно деплоить ботов на сервер.

Регистрация бота и настройка проекта

Получение токена Telegram Bot API

Для начала нам нужно создать своего бота, а также получить его уникальный ключ — токен. Начинаем диалог с @BotFather в Telegram, вводим команду /newbot и настраиваем бота. После вы получите сообщение с уникальным токеном — он нам понадобится для работы с Telegram Bot API.

Подготовка рабочего окружения

Далее понадобится установить Node.js и npm. Как это сделать — описано в официальной документации. Проверить наличие пакетов в системе можно с помощью следующих команд:

node -v npm -v 

Если в ответ на эти команды вы видите числовые значения, значит, все установлено корректно.

Теперь создадим директорию, в которой будем разрабатывать проект (у меня это frontend-interview-prep-bot), и инициализируем его с помощью npm:

npm init 

В командной строке система задаст ряд вопросов про создаваемый пакет. Я оставил все поля, кроме имени, по умолчанию. Вы можете их заполнить или отредактировать позже.

После финального вопроса нажимаем Enter — в папке должен появиться файл package.json с ранее введенной информацией.

Теперь нам нужно подключить необходимые библиотеки. Главная — та, что позволит упростить разработку и удобно общаться с сервером Telegram. Здесь есть несколько популярных решений:

  • node-telegram-bot-api — самая старая и популярная библиотека. По ней вы найдете множество туториалов, она довольно многословна, но проста и понятна.
  • Telegraf — следующая по популярности, сложнее в использовании.
  • grammY — более лаконичная и простая библиотека в отличие от Telegraf, но сложная в сравнении с node-telegram-bot-api.

В качестве главной библиотеки мы будем использовать grammY. Кроме того, нам понадобится хранить свой токен в переменных окружения — для этого воспользуемся библиотекой dotenv.

Установим библиотеки с помощью команды:

npm i grammy dotenv 

После в папке появится файл package-lock.json с подробным описанием библиотек и их зависимостей, папка node_modules с самими зависимостями. А также в package.json будут добавлены версии библиотек в поле dependencies.

Осталось только создать файл index.js, в котором будем писать код бота. Если решите использовать другое название, не забудьте также внести его в package.json.

Автоматизация перезапуска бота

Чтобы во время разработки бота не приходилось каждый раз перезапускать приложение, мы можем настроить автоматическое обновление при сохранении файлов. Это можно сделать с помощью пакета nodemon:

npm i nodemon 

Переходим в package.json и добавляем команду запуска в свойстве scripts:

< "name": "frontend-interview-prep-bot", "version": "1.0.0", "description": "", "main": "index.js", "scripts": < "start": "nodemon index.js" >, "author": "Arseniy Pomazkov", "license": "ISC", "dependencies": < "dotenv": "^16.3.1", "grammy": "^1.18.1", "nodemon": "^3.0.1" >> 

На этом этапе структура проекта и рабочая среда готова, переходим к написанию кода.

Облачные серверы с гибкой производительностью ядра vCPU

Разработка бота

Основная структура

Открываем index.js, инициализируем объект Bot, используя API-токен, и запускаем бота:

// Обращаемся к библиотеке grammy и импортируем класс Bot const < Bot >= require('grammy'); // Создаем бота на основе импортированного класса, передавая // в качестве аргумента строку с уникальным токеном, который // получили ранее в BotFather const bot = new Bot('1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq'); // Запускаем бота bot.start(); 

Хоть мы и написали всего три строчки, уже есть проблема. Стоит нам, например, загрузить наш код в открытый репозиторий на GitHub, и токен будет скомпрометирован. Чтобы такого не произошло, нам нужно записать ключ в переменную окружения.

Создадим отдельный файл .env в корне проекта и переместим токен туда, записав в переменную BOT_API_KEY:

// Файл .env // Обратите внимание, что кавычек нигде нет BOT_API_KEY=1234567890:UIEaeSx_YsRXdD-C39M0t1PzcdnZZ4HgsKq 

Теперь в файле index.js надо импортировать библиотеку dotenv, и токен будет доступен по вызову process.env.BOT_API_KEY:

require('dotenv').config(); const < Bot >= require('grammy'); const bot = new Bot(process.env.BOT_API_KEY); bot.start(); 

Для запуска бота нужно в консоли выполнить команду:

node index.js 

Все работает, но смысла в этом мало, ведь мы пока не настроили поведение бота. Поэтому реализуем базовые сценарии:

  • реагирование бота на команду /start,
  • ответ на пользовательские сообщения,
  • обработку ошибок.

Команда /start

Чтобы реагировать на команды пользователя (/start, /help и другие), нужно настроить прослушивание события «команда» с помощью метода command. Первым аргументом он принимает название команды без слеша, а вторым — колбэк с реакцией.

Колбэк получает первым аргументом контекст — это объект, который включает информацию о чате, пользователе, отправленном сообщении и т. д. Чтобы ответить на команду, боту достаточно вызвать метод reply у полученного контекста и передать в него строку с ответом.

Поскольку отправка сообщения — это асинхронная операция, нам необходимо дождаться ее выполнения через await, сделав колбэк-функцию асинхронной:

bot.command('start', async (ctx) => < await ctx.reply( 'Привет! Я - Frontend Interview Prep Bot �� \nЯ помогу тебе подготовиться к интервью по фронтенду', ); >); 

Давайте запустим бота и попробуем отправить ему команду /start:

Отлично, все работает — реализуем реагирование на события.

Реагирование на события

Бот может реагировать не только на команды, но и на сообщения с конкретным текстом или содержащие определенный текст, на сообщения с медиафайлами и на события — например, редактирование сообщений и другое.
Подробнее можно прочитать в официальной документации grammy.

Добавим пока реагирование на сообщение «HTML» — в ответ на него будем отправлять вопрос по теме. Кроме того, добавим простой обработчик ошибок:

bot.hears('HTML', async (ctx) => < await ctx.reply('Какой тег используется для создания ссылки?'); >); 
bot.catch((err) => < const ctx = err.ctx; console.error(`Error while handling update $:`); const e = err.error; if (e instanceof GrammyError) < console.error('Error in request:', e.description); >else if (e instanceof HttpError) < console.error('Could not contact Telegram:', e); >else < console.error('Unknown error:', e); >>); 

Подробнее об ошибках и их типах можно почитать по ссылке. Сейчас останавливаться на этом не будем — проверим бота на практике:

Работает. Давайте доработаем ответ на команду /start: кроме сообщения будем выводить кастомную клавиатуру с темами для вопросов.

Основная клавиатура

Добавляем класс Keyboard в импорт из grammy, инициализируем клавиатуру:

const < Bot, Keyboard >= require('grammy'); 
bot.command('start', async (ctx) => < const startKeyboard = new Keyboard() .text('HTML') .text('CSS') .row() .text('JavaScript') .text('React') .resized(); await ctx.reply( 'Привет! Я - Frontend Interview Prep Bot �� \nЯ помогу тебе подготовиться к интервью по фронтенду', ); await ctx.reply('С чего начнем? Выбери тему вопроса в меню ��', < reply_markup: startKeyboard, >); >); 

Вызовы метода text() добавляют новые кнопки, а обращение к методу row() — разделяет ряды кнопок. Чтобы кнопки были адекватного размера и не растягивались, в конце мы применяем операцию resized().

Клавиатуру сохраняем в переменную startKeyboard, которую после отправляем пользователю сообщением с помощью функции reply() и ее аргумента reply_markup.

Сохраним изменения и посмотрим, что получилось:

Обрабатывать нажатия по такой клавиатуре достаточно просто: когда пользователь нажимает на кнопку, происходит автоматическая отправка сообщения с текстом кнопки. Далее, используя bot.hears(), мы можем реагировать на сообщения с соответствующим текстом. Удобно, не так ли?

Обработка нескольких сообщений

Сейчас слушатель hears реагирует только на сообщение «HTML». Конечно, можно под каждую из тем создать отдельного слушателя, но в программировании следует соблюдать принцип DRY (Don’t Repeat Yourself) и стремиться к адекватной лаконичности.

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

bot.hears(['HTML', 'CSS', 'JavaScript', 'React'], async (ctx) => < await ctx.reply(`Сейчас задам вопрос по $`); >); 

Inline-клавиатура

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

const < Bot, Keyboard, InlineKeyboard >= require('grammy'); 
bot.hears(['HTML', 'CSS', 'JavaScript', 'React'], async (ctx) => < const inlineKeyboard = new InlineKeyboard() .text('Получить ответ', 'getAnswer') .text('Отменить', 'cancel'); await ctx.reply(`Что такое $?`, < reply_markup: inlineKeyboard, >); >); 

Обратите внимание: для инициализации InlineKeyboard мы вызываем метод text(), но в этот раз передаем два аргумента — лейбл кнопки и payload data (некие данные). Первая часть будет видна пользователю на кнопках, а вторая нужна для реагирования на соответствующие нажатия, потому что на этот раз они не будут отправляться в качестве сообщений.

Чтобы обрабатывать нажатия на эти кнопки, нам потребуется добавить еще один слушатель, который будет реагировать на callback_query. Причем мы можем указать, что хотим реагировать только на те callback_query, у которых есть data:

bot.on('callback_query:data', async (ctx) => <>) 

Давайте при нажатии будем получать доступ до данных этого колбэка (в нашем случае это будут getAnswer и cancel) и выполнять соответствующие действия:

bot.on('callback_query:data', async (ctx) => < if (ctx.callbackQuery.data === 'cancel') < await ctx.reply('Отмена'); await ctx.answerCallbackQuery(); >>); 

Операция await ctx.answerCallbackQuery() нужна для того, чтобы Telegram перестал ждать ответа на этот запрос. Такое ожидание запускается автоматически каждый раз, когда пользователь нажимает на кнопку в inline-клавиатуре.

С отменой все просто, а вот с ответом сложнее. Нам, как минимум, нужно знать тему заданного вопроса, как максимум — весь вопрос (или его id), чтобы отправить нужный ответ.

Решим эту проблему так: будем передавать нужные данные прямо в data в callback_query. Но так как там принимаются только строки, а нам в будущем понадобится передавать более сложные структуры, можем сразу использовать объекты, переводя их в строки с помощью JSON.stringify:

bot.hears(['HTML', 'CSS', 'JavaScript', 'React'], async (ctx) => < const inlineKeyboard = new InlineKeyboard() .text( 'Получить ответ', JSON.stringify(< type: ctx.message.text, questionId: 1, >), ) .text('Отменить', 'cancel'); await ctx.reply(`Что такое $?`, < reply_markup: inlineKeyboard, >); >); 

Теперь в обработчике callback_query мы можем узнать, какую тему выбрал пользователь:

bot.on('callback_query:data', async (ctx) => < if (ctx.callbackQuery.data === 'cancel') < await ctx.reply('Отмена'); await ctx.answerCallbackQuery(); return; >const callbackData = JSON.parse(ctx.callbackQuery.data); await ctx.reply(`$ – это составляющая фронтенда`); await ctx.answerCallbackQuery(); >); 

Обратите внимание: в конструкцию if добавлен return, чтобы завершать работу функции в случае выполнения условия. Такой подход называется Early Return Pattern.

Наборы вопросов и их обработка

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

< "id": 1, "text": "Какой тег используется для создания ссылки?", "hasOptions": true, "options": [ < "id": 1, "text": "", "isCorrect": false >, < "id": 2, "text": "", "isCorrect": true >, < "id": 3, "text": "", "isCorrect": false >, < "id": 4, "text": "", "isCorrect": false > ] >, 

Вопрос с вариантами ответа.

Основной набор вопросов доступен в репозитории на GitHub.

Скачайте файл questions.json и добавьте его в корень проекта. В нем есть объект с четырьмя свойствами — html, css, javascript и react. По каждому из этих ключей хранится массив с вопросами.

Теперь там же, в корне, мы создадим файл utils.js – в него сразу вынесем утилитарную функцию для выбора рандомного вопроса по заданной теме. В utils.js сперва получаем доступ к нашему объекту с вопросами:

const questions = require('./questions.json'); 

Затем создаем функцию getRandomQuestion — она будет получать в качестве аргумента выбранную тему, приводить полученную строку к нижнему регистру, выбирать рандомный индекс и получать по нему вопрос из массива.

Для получения рандомного индекса можно использовать классический подход: взять Math.random(), который генерирует число от 0 до 1, результат умножить на длину массива с вопросами и округлить до целого в меньшую сторону с помощью Math.floor():

const getRandomQuestion = (topic) => < const questionTopic = topic.toLowerCase(); const randomQuestionIndex = Math.floor( Math.random() * questions[questionTopic].length, ); return questions[questionTopic][randomQuestionIndex]; >; 

Но мы рассмотрим альтернативный способ. Для получения рандомного вопроса в npm можно использовать отдельную библиотеку — random-js. Чем она лучше подхода с Math — хорошо описано на странице репозитория.

Как обычно: устанавливаем новую зависимость, импортируем в utils.js класс Random и инициализируем новый объект:

npm i random-js 
const < Random >= require('random-js'); … const random = new Random(); 

Далее вызываем метод integer, который первым аргументом принимает минимум, а вторым – максимум для генерации числа. Помним, что наш максимум на единицу меньше, чем длина массива. Получаем следующее:

const getRandomQuestion = (topic) => < const questionTopic = topic.toLowerCase(); const random = new Random(); const randomQuestionIndex = random.integer(0, questions[questionTopic].length - 1); return questions[questionTopic][randomQuestionIndex]; >; 

В конце файла utils.js экспортируем созданную функцию и импортируем ее в index.js.Теперь для получения рандомного вопроса нужно лишь вызвать созданную функцию, сохранить полученный вопрос в переменной и отправить пользователю текст этого вопроса.
Кроме того, в questionId мы теперь можем передавать реальный идентификатор вопроса, чтобы в будущем легко найти на него ответ. Опцию Отменить уберем, она нужна была только для демонстрации создания нескольких кнопок:

bot.hears(['HTML', 'CSS', 'JavaScript', 'React'], async (ctx) => < const topic = ctx.message.text; const question = getRandomQuestion(topic); const inlineKeyboard = new InlineKeyboard() .text( 'Узнать ответ', JSON.stringify(< type: ctx.message.text, questionId: question.id, >), ) await ctx.reply(question.text, < reply_markup: inlineKeyboard, >); >); 

Отлично! Осталось для вопросов с вариантами ответа добавить соответствующие кнопки, которые нужно будет формировать динамически. Методом map будем проходиться по массиву вариантов и на каждый возвращать кнопку с помощью InlineKeyboard.text, а затем — собирать в Inline-клавиатуру:

const buttonRows = question.options.map((option) => [ InlineKeyboard.text( option.text, JSON.stringify(< type: `$-option`, isCorrect: option.isCorrect, questionId: question.id, >), ), ]); const keyboard = InlineKeyboard.from(buttonRows); 

При создании кнопки мы назначаем для нее тип -option, чтобы в обработчике callback_query отличать такие вопросы от вопросов без вариантов ответа. А также добавляем isCorrect с булевым значением.

Создание переменной keyboard вынесем над конструкцией if, а внутри вариантов уже будем назначать для нее нужную клавиатуру:

bot.hears(['HTML', 'CSS', 'JavaScript', 'React'], async (ctx) => < const topic = ctx.message.text; const question = getRandomQuestion(topic); let keyboard; if (question.hasOptions) < const buttonRows = question.options.map((option) =>[ InlineKeyboard.text( option.text, JSON.stringify(< type: `$-option`, isCorrect: option.isCorrect, questionId: question.id, >), ), ]); keyboard = InlineKeyboard.from(buttonRows); > else < keyboard = new InlineKeyboard().text( 'Узнать ответ', JSON.stringify(< type: ctx.message.text.toLowerCase(), questionId: question.id, >), ); > await ctx.reply(question.text, < reply_markup: keyboard, >); >); 

Теперь вернемся к нашему bot.on(‘callback_query:data’) и доделаем его. Удаляем все и пишем по новой. Начнем с того, что сразу будем парсить данные через JSON и сохранять результат в callbackData:

const callbackData = JSON.parse(ctx.callbackQuery.data); 

Далее происходит деление на вопросы с вариантами ответа и без. Начнем с простого, когда вариантов нет. Программа будет это определять по отсутствию слова option в свойстве type:

if (!callbackData.type.includes('option')) <> 

Если кнопка была нажата и вопрос без вариантов ответа, значит, пользователь кликнул по единственно возможной кнопке — Узнать ответ. Тут нам необходимо найти заданный вопрос по id и отправить пользователю ответ. Как в случае с поиском вопроса, для поиска ответа мы напишем функцию-хелпер в utils.js.

Перед реализацией функции опишем ее вызов и продумаем, что она должна принимать в качестве аргументов. Спойлер: это будут тип и id вопроса.

if (!callbackData.type.includes('option'))

Теперь добавим в отправку ответа пару дополнительных опций, чтобы форматировать текст:

await ctx.reply( getCorrectAnswer(callbackData.type, callbackData.questionId), < parse_mode: 'HTML', disable_web_page_preview: true >, ); 

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

Следующим этапом отправимся в utils.js и напишем саму функцию:

const getCorrectAnswer = (topic, id) => < const question = questions[topic].find((question) =>question.id === id); if (!question?.hasOptions) < return question.answer; >return question.options.find((option) => option.isCorrect).text; >; 

Сначала находим нужный вопрос с помощью перебора по типу и id. Если вариантов ответа нет, сразу возвращаем сообщение. А если есть — перебираем варианты и возвращаем ответ со значением isCorrect: true.

Добавим в экспорт новую функцию в том же файле и импортируем ее в index.js. Осталось вернуться в колбэк для обработки callback_query:data и дописать обработку вопросов с вариантами ответа. Случай, когда у вопроса вариантов нет, мы уже отсекли — значит, осталось только два сценария:

  • варианты ответа есть, ответ верный,
  • варианты ответа есть, ответ неверный.

Как раз для этого мы передавали в data значение isCorrect — теперь это позволит нам отбросить первый вариант:

if (callbackData.isCorrect)

Отправляем сообщение, завершаем ожидание колбэк-запроса и выходим из функции.

Теперь обработаем вариант с неверным ответом. Он также будет использовать функцию getCorrectAnswer, но при передаче типа необходимо будет отсечь часть -option. Это мы сделаем, разделив строку на два элемента и обратившись к первому:

await ctx.reply( `Неверно ❌ Правильный ответ: $`, ); await ctx.answerCallbackQuery(); 

Этот вариант будет без конструкции if, так как все остальные варианты развития событий мы уже отсекли.

Итоговый код index.js есть в репозитории на GitHub. В качестве самостоятельной работы добавьте к кнопкам выбора темы функцию Случайный вопрос. А также доработайте под нее обработчик bot.headers().

Деплой бота на сервер

Сейчас бот запущен на компьютере. Это неудобно, если нужно, чтобы он работал круглосуточно. Ведь тогда нужно поддерживать бесперебойную работу компьютера и постоянное соединение с интернетом. Бота лучше перенести в облако.

1. Переходим в раздел Облачная платформа внутри панели управления.

2. Создаем сервер. Для работы нашего приложения много мощностей не нужно, поэтому будет достаточно одного ядра vCPU с долей 20% и 512 МБ оперативной памяти.

3. Авторизуемся на сервере через консоль:

Далее необходимо установить git и клонировать репозиторий из GitHub на сервер:

sudo apt install git 
git clone

После предыдущей команды будет автоматически создана папка с названием репозитория (у меня это frontend-interview-prep-bot), переходим в нее, устанавливаем Node.js и пакет npm:

cd frontend-interview-prep-bot 
sudo apt install nodejs 
sudo apt install npm 

Версии автоматически ставятся устарвшие, для их обновления выполним команды:

sudo npm install -g n sudo n stable 

Далее — перезапустим сервер. Теперь снова перейдем в папку проекта и установим все зависимости:

cd frontend-interview-prep-bot npm i 

Создадим файлик с ключом для нашего бота и вставим в него ключ от нашего бота:

touch .env 

Последнее, что осталось сделать, — это запустить бота. Для этого будем использовать менеджер процессов pm2 и запустим бота (не забудьте перед этим убедиться, что остановили его локально, иначе возникнут конфликты)

pm2 start index.js

Вот такой результат говорит нам о том, что бот успешно запущен:

Все работает корректно, бот полностью функционирует без нашего участия:

Заключение

В результаты мы не только научились создавать Telegram-ботов на Node.js, обрабатывать команды и сообщения пользователя, реагировать на нажатия кнопок и колбэки, но и сделали себе отличного помощника в подготовке к собеседованию и закреплению материала.

Автор: Арсений Помазков, автор канала Pomazkov JS

Как разработать веб-приложение (интернет-магазин) в Telegram

Как сократить время на диагностику дисков c помощью Telegram-бота

Зарегистрируйтесь в панели управления

И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.

Телеграм-⁠бот

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

В сообщении от бота может быть:

  • текст,
  • ссылки,
  • картинки,
  • видео,
  • файлы,
  • кнопки.

Что умеют Телеграм-⁠боты

Боты в Telegram умеют практически все: продавать, следить за списком задач и даже управлять умным домом. Мы рассмотрим функции, которые полезны для бизнеса: помогают увеличивать лояльность клиентов и повышать продажи.

  • Выступать в роли личного кабинета программы лояльности. Боты могут регистрировать новых клиентов в программе лояльности, отображать информацию о балансе бонусов и доступных промокодах.
  • Информировать об акциях и новинках товаров. С помощью бота можно делать рассылки актуальной информации, которая необходима пользователям: рассказывать об актуальных акциях магазина, новинках, напоминать о записях на мероприятия или брони столика.
  • Собирать отзывы клиентов. Боты могут не только запрашивать стандартную информацию: личные данные и контакты, — но и проводить опросы клиентов, выявлять уровень лояльности или удовлетворенности работой компании.
  • Помогать в продажах. Бот может показывать фото товаров с описанием их характеристик. После команды от пользователя бот регистрирует заказ, принимает оплату и оформляет доставку. Информация о заказе автоматически передается в учетную программу.
  • Консультировать клиентов 24/7. Бот может круглосуточно отвечать на простые вопросы клиентов. Такая функция помогает уменьшить нагрузку на менеджеров и подключать их только в случае нестандартных запросов. Например, бот подбирает одежду нужного размера, присылает инструкцию для товара, актуализирует остатки на складе, проверяет свободное время для записи к мастеру.

Как выбрать программу лояльности

Как сделать рассылку в Телеграм

Как создать Телеграм-⁠бота

Выбрать платформу разработки

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

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

Платформы с готовыми конструкторами облегчают процесс и удешевляют разработку, но ограничены в функциях. Чтобы запустить бот на сторонней платформе, не надо знать программирование: интерфейс сервиса обычно достаточно простой и содержит необходимый функционал под любые потребности бизнеса: бот-⁠магазин, бот техподдержки или бот для рассылок.

Пример настройки чат-бота

Зарегистрировать бота в мессенджере

  1. Зарегистрировать рабочий номер в Телеграме. Для регистрации аккаунта подойдет постоянный мобильный или городской номер.
  2. Написать боту BotFather. В поиск вводим имя бота BotFather. Его название будет с голубой галочкой, которая означает, что бот официально подтвержден мессенджером. Открываем чат с ботом, нажимаем кнопку «Начать» и выбираем команду «/newbot».
  3. Указать название и имя бота. Для названия бота используем название компании как оно есть. Имя бота, которое будет использоваться как ссылка, пишем латинскими буквами с добавлением «_bot» на конце: ADressFY и ADressFY_bot.
  4. Получить токен и интегрировать бота с сервисом. В сообщении от BotFather об успешном создании бота будет обозначен его универсальный ключ — токен. Он поможет связать бота с кодом разработки или платформой с конструктором.
  5. Настроить бота. Далее оформляем бота, прописываем сценарии в коде или конструкторе, настраиваем кнопки и интегрируем его с системами компании. Подробнее расскажем ниже.

В Telegram можно создать максимум 20 ботов для одного номера. Они могут выполнять разные задачи: продавать, консультировать, развлекать пользователей.

чат-бот BotFather.

Оформить бота

Оформляем бота через BotFather или в конструкторе. Для оформления через BotFather в диалоге с ним пишем /mybots и нажимаем на кнопку «Edit Bot».

Что можно добавить в Телеграм-⁠бот:

  • Описание возможностей бота. Описание отображается на стартовом экране под окном «Что умеет этот бот?». В нескольких словах пишем, чем занимается бот: принимает заказы, консультирует 24/7, помогает подобрать кино на вечер или делится рецептами блюд. Описание можно редактировать, если функции бота изменятся. В BotFather описание добавляем по команде «Edit About».
  • Описание компании. Описание компании видно в профиле бота. В нескольких предложениях пишем, чем компания может быть полезна: что она продает, какие акции проводит, условия доставки. В BotFather описание вводим по команде «Edit Description».
  • Аватар. Его добавляем через кнопку «Edit Botpic». Оптимальный размер — 500×500 пикселей. Изображение должно быть четким и мало весить. Обычно для аватара ботов используют логотип компании, чтобы клиенты сразу понимали, кто им пишет.

Оформление бота удобнее настраивать в конструкторе. В сервисе отображается сразу вся информация в одном окне и не нужно каждый раз переходить к своему боту, чтобы посмотреть изменения.

Пример, как выглядит оформление бота в Телеграм.

Настроить кнопки

Часто для общения с ботом клиентам предлагают нажать на кнопки. В кнопки зашивается команда, в ответ на которую бот выполняет определенный алгоритм действий.

Что видит пользователь

Кнопка «Количество бонусных баллов» → нажимает → сообщение от бота «240 баллов».

Что видит бот

Пользователь нажал кнопку «Количество бонусных баллов» → запрос в системы компании → поиск личного кабинета по номеру телефона → переход в личный кабинет пользователя → количество бонусных баллов — 240 → сообщение пользователю «240 баллов».

Кнопки в Telegram бывают двух видов: reply и inline.

Пример кнопок в чат-ботах

  • Reply. Эти кнопки отображаются внизу диалогового окна под строкой ввода сообщения. Reply-⁠кнопки считаются более распространенным видом. Они выполняют функцию активации команды, которая заранее прописана в сценарии бота: кнопка «актуальные акции», команда — запрос актуальных акций на 01.04.2023. Результат нажатия на такую кнопку — получение информации от бота в виде обратного сообщения.
  • Inline. Inline⁠-кнопки идут сразу под сообщением на экране чата. Такие кнопки могут работать как reply, то есть получать информацию в обратном сообщении, или открывать ссылки и веб-⁠приложение в отдельном окне.

Нужен чат-⁠бот в Telegram?

1С-⁠Рарус: Система управления лояльностью — это платформа для автоматизации программы лояльности. Она позволяет собрать собственный Телеграм-⁠бот, настроить его и перенести программу лояльности в мессенджер.

Логотип

Протестировать чат-⁠бот

Примеры Telegram-⁠ботов

Аптеки «Горздрав»

Бот помогает заказать лекарства, получить помощь консультантов и узнать информацию по бонусной карте.

чат-бот «Аптеки Горздрав».

«Перекресток»

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

чат-бот «Vprok.ru Перекрёсток»

«Спортмастер»

Бот представляет собой виртуального ассистента, который может предоставить консультацию фитнес-⁠эксперта, отобразить данные о заказах, показать полезную и актуальную информацию.

чат-бот «Спортмастер Виртуальный Ассистент»

TEZ TOUR

Бот турагентства помогает подобрать тур, следить за ценами и подписаться на спецпредложения.

чат-бот teztour_bot.

Как выглядит готовый бот

Как пользователю запустить бота

Пример кнопок в чат-ботах

  1. Найти бота. Для запуска клиент должен найти бота в поиске по имени или перейти по ссылке из внешнего источника: с поста в соцсетях или по кнопке на сайте.
  2. Перейти в диалоговое окно. Когда клиент впервые открывает бота, он видит сообщение с описанием возможностей бота и кнопку «Начать» или «Start».
  3. Нажать кнопку «Начать». Когда клиент нажимает на кнопку, отправляется команда /start и бот начинает свою работу.

Куда может писать бот

Пример чат-бота

  1. В личные сообщения. Бот может писать только тем людям, которые его запустили. Если пользователь не запускал бота, он не активируется и не будет отправлять сообщения. Клиент всегда может заблокировать бота, поэтому следует внимательнее относиться к контенту.
  2. В группу. Бота добавляют в группу как обычного пользователя или как администратора. В группе бот может отвечать на простые запросы с его упоминанием или присылать рассылки. Максимальное количество ботов в группе — до 20 штук.
  3. В канал. В канал бота добавляют только как админа. В роли админа бот может добавить к чужим постам кнопки: реакции в виде эмодзи, ссылки или опросы по теме.

Что может писать бот

Пример чат-бота

  1. Максимальный размер сообщения — 4096 знаков. Если сообщение содержит вложения — до 1024 знаков.
  2. Максимальный размер файла до 2 ГБ.
  3. Оптимальный размер изображения для поста — 1280 пикселей по длинной стороне. Лучше сообщение предварительно протестировать.
  4. Оптимальные размеры видео для поста — с соотношением сторон 3:2 для горизонтальных видео и 2:3 для вертикальных. Максимальный вес видео, как и у файлов, — до 2 ГБ.

Как настроить видимость сообщений ботом

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

За видимость сообщений отвечает Privacy mode. Privacy mode — настройка бота, которая помогает ограничивать или расширять видимость им сообщений. Она включена с самого создания бота.

Если настройка включена, то бот воспринимает только сообщения:

  • Упоминания бота.
  • Нажатие кнопок.
  • Ответы на сообщение бота.

Если настройка выключена — бот видит каждое сообщение в чате. Выключить ее можно с помощью BotFather. Настройку часто отключают для чат-⁠ботов, ботов-⁠магазинов или контент-⁠ботов, чтобы ими воспринимались все сообщения от клиентов.

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

Главное о Телеграм-⁠боте

Телеграм-⁠бот — это аккаунт в мессенджере, который запрограммирован на автоматическое совершение действий: рассылать рекламные сообщения, консультировать по товарам или продавать их.

Бот помогает бизнесу:

  • Выступать в роли личного кабинета программы лояльности.
  • Информировать об акциях и новинках товаров.
  • Собирать отзывы клиентов.
  • Продавать.
  • Консультировать клиентов 24/7.

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

Все приведенные в статье материалы взяты из открытых источников. Информация действительна на июнь 2023 года. Все упомянутые в статье бренды принадлежат их правообладателям.

Хотите запустить Telegram-⁠бота?

1С-⁠Рарус: Система управления лояльностью — это платформа для автоматизации программы лояльности. Она позволяет быстро запустить чат-⁠бота в Телеграм для повышения лояльности клиентов.

Логотип

Перейти на страницу сервиса 14 дней бесплатно

Сайты «1С-Рарус» используют cookie для персонализации и хранения настроек. Используя наши сайты, Вы соглашаетесь с обработкой персональных данных и Политикой конфиденциальности rarus.ru .

Сдвиньте, чтобы закрыть

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *