Как написать бота telegram
Перейти к содержимому

Как написать бота telegram

  • автор:

Пишем «Hello, World» Telegram бота на Си

Дисклеймер: Я ни в коем случае не являюсь профессиональным Си программистом.

Что нам понадобится:

1. Любой компьютер на Linux, Ubuntu, Centos, MacOS… с доступом к порту 443 или 8443 из интернета.
2. Любой Си компилятор
3. Бибилиотеки openssl, libssl-dev («apt-get install openssl libssl-dev» в терминале, для Ubuntu)

Итак, приступим…

Первое что нужно сделать — это создать бота у отца всех ботов @BotFather, опустим все подробности и предположим что с этой задачей все справились и получили токен, что-то вроде:
373288854:AAHHT77v5_ZNEMус4bfnРЩo6dxiMeeEwgwJ

Далее создадим ssl сертификат, для установки WebHook. Команда выглядит примерно так:

openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -x509 -days 365 -out public.pem

Упакуем ключ и публичный сертификат в один файл:

cat private.key public.pem > cert.pem
curl -F"url=https://ВАШ_IP:ПОРТ(либо 443, либо 8443)/ЛЮБОЙ_URI(можно и без него, я буду использовать токен)/" -F"certificate=@public.pem" https://api.telegram.org/botТОКЕН/setWebhook/

Должен прийти JSON ответ что-то типа success:true. если нет то проверьте все и попробуйте еще раз.

Приступаем к самому интересному:

Создаем файл main.c и открываем его в любом редакторе. Включаем необходимые библиотеки:

#include #include #include #include #include #include #include #include #include #include

Функция инициализации сокета:

int InitializeSocket(int port) < int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) exit(-1); struct sockaddr_in s_addr; s_addr.sin_family = AF_INET; s_addr.sin_addr.s_addr = INADDR_ANY; s_addr.sin_port = htons(port); if (bind(sd, (struct sockaddr *)&s_addr, sizeof(s_addr)) < 0) < printf("Binding Error!\n"); exit(-3); >return sd; > 
SSL_CTX * InitializeSSL(char[] certificate) < OpenSSL_add_all_algorithms(); SSL_load_error_strings(); SSL_library_init(); SSL_CTX * sslctx = SSL_CTX_new(TLSv1_2_server_method()); if (SSL_CTX_use_certificate_file(sslctx, certificate , SSL_FILETYPE_PEM) if (SSL_CTX_use_PrivateKey_file(sslctx, certificate, SSL_FILETYPE_PEM) if (!SSL_CTX_check_private_key(sslctx)) < exit(-2); >return sslctx; > 

Собственно сам main():

int main() < SSL_CTX * sslctx = InitializeSSL("cert.pem"); //Созданный нами файл из приватного ключа и публичного сертификата int sd = InitializeSocket(8443); //Порт который вы указали при установке WebHook listen(sd, 5); //Слушаем подключения на созданном сокете while (1) < //Запускаем бесконечный цикл int client = accept(sd, NULL, NULL) //функция accept ждет новое подключение, в качестве параметров принимает сокет, указатель на структуру sockaddr, и указатель на размер этой структуры и записывает туда данные подключения, так как нам необязательно знать подробности подключения отправим NULL, функция возвращает сетевой дескриптор. SSL * ssl = SSL_new(sslctx); //Cоздаем ssl дескриптор SSL_set_fd(ssl, client); //Переключаем обычный дескриптор на защищенный if (SSL_accept(ssl) //Для увеличения производительности будем использовать fork() и обрабатывать соединение в дочернем процессе, а родительский процесс вернем к ожиданию новых подключений int pid = fork(); if (pid != 0) < //Если это родитель, то закрываем подключение и возвращаемся к началу цикла SSL_clear(ssl); close(newsd); continue; >//Дальнейшие действия будут происходить в дочернем процессе //Опишу их дальше после некоторых пояснений. exit(0); //Завершаем дочерний процесс > > 

Так как Telegram использует HTTP протокол поясню некоторые моменты:

Любой HTTP запрос состоит из заголовков отделенных между собой «\r\n», и тела отделенного от заголовков «\r\n\r\n», может быть пустым, но разделитель «\r\n\r\n» присутствует всегда. Запросы от Telegram будут приходить методом POST, тело будет в формате JSON.

Пример запроса похожего на Telegram:

POST /(URI указанный при установке WebHook) HTTP/1.1\r\n . Неважные для нас поля заголовков Content-Type: application/json\r\n (Тип данных в теле) Content-Length: 256\r\n (Размер тела в байтах, целое число) . /r/n/r/n Json тело 

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

Для этого подготовим короткий HTTP response:

HTTP/1.1 200 OK\r\n Connection: close\r\n\r\n 

Этих двух полей достаточно что бы сказать серверу Telegram что все нормально, ответ 200 и можно закрывать соединение

Продолжаем писать программу. Внутри цикла после создания дочернего процесса…

char[] response = "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n"; //Наш HTTP response char header[1024]; bzero(header,1024); //Выделили массив для записи в него заголовков запроса и на всякий случай занулили там все записи. int s = 0; int n = 0; while (strcmp(header + s - strlen("\r\n\r\n"), "\r\n\r\n") != 0) < //strcmp Сравнивает две строки и если они равны возвращает 0, в нашем случае сравниваем последние strlen("\r\n\r\n") байт с "\r\n\r\n", то есть ищем конец заголовка n = SSL_read(ssl,header+s,1); //Считываем данные по одному байту в header + s, s - общее кол-во считанных байт s += n; //n - кол-во считанных байт за раз >//Все, заголовки считаны, теперь нам надо проверить метод, uri, content-type и вытащить content-length запроса. if (strstr(header,"POST /(URI указанный при установке WebHook) HTTP/1.1\r\n") == NULL) < //Ищем вхождение строки POST . в header, если его нет то возвращается NULL, значит пришел неверный запрос, закрываем подключение и завершаем дочерний процесс SSL_clear(ssl); close(client); exit(0); >//Также проверим тип данных, должен быть application/json; if (strstr(header, "Content-Type: application/json") == NULL) < SSL_clear(ssl); close(client); exit(0); >//Если все нормально, то узнаем размер тела int len = atoi(strstr(header, "Content-Length: ") + strlen("Content-Length: ")); //strstr возвращает указатель не первое вхождение указанной строки, то есть на "Content-Length: ", а кол-во байт записано дальше после этой строки, поэтому прибавляем длину строки "Content-Length: " и приводим строку к типу int функцией atoi(char *); char body[len+2]; bzero(body, len+2); //Создаем массив для тела, на этот раз мы точно знаем сколько байт нам понадобится, но создаем с запасом, дабы не оказалось что в памяти сразу после нашей строки что-то записано n = 0; s = 0; while (len - s > 0) < //Так как мы четко знаем сколько данных нам надо считать просто считываем пока не считаем нужное кол-во n = SSL_read(ssl, request + s, len - s); //Конечно можно было считать целиком все данные, но бывают случаи при плохом соединении, за раз все данные не считываеются, и функция SSL_read возвращает кол-во считанных байт s += n; >//На этом получение данных окончено, отправим наш http response и закроем соединение SSL_write(ssl, response, (int)strlen(response)); SSL_clear(ssl); SSL_free(ssl); close(client); //Так как у нас "Hello, World" бот то мы будем просто отвечать на любое сообщение "Hello, World!", но нам нужно знать кому отправлять сообщение для это из тела запросы надо вытащить параметр chat_id int chat_id = atoi(strstr("\"chat_id\":") + strlen("\"chat_id\":")); //То же самое что и с Content-Length //Осталось только отправить сообщение, для этого лучше создадим отдельную функцию SendMessage char msg[] = "Hello, World!"; SendMessage(chat_id, msg); //Описание функции далее 

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

void SendMessage(int chat_id, char[] msg) < int port = 443; char host[] = "api.telegram.org"; //Адрес и порт всегда одинаковые //Создадим шаблон HTTP запроса для отправки сообщения, в виде форматированной строки char header[] = "POST /bot352115436:AAEAIEPeKdR2-SS7p9jGeksQljkNa9_Smo0/sendMessage HTTP/1.1\r\nHost: files.ctrl.uz\r\nContent-Type: application/json\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s"; //Шаблон тела для отправки сообщения char tpl[] = ""; char body[strlen(tpl)+strlen(msg)+16]; bzero(body, strlen(tpl)+strlen(msg)+16); sprintf(body,tpl,chat_id,msg); //Как printf, только печатаем в char[] char request[strlen(header)+strlen(body)+4]; bzero(request,strlen(header)+strlen(body)+4); sprintf(request, header, strlen(body), body); //Подготовили наш запрос, теперь создаем подключение struct hostent *server; struct sockaddr_in serv_addr; int sd; sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) exit(-5); server = gethostbyname(host); //Данная функция получает ip и еще некоторые данные по url if (server == NULL) exit(-6); bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(portno); memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length); if (connect(sd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) < exit(-6);>SSL_CTX * sslctx = SSL_CTX_new(TLSv1_client_method()); SSL * cSSL = SSL_new(sslctx); SSL_set_fd(cSSL, sfd); SSL_connect(cSSL); SSL_write(cSSL,request,(int)strlen(request)); //Отправляем наш запрос, в идеале его надо отправлять так же как мы считывали данные, то есть с проверкой на кол-во отправленных байт char str[1024]; SSL_read(cSSL, str, 1024); //Считываем ответ и закрываем соединение SSL_clear(cSSL); SSL_CTX_free(sslctx); close(sd); > 

На этом, в принципе все. Сохраняем файл в одной папке с сертификатом, компилируем любым компилятором и запускаем:

clang main.c -o bot -lcrypto -lssl ./bot

Надеюсь статья будет кому-то полезной.

Как написать Телеграм-бота на JavaScript

Сегодня будем делать бота — это отличное (и быстрое) занятие, которое развивает уставший мозг и даёт возможность отправить друзьям ссылочку со словами «Смотри, это моё».

Для работы понадобятся

  • Редактор кода, чтобы писать код. Если не знаете, какой выбрать — мы уже рассказывали. Если не умеете писать код, то вот инструкция, как его написать и запустить.
  • Node.js любой версии, выше 0.12. Нужно, чтобы библиотека для ботов заработала. Как установить Node.js.
  • Консоль. Или встроенный в систему вариант, или какой-нибудь другой.
  • VPN. Возможно, но не факт, потому что Телеграм работает не везде.

Шаг 1. Регистрируем бота

Находим в поиске Телеграма бота @botFather — это главный инструмент для создания ботов. Набираем в нём /newbot .

Придумываем название и имя боту. Название — то, как он будет подписан в списке контактов. Имя — строка, по которой его можно будет найти. Обратите внимание, что имя должно оканчиваться на bot . В ответ мы получим токен — длинную последовательность символов, которая пригодится нам в будущем. Мы назвали бота echoKeksBot , но вам придётся придумать другое название, потому что это уже занято. Извините.

Шаг 2. Создаём проект

Создаем папку в любом месте и открываем её в консоли. Там пишем npm init -y — эта команда создаст файл package.json , который выглядит примерно так:

Теперь установим node-telegram-bot-api — это библиотека для создания телеграм-ботов на Node.js. Введём команду:

npm install --save --save-exact node-telegram-bot-api 

Создадим пустой файл index.js и напишем там самого простого бота, который будет отвечать на любое сообщение:

bot.on('message', (msg) => < const chatId = msg.chat.id; bot.sendMessage(chatId, 'Привет, Друг!'); >); 

Шаг 3. Запускаем бота

Тут всё просто, в консоли пишем node index.js , заходим к нашему боту в телеграм и начинаем с ним общаться. Не закрывайте консоль — бот работает только на вашем компьютере, и без консоли он не станет отвечать.

Как видим, бот успешно отвечает. Но бот-повторяха — не интересно, усложним задачу. Пусть бот присылает нам картинку.

Шаг 4. Отсылаем картинку

Добавим картинку с Кексом в папку с проектом. Для отправки изображения используем метод .sendPhoto() — передадим в него id чата и путь до картинки. Получится такой код:

bot.on('message', (msg) => < const chatId = msg.chat.id; bot.sendPhoto(chatId, 'keks.png'); >); 

Запускаем бота, проверяем, работает:

Шаг 5. Добавим клавиатуру. И пёсика

Добавим фотографию милого пёсика в корень проекта. Теперь там две картинки.

Создадим конфигурацию для клавиатуры в боте, пусть у нас будет 3 кнопки: «Хочу кота», «Хочу пёсика» и «Пойти учиться».

// Конфиг клавиатуры const keyboard = [ [ < text: 'Хочу кота', // текст на кнопке callback_data: 'moreKeks' // данные для обработчика событий >], [ < text: 'Хочу песика', callback_data: 'morePes' >], [ < text: 'Хочу проходить курсы', url: 'https://htmlacademy.ru/courses' //внешняя ссылка >] ]; 

На нажатия первых двух кнопок мы ответим соответствующим сообщением в Телеграме, а последняя уведёт на внешний ресурс.

Чтобы отличить первые 2 кнопки, воспользуемся полем callback_data , где будем передавать тип кнопки. Для обработки нажатий добавим слушателя на событие callback_query , и в зависимости от значения query.data отправим нужную картинку к пользователю.

// Обработчик нажатий на клавиатуру bot.on('callback_query', (query) => < const chatId = query.message.chat.id; let img = ''; if (query.data === 'moreKeks') < // если кот img = 'keks.png'; >if (query.data === 'morePes') < // если пёс img = 'pes.png'; >if (img) < bot.sendPhoto(chatId, img, < // прикрутим клаву reply_markup: < inline_keyboard: keyboard >>); > else < bot.sendMessage(chatId, 'Непонятно, давай попробуем ещё раз?', < // прикрутим клаву reply_markup: < inline_keyboard: keyboard >>); > >); 

Не забудем про возможные ошибки и предложим пользователю попробовать снова, если он ввёл что-то не то. Перезапустим бота и проверим — всё работает. Главное — не закрывать консоль, иначе бот перестанет отвечать.

Полный файл с кодом: index.js.

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

«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

Как можно самостоятельно написать бота в Телеграме

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

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

Современные боты многофункциональны и способны заменить целые сайты. Это уже не примитивные программы, работающие по принципу «вопрос-ответ». Новое поколение помощников имеет полноценный интерфейс и использует нейросети.

Разновидности телеграм-ботов

Классические

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

Для администрирования

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

Магазины

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

Инструменты

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

Развлекательные

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

Боты для заработка в Telegram

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

Что нужно, чтобы самостоятельно написать бота

Есть два доступных способа создания бота: самому написать код или использовать ноукод-платформу, где бот собирается из готовых элементов. Что предпочесть? Все зависит от того, насколько крутой чат-бот вам нужен и есть ли у вас навыки программирования. Давайте разберем каждый способ отдельно.

С помощью кода — для тех, кто умеет программировать

Для написания бота подходит любой язык PHP, Node.js, Java, Go и другие. Чаще всего пишут на Python, поскольку в языковой системе много готовых решений. Если вы хотите освоить создание сложных приложений с широким функционалом, стоит научиться программировать на Python. Он сравнительно легкий и подходит новичкам.

Для создания чат-бота необходимо установить python-telegram-bot. Здесь описан весь процесс разработки приложения для Телеграма. Плюс — потребуется текстовый редактор, чтобы написать код.

С помощью платформы-конструктора — быстро и просто

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

Разработать бот без кодинга помогают специальные платформы-конструкторы. Многие из них представлены в бесплатных версиях, но с ограниченным функционалом — позволяют создать 1–2 бота с лимитами по числу команд или количеству пользователей.

Популярные платформы для телеграм-ботов

Manybot

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

  • Можно сделать многоуровневое меню и форму обратной связи.
  • Доступны функции ведения блога, прием заказов, отправка сообщений.
  • К боту можно подключить несколько сотрудников.
  • Есть реклама, которую нельзя отключить.

PuzzleBot

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

  • Бесплатно позволяет создать одного бота и настроить максимум 15 команд.
  • Есть отзывчивая поддержка, подробное руководство и доступ в личный кабинет.
  • Доступно создание WebApp-ботов — интегрированные в Телеграм сайты.
  • В бесплатной версии есть лимит до 150 подписчиков.

Botobot

Сервис, ориентирован на ритейл. С его помощью можно создать функциональные bot-магазины с витринами и онлайн-оплатой.

  • Позволяет сделать каталог, корзину, настроить новостную рассылку.
  • Можно связать bot с CRM-системой и отслеживать аналитику продаж.
  • Можно добавить промокоды, запустить реферальную программу лояльности.
  • Во free версии можно создать только 1 бот с 20 товарами.

Unisender

Простой удобный конструктор чат-ботов с готовыми шаблонами для разного бизнеса. Подходит для доставки еды, записи в салон красоты.

  • Возможность интеграции с amoCRM, «Гугл-таблицами», «Битрикс24».
  • Широкий выбор блоков и шаблонов для разных целей.
  • Бесплатный пробный период 14 дней.
  • Цена от 800 рублей в месяц.

BotTap

Конструктор чат-ботов для малого бизнеса и предпринимателей. Подходит для оформления заказов в кафе и ресторанах, доставки еды.

  • Можно создать чат-бота для Telegram, ВКонтакте и Viber.
  • Есть интеграции с Qiwi, «ЮKassa», «ЮMoney» и другими.
  • Оплата только по факту, без привязки карты.
  • Есть реклама, которую можно отключить только на дорогих тарифах.

Chatforma

Удобная платформа для создания полнофункциональных чат-ботов в Telegram.

  • Позволяет создавать платные каналы и отключать доступ, когда подписка закончилась.
  • Можно настроить оплату, стартовое приветствие, создать навигацию по чат-боту.
  • Free версия доступна только на 15 дней.

Aimylogic

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

  • Бот собирает лиды, принимает оплату, напоминает о корзине.
  • Помогает получить обратную связь от юзеров.
  • Можно тестировать бота в процессе разработки, чтобы исключить ошибки и улучшить его.
  • Во free-версии в контактах бота должно быть до 100 пользователей.

Bot Kits

Недорогая платформа для создания ботов при помощи блок-схем. Позволяет реализовать сценарии любой сложности.

  • Доступная стоимость — 390 руб. за стандартный тариф.
  • Два простых шаблона для старта: автоответчик и вопрос/ответ.
  • Один бот можно создать совершенно бесплатно.
  • Сложный интерфейс для новичка.
  • Максимум 100 исходящих сообщений в сутки на бесплатном тарифе.

Flow XO

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

  • Есть готовые шаблоны сценариев, которые достаточно чуть подкорректировать.
  • Доступна визуализация сценариев — удобно проверять, как все работает.
  • Бот можно интегрировать в различные платежные системы и сервисы.
  • Интерфейс хоть и простой, но на английском языке.
  • Free версия позволяет создать до 5 ботов.

Инструкция: как зарегистрировать нового бота

После того, как вы определитесь с сервисом-конструктором, нужно зарегистрировать бота. А для этого используется BotFather — официальный сервис, с помощью которого настраиваются и управляются телеграм-боты. Его ключевая задача — выдать уникальный токен для авторизации помощника и работы с Bot API.

Получение токена в BotFather: инструкция

  1. Откройте чат с BotFather и отправьте команду /newbot. Теперь нужно ввести название своего бота.
  2. Введите Username — техническое имя бота. Оно должно быть уникальным, на латинице и в конце обязательно должно стоять bot.
  3. BotFather пришлет токен бота — его нужно сохранить и использовать для настройки в сторонних сервисах.

Функции BotFather для настройки бота

  • /setdescription — описание бота, которое пользователи видят в графе «Что умеет?». Нужно уложиться в 512 символов.
  • /setabouttext — меняет описание в профиле бота. Лимит — 120 символов.
  • /setuserpic — отвечает за смену аватарки.
  • /setcommands — меняет список команд бота (количество и название).
  • /setjoingroups — добавление бота в групповые чаты.
  • /setprivacy — устанавливает уровень приватности, доступа к перепискам.
  • /deletebot — удаляет бота.

Как сделать бота на примере Botmother

Создайте аккаунт разработчика

  • Зарегистрируйтесь на botmother.com с помощью личной почты или войдите через Google.
  • Нажмите «Создать нового бота».
  • Выберите опцию «Пустой бот».

Если будут трудности, можно обратиться за помощью в поддержку

Создайте приветствие

  1. В конструкторе перейдите в закладку «Компоненты» (это функции и действия бота). Нажмите на кнопку «Сообщения» и перетяните ее в рабочую область экрана.
  2. Напишите текст приветственного сообщения и нажмите кнопку «Сохранить».

Подключите бота к мессенджеру

  1. Откройте в Telegram официальный сервис-бот @BotFather и напишите ему сообщение /newbot.
  2. Напишите название своего бота. Так его будут видеть пользователи в контактах и чатах.
  3. Напишите юзернейм латинскими буквами с «bot» в конце.
  4. Подключите бота в Telegram к вашему аккаунту. Для этого откройте опять @BotFather и скопируйте токен бота.
  5. Вернитесь в конструктор Botmother, откройте раздел «Настройки», включите платформу Telegram.
  6. Вставьте токен бота в соответствующую строку и сохраните внесенные изменения.

Дополнительные функции

Чтобы бот задавал вопрос с вариантами ответов и отвечал в зависимости от выбора пользователя (например, «Что вам больше нравится: Чай или Кофе?»), сделайте следующее:

  1. Откройте конструктор Botmother.
  2. Добавьте два новых экрана — на одном напишите «Чай», на другом «Кофе».
  3. Сохраните. А если нужно изменить ответы, дважды кликните на названия и отредактируйте.
  4. Теперь добавим кнопки. Для этого перенесите на стартовый экран элемент «Кнопки» и добавьте две «Чай» и «Кофе».
  5. Каждая кнопка должна вести на свой экран. В поле «Переход на экран» выберите экран «Чай». То же самое сделайте со второй кнопкой и сохраните изменения.
  6. В результате пользователь после нажатия на кнопку попадет на соответствующий экран. Его нужно заполнить контентом — картинкой, ссылкой на прайс лист, текстом.

Протестируйте бота

У нас получился bot со следующим сценарием:

  1. Бот приветствует пользователя.
  2. Задает ему вопрос «Что вам больше нравится: Чай или Кофе?».
  3. Пользователь выбирает один из двух вариантов и нажимает на кнопку.
  4. Бот присылает соответствующее сообщение.

Отройте бот и проверьте, все ли идет по заданному сценарию. Если что-то не так, отредактируйте функционал в настройках в конструкторе.

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

Резюме

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

Достаточно выбрать подходящую платформу с перечнем необходимых функций и команд, собрать из готовых блоков цепочку сообщений, протестировать и запустить чат-бот. Загружать на сервер его нет необходимости — bot будет работать 100% автономно на платформе. Главное зарегистрировать его в официальном сервисе BotFather.

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

Создание Telegram-бота на Java: от идеи до деплоя

Java-университет

Создание Telegram-бота на Java: от идеи до деплоя - 1

Что же такое вообще боты? Подробно почитать об этом можно здесь. Для начала вам необходимо ознакомиться с официальной документацией к библиотеке для разработки ботов на Telegram(далее API). Лежит она здесь. Там все очень доступно и понятно. Казалось бы, пиши да радуйся! Но не все так просто. Проведя много времени в поисковиках я находил отрывки знаний по разработке ботов, например, как сделать клавиатуру, обработать CallbackQuery и тому подобное. Полного и исчерпывающего руководства для разработки ботов на Java я так и не нашел. Это и натолкнуло меня на написание этой статьи. В Интернете много сайтов, где можно создать своего бота с уже готовым деплоем. Но дело в том. что в своем большинстве создаются боты, которые могут предоставить справочную информацию и прочее. Наш бот — полноценное веб-приложение, к которому можно привязать базу данных, выполнять запросы на различные API, парсить сайты, выполнять сложные вычисления и прочее. Дело ограничено только вашей фантазией. Я надеюсь что в этих строках я немного разъяснил вам о чем собираюсь писать. Бота в Telegram зарегистрировать очень просто, этот процесс подробно описан в документации по ссылке выше. Для нашего приложение необходимо знать только имя бота и токен, который вы получите при регистрации. По сути бот — просто консольное веб-приложение. Никакого фронтенда, чистая обработка команд. Если вы желаете хорошо освоить Hibernate или научиться парсить JSON, то такой проект для вас. Начнем с того чтобы подключить зависимость в pom.xml (подразумеваем что вы используете Maven). Сделать это можно так:

  org.telegram telegrambots 3.5  

Затем создаем класс Bot , унаследуем его от класса TelegramLongPollingBot , переопределив его методы:

 public class Bot extends TelegramLongPollingBot < /** * Метод для приема сообщений. * @param update Содержит сообщение от пользователя. */ @Override public void onUpdateReceived(Update update) < String message = update.getMessage().getText(); sendMsg(update.getMessage().getChatId().toString(), message); >/** * Метод для настройки сообщения и его отправки. * @param chatId id чата * @param s Строка, которую необходимот отправить в качестве сообщения. */ public synchronized void sendMsg(String chatId, String s) < SendMessage sendMessage = new SendMessage(); sendMessage.enableMarkdown(true); sendMessage.setChatId(chatId); sendMessage.setText(s); try < sendMessage(sendMessage); >catch (TelegramApiException e) < log.log(Level.SEVERE, "Exception: ", e.toString()); >> /** * Метод возвращает имя бота, указанное при регистрации. * @return имя бота */ @Override public String getBotUsername() < return ”BotName”; >/** * Метод возвращает token бота для связи с сервером Telegram * @return token для бота */ @Override public String getBotToken() < return ”BotToken”; >> 

Ну и содержимое метода main :

 public static void main(String[] args) < ApiContextInitializer.init(); TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try < telegramBotsApi.registerBot(Bot.getBot()); >catch (TelegramApiRequestException e) < e.printStackTrace(); >> 

Вписав в методы getBotUsername() и getBotToken() мы запускаем бота. Пока он только перенаправляет нам любые сообщения, которые мы отправим ему, этакое «зеркало». Работает это все следующим образом: когда вы запускаете приложение, оно начинает раз в n количество секунд отправлять на сервер Telegram GET запрос по следующему URL: https://api.telegram.org/BotToken/getMe, где BotToken – токен вашего бота, получая в ответ JSON, в котором находятся все сообщения. Каждое такое сообщение обрабатывается библиотекой и приходит в метод OnUpdateReceived(Update update) объектом Update . С ним то мы и работаем. В этом вся прелесть Telegram-ботов, они могут работать на любом компьютере, для тестирования нужно просто запустить приложение, не нужно деплоить его на хостинг после каждого изменения. Это очень удобно. Само собой бота можно настроить на работу по вебхуку, руководство можно найти на просторах Интернета, мы будем для простоты работать по LongPolling. То как обрабатывать сообщения и что отправлять в ответ ограничено только лишь средствами языка и библиотекой, все остальное на ваше усмотрение. Вы можете сделать бота, который будет искать для вас видео на YouTube, можете сделать бота, который каждый день будет присылать вам то, что вы отправите себе, к примеру, за год, эдакую капсулу времени. А можете научиться интегрироваться к CRM-системам и делать ботов для малого бизнеса, все ограничено вашей фантазией. Идем дальше. Те, кто пользовался ботами знают, что с ними удобно взаимодействовать командами, начинающимися со знака «/» , например /start . Но есть способ удобнее — кнопки. Есть два вида кнопок: те, что появляются под полем ввода, ReplyKeyboardMarkup и кнопки, которые находятся непосредственно под сообщением, к которому привязаны, InlineKeyboardMarkup . В документации вы можете поверхностно ознакомиться с их описанием. ReplyKeyboardMarkup. По сути это — массив массивов кнопок, List> . Вот пример кода, который создает клавиатуру

 public synchronized void setButtons(SendMessage sendMessage) < // Создаем клавиуатуру ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); sendMessage.setReplyMarkup(replyKeyboardMarkup); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboard(false); // Создаем список строк клавиатуры Listkeyboard = new ArrayList<>(); // Первая строчка клавиатуры KeyboardRow keyboardFirstRow = new KeyboardRow(); // Добавляем кнопки в первую строчку клавиатуры keyboardFirstRow.add(new KeyboardButton(“Привет”)); // Вторая строчка клавиатуры KeyboardRow keyboardSecondRow = new KeyboardRow(); // Добавляем кнопки во вторую строчку клавиатуры keyboardSecondRow.add(new KeyboardButton(“Помощь”); // Добавляем все строчки клавиатуры в список keyboard.add(keyboardFirstRow); keyboard.add(keyboardSecondRow); // и устанваливаем этот список нашей клавиатуре replyKeyboardMarkup.setKeyboard(keyboard); > 

В методе sendMsg() мы вызываем этот метод, передавая ему сообщение, таким образом устанавливая для такого сообщения клавиатуру. Когда мы отправим это сообщение пользователю, то он увидит текст сообщения, который мы установили, а также 2 кнопки, на которых будет написано Привет и Помощь, друг под дружкой. По нажатию на эти кнопки боту будет отправлено сообщение, текст которого представляет собой то, что написано на кнопке. То есть если клиент нажмет «Помощь», то боту придет сообщение с текстом “Помощь“. Для него это как будто бы клиент сам написал текст “Помощь“ и отправил бы ему. Ну а затем вы обрабатываете такие сообщения.

InlineKeyboardMarkup Это тоже массив массивов, он похож на предыдущий Markup, но логика работы здесь немного другая. Такая клавиатура привязывается к определенному сообщению и существует только для него. Вот метод для установки Inline-клавиатуры

 private void setInline() < List> buttons = new ArrayList<>(); List buttons1 = new ArrayList<>(); buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17)); buttons.add(buttons1); InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup(); markupKeyboard.setKeyboard(buttons); > 

Создаем List в List , добавляем в первую строку Inline-кнопку. Такая кнопка может содержать URL, ссылку на канал или же CallbackQuery , о которой я напишу чуть позже. Здесь мы устанавливаем текст для нашей кнопки, который будет видеть пользователь, а затем устанавливаем данные, которые будут отправлены боту. В нашем примере пользователь видит «Привет», а боту при нажатии отправится число 17, это и есть наш CallbackQuery . Пару слов о CallbackQuery . Для получения таких данных из объекта Update нужно выполнить update.getCallbackQuery() , этот метод возвращает CallbackQuery , из которого уже можно получить данные, переданные боту. Не нужно пытаться получить эти данные через метод update.getMessage().getText() , получите NullPointerException .

 @Override public void onUpdateReceived(Update update) < if(update.hasMessage()) < ThreadClass thread = new ThreadClass(update.getMessage()); >else if(update.hasCallbackQuery()) < AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery()); >> 

Если есть сообщение, отправляем на обработку в новый поток сообщение, если есть CallbackQuery , отправляем его на обработку в соответствующий поток. На CallbackQuery можно отправлять ответ. У каждого объекта в Telegram есть свой id. Для отправки ответа на определенный CallbackQuery нужно знать лишь его id, который мы получим из соответствующего объекта. Для отправки ответа вызовем такой метод:

 public synchronized void answerCallbackQuery(String callbackId, String message) < AnswerCallbackQuery answer = new AnswerCallbackQuery(); answer.setCallbackQueryId(callbackId); answer.setText(message); answer.setShowAlert(true); try < answerCallbackQuery(answer); >catch (TelegramApiException e) < e.printStackTrace(); >> 

ВАЖНО: Текст в ответе на CallbackQuery должен быть не длиннее 200 символов! При отправке такого ответа клиент получит всплывающее окно, в котором будет написано сообщение. Такое окно может исчезнуть через несколько секунд само после появления, а может висеть до тех пор, пока пользователь не нажмет ок. Для переключения этих режимов мы вызываем метод answer.setShowAlert(true) . При true окошко висит до нажатия ок, при false исчезает через 5 секунд. В принципе это все базовые фишки библиотеки Telegram bot. Такие вещи как отправка мультимедиа, геолокации и тд вы при желании сможете освоить из документации. Давайте перейдем к деплою нашего бота на хостинге. Для своего проекта я выбрал Heroku, тк по моему мнению это достаточно удобный хостинг, который имеет свой CLI. Он бесплатен, но на таком тарифе ваш бот при отсутствии запросов будет уходить в спячку через 30 минут. Когда же к нему будет отправлен запрос, он просыпается. Это происходит довольно быстро, вы даже не заметите(если конечно коннект к БД не поднимается заново). Ограничение на бесплатный тариф — 5MБ база данных, 100МБ дисковое пространство, 2ТБ траффика в месяц, 1 дино. Дино — это ваше запущенное приложение. Скажу сразу, именно стадия деплоя вызвала у меня трудности, так как я до этого никогда не разворачивал свои приложения. Heroku при деплое требует наличия файла с именем Procfile(без расширения). Создаем его в корне проекта, пишем туда worker: sh target/bin/workerBot workerBot – имя, которое мы указываем в pom.xml Будет запускаться sh скрипт, генерируемый с помощью Maven плагина appassembler-maven-plugin. В скрипте описан запуск скомпилированного jar. Имя запускаемого класса указывается между , имя скрипта между pom.xml:

 .  . org.codehaus.mojo appassembler-maven-plugin 1.1.1 target  com.home.server.TelegramBot workerBot     package assemble       

Перед началом этого процесса вам следует зарегистрироваться на Heroku, установить Git и Heroku CLI. Если вашему приложению необходима БД, то при оформлении нового приложения не забудьте добавить нужную вам БД. Далее вам необходимо узнать host, username, password и port вашей БД, а после указать в своем приложении. Далее перед деплоем выполните сборку вашего проекта с помощью Maven.

 mvn clean install 

Для начала мы переходим в каталог нашего проекта, инициализируем репозиторий командой git init Затем добавляем в этот репозиторий свой проект

 git add . 

После коммитим изменения

 git commit -m “First commit in project” 

Далее вам нужно залогиниться на heroku, пишем в командной строке

 heroku login 

Вводим свои данные, указаные при регистрации. После вам нужно узнать URL вашего репозитория на heroku, делается это в настройках. Затем пишем

 git remote add heroku [url] 

Для вашего репозитория добавится удаленный репозиторий heroku. Далее пишем

 git push heroku master 

Ждем… При успешном деплое приложения выполняем команду

 heroku ps:scale worker=1 

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

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

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