Ошибка с кодом 400: CHAT_ADMIN_REQUIRED
Для этого в указанном чате требуются права администратора чата (например, чтобы отправить сообщение в канале, который не принадлежит вам), или используются недопустимые разрешения для канала или группы.
Решение проблемы:
Если Вы работаете с Вашим аккаунтом и Вашей группой (пабликом), выдайте Вашему аккаунту в этой группе права администратора!
Выше предоставлено описание и возможное решение ошибки Телеграм с кодом 400 «CHAT_ADMIN_REQUIRED».
Вам, как пользователю программы стоит понимать, что данная ошибка может возникнуть как внезапно (например, если Ваш аккаунт уткнется в лимит Телеграм) так и прогнозируемо (например, если Вы не добавите аккаунт в Телеграм, или если Вы забыли добавить текст сообщения).
Однако, Вам стоить помнить что предложенный способ решения проблемы может не всегда быть подходящим для Вас. Но вы всегда можете найти эту ошибку в интернете. Возможно, там вы найдете более точный способ решения Вашей проблемы.
Так же, Вам нужно понимать что автор программы Telegram-Spam-Master может не знать, как решить вашу ошибку. Так что если в процессе поисков Вы найдете решение самостоятельно, было бы очень хорошо, если бы Вы поделились с ним этим решением!
Telegram Bot API возвращает CHAT_ADMIN_REQUIRED, хотя бот имеет все права
Я пишу telegram-бота (библиотека tgbot-cpp), и при вызове promoteChatMember я получаю исключение Bad Request: CHAT_ADMIN_REQUIRED , хотя бот имеет все права так и в группе, так и в настройках через BotFather: Я отправлял такой запрос через https, не используя никаких библиотек, но проблема та же. Что могло пойти не так? Вот сам код:
static void revokeAdmin(BotInfo& botInfo, const TgBot::Message::Ptr& message) < // spdlog::debug("Promoting admin. "); // Я являюсь владельцем группы, поэтому необязательно меня продвигать. // botInfo.bot.getApi().promoteChatMember(message->chat->id, message->from->id, true); botInfo.bot.getApi().promoteChatMember(message->chat->id, message->replyToMessage->from->id); >
( botInfo содержит самого бота и прочую информацию о нём, все параметры передаются правильно. Его поле bot имеет тип TgBot::Bot ).
Отслеживать
user570514
задан 20 окт 2023 в 16:17
user570514 user570514
1 2 2 бронзовых знака
Покажите ваш код.
20 окт 2023 в 16:18
Я изменил вопрос, добавил код.
20 окт 2023 в 16:26
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Ответ прост: бот не может повышать/понижать администраторов, создателей.
Отслеживать
ответ дан 27 окт 2023 в 14:35
user570514 user570514
1 2 2 бронзовых знака
- telegram-bot
- telegram
- бот
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.3.8.5973
TelegramBot. Базовый функционал. Мухи отдельно, котлеты отдельно. (Часть 2)
Продолжаем разрабатывать базовый функционал для бота в телеграм. В предыдущих частях обсуждался момент, что работу бота по получению сообщений, обработке и отправке нужно разделять. Давайте попробуем с помощью базовых инструментов Java Core сделать нашего бота многопоточным и асинхронным. Придумаем ему такое задание, которое занимает очень много времени на обработку. Рассмотрим как работают команды в телеграмме и как их нужно обрабатывать.
Это продолжение первой части статьи по программированию ботов для телеграмм на Java
TelegramBot инструкция по созданию базового функционала для бота. (Часть 1)
Кому интересно дальше, милости прошу под кат…
Сразу скажу, в этой части добавлено сразу много всего и по-тихоньку мы с вами разберем всю ту функциональность, что позволила боту суметь в многопоточность и зачем она ему вообще нужна.
Как обычно с главного:
Весь готовый код по этой статье вы можете найти в ветке Part2-Handlers в гит-репозитории.
Код полностью рабочий, достаточно склонироваться, изменить данные для авторизации бота(имя и токен) и запустить метод main в классе App.class.
Обратите внимание, данный класс при старте бота отправляет уведомление админу бота о том, что бот стартовал. ID админа бота также указывается в классе App.class и если вы его не измените — ваш бот будет пытаться слать сообщения мне 🙂
А дальше по пунктам разберем те изменения, которые появились после выхода первой части.
Обработка команд
Давайте для начала разберемся с таким понятием, что такое вообще команда в системе общения с телеграм ботом. В зависимости от настроек бота, он может либо видеть любые сообщения любого формата либо только специально оформленные команды. В чем отличие и
где можно встретить эти варианты сообщений.
- Обычный текст, обычные сообщения.
В таком виде бот получается сообщения, когда ему пишут в личку. И еще, если в настройках бота режим приватности в группах боту отключают — он начинает видеть полностью все сообщения. Есть же эта настройка включена, то при добавлении в группу бот видит только адресованные ему команды. Как они выглядят — смотрите второй пункт - Специально оформленные команды
Такие команды всегда начинаются с косой черты: /
После следует сама команда. Текст команды должен быть без пробелов. Пример:
/start
С этой команды любой пользователь всегда начинает общение с вашим ботом. Поэтому по правилам хорошего тона реакцию на эту команду нужно прописывать обязательно.Все команды, с которыми умеет работать ваш бот, желательно добавить в список умений в настройках вашего бота. Делается это все в телеграмме с @BotFather.
Вызвав команду /myBots выберите вашего бота и дальше кнопка «Edit Bot»
Вы получите такое окно, где будут показаны все параметры бота и дальше можно настроить весь его интерфейс и указать с какими командами ваш бот умеет работать.
Задаются они вот в таком формате:
И после этого при начале ввода команды вашему боту — он будет показывать помощь со списком перечисленных команд:
Создадим package, который у нас будет содержать классы, ответственные за обработку команд.
package com.example.telegrambot.command
В классе Command мы перечислим все команды, которые должен уметь понимать наш бот.
public enum Command
Как вы видели ранее, я у @BotFather указал, что бот у меня должен уметь понимать 4 команды. Это будут стандартные start и help. Одну добавим полезную — id. И еще одну, notify, про которую я расскажу чуть позже. И две команды NONE и NOTFORME, которые будут говорить нам, что текст сообщение либо вообще не является командой, либо это команда не для нашего бота.
Еще добавим один вспомогательный класс ParsedCommand
import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class ParsedCommand
Основное его назначение — в объектах этого класса мы будет хранить результат парсинга текста. Содержаться в нем будет только сама команда и весь текст, который идет после команды.
И напишем отдельный класс, который будет нам парсить команды. Класс Parser
import javafx.util.Pair; import org.apache.log4j.Logger; public class Parser < private static final Logger log = Logger.getLogger(Parser.class); private final String PREFIX_FOR_COMMAND = "/"; private final String DELIMITER_COMMAND_BOTNAME = "@"; private String botName; public Parser(String botName) < this.botName = botName; >public ParsedCommand getParsedCommand(String text) < String trimText = ""; if (text != null) trimText = text.trim(); ParsedCommand result = new ParsedCommand(Command.NONE, trimText); if ("".equals(trimText)) return result; PaircommandAndText = getDelimitedCommandFromText(trimText); if (isCommand(commandAndText.getKey())) < if (isCommandForMe(commandAndText.getKey())) < String commandForParse = cutCommandFromFullText(commandAndText.getKey()); Command commandFromText = getCommandFromText(commandForParse); result.setText(commandAndText.getValue()); result.setCommand(commandFromText); >else < result.setCommand(Command.NOTFORME); result.setText(commandAndText.getValue()); >> return result; > private String cutCommandFromFullText(String text) < return text.contains(DELIMITER_COMMAND_BOTNAME) ? text.substring(1, text.indexOf(DELIMITER_COMMAND_BOTNAME)) : text.substring(1); >private Command getCommandFromText(String text) < String upperCaseText = text.toUpperCase().trim(); Command command = Command.NONE; try < command = Command.valueOf(upperCaseText); >catch (IllegalArgumentException e) < log.debug("Can't parse command: " + text); >return command; > private Pair getDelimitedCommandFromText(String trimText) < PaircommandText; if (trimText.contains(" ")) < int indexOfSpace = trimText.indexOf(" "); commandText = new Pair<>(trimText.substring(0, indexOfSpace), trimText.substring(indexOfSpace + 1)); > else commandText = new Pair<>(trimText, ""); return commandText; > private boolean isCommandForMe(String command) < if (command.contains(DELIMITER_COMMAND_BOTNAME)) < String botNameForEqual = command.substring(command.indexOf(DELIMITER_COMMAND_BOTNAME) + 1); return botName.equals(botNameForEqual); >return true; > private boolean isCommand(String text) < return text.startsWith(PREFIX_FOR_COMMAND); >>
Вкратце. При инициализации парсера мы обязательно передаем в конструкторе имя нашего бота, чтобы парсер умел отличать свои команды от чужих.
Ну и дальше мы просто вызываем публичный метод
public ParsedCommand getParsedCommand(String text)
Которому в аргументах передаем текст сообщения, а он нам в ответ должен вернуть команду и текст сообщения идущий после команды.
Как работает парсер вы можете увидеть в тестовом классе.
Мухи отдельно, котлеты отдельно
Теперь нам нужно научить нашего бота раздельно получать сообщения, обрабатывать и отправлять ответы. После ряда проб и ошибок я пришел вот к такой логике работы приложения.
Основной класс Bot будет работать в основном потоке приложения и будет занят только тем, что все полученные сообщения будет складывать в специальную очередь и так же будет контейнером для сообщений, которые мы планируем отправить пользователю в ответ.
Изменения в этом классе очень незначительные. Мы добавили две очереди:
public final Queue sendQueue = new ConcurrentLinkedQueue<>(); public final Queue receiveQueue = new ConcurrentLinkedQueue<>();
и немного переписали код функции public void onUpdateReceived(Update update)
@Override public void onUpdateReceived(Update update)
Почему так? Опять таки я перепробовал разные варианты. И основная проблема многопоточности — это работа с общими данными. И мне больше всего понравилось как с этим справляется реализация многопоточных очередей ConcurrentLinkedQueue<>()
И как вы видите, в обоих очередях у нас будут хранится типы данных Object. Это еще одна закладка на будущее. Таким образом мы не привязываемся к типам полученных сообщений. Во входящую очередь сможем складывать не только объекты типа Update а и какие-то другие, нужные нам.
Тоже самое и с очередью на отправку. Так как мы можем отправлять самые разные типы сообщений и у них нет общего родителя — мы также используем общий тип данных — Object.
Если в таком виде запустить бота, то он будет работать, но не будет делать ничего. Все полученные сообщения он будет фиксировать в логе и складывать в очередь.
Следовательно нам нужен какой-то поток, который займется тем, что будет забирать из очереди принятые сообщения и совершать над ними какие-то действия и складывать в очередь sendQueue результаты своей работы.
Создадим отдельный package: service и в нем у нас будет всего 2 класса:
MessageReciever — обработчик полученных сообщений
MessageSender — обработчик очереди сообщений, которые нужно отправить пользователю.
Их работу мы рассмотрим чуть ниже, а пока пропишем их использование в нашем стартовом классе App
После того, как наш бот приконнектился — мы стартует наши обработчики в отдельных потоках:
MessageReciever messageReciever = new MessageReciever(test_habr_bot); MessageSender messageSender = new MessageSender(test_habr_bot); test_habr_bot.botConnect(); Thread receiver = new Thread(messageReciever); receiver.setDaemon(true); receiver.setName("MsgReciever"); receiver.setPriority(PRIORITY_FOR_RECEIVER); receiver.start(); Thread sender = new Thread(messageSender); sender.setDaemon(true); sender.setName("MsgSender"); sender.setPriority(PRIORITY_FOR_SENDER); sender.start();
Для обоих потоков мы указываем режим Daemon. Это нужно для того, чтобы потоки работали до тех пор, пока работает основной поток и сами завершались, как только он свою работу прекращает.
Как бы не хотелось разобраться в первую очередь с обработчиком входящих сообщений — давайте разберем работу класса MessageSender.
Разберем по пунктам, что он умеет и что делает:
-
Естественно это наследование интерфейса для многопоточности:
implements Runnable
и реализация функции run
@Override public void run()
Тут мы запускам бесконечный цикл, который занят только тем, что он проверяет очередь на отправку и вызывает команду send
private void send(Object object)
Он, как и MessageSender, должен быть многопоточным, в конструкторе получать объект класса Bot, в котором он в бесконечном цикле будет брать принятые сообщения, обрабатывать их и складывать ему же в очередь для отправки результаты своей работы.
Тут мы используем созданный ранее парсер команд. И тут же мы добавим возможность использовать различные типы обработчиков для наших команд и некоторые из них сделаем многопоточными.
Цикл работы очень простой:
@Override public void run() < log.info("[STARTED] MsgReciever. Bot class: " + bot); while (true) < for (Object object = bot.receiveQueue.poll(); object != null; object = bot.receiveQueue.poll()) < log.debug("New object for analyze in queue " + object.toString()); analyze(object); >try < Thread.sleep(WAIT_FOR_NEW_MESSAGE_DELAY); >catch (InterruptedException e) < log.error("Catch interrupt. Exit", e); return; >> >
Проверяем очередь. Если что-то есть — запускаем анализатор:
private void analyze(Object object)
Если ничего нет — ждем.
Анализатор проверяет тип объекта. Если он умеет с ним работать — запускает следующий анализатор. Если не умеет — ругается 🙂
Почему так? Опять таки это закладка на будущее и, надеюсь, я её раскрою в следующих частях этого цикла статей. Такая реализация позволит нам потом формировать свои какие-то задания для бота, делать списки рассылок, дневные задания. Для этого ресивер должен уметь обрабатывать не только объекты типа Update а и что-то наше. Но об этом потом 🙂
Рассмотрим подробнее анализатор для типа Update:
private void analyzeForUpdateType(Update update) < Long chatId = update.getMessage().getChatId(); String inputText = update.getMessage().getText(); ParsedCommand parsedCommand = parser.getParsedCommand(inputText); AbstractHandler handlerForCommand = getHandlerForCommand(parsedCommand.getCommand()); String operationResult = handlerForCommand.operate(chatId.toString(), parsedCommand, update); if (!"".equals(operationResult)) < SendMessage message = new SendMessage(); message.setChatId(chatId); message.setText(operationResult); bot.sendQueue.add(message); >>
Он определяет ID чата. Получает текст сообщения. С помощью парсера определяет, является ли сообщение командой и определяет каким хендлером данную команду нужно обрабатывать. Запускает обработку команды и если обработка команды вернула какой-то непустой текст — формирует сообщение для отправки пользователю и складывает его в очередь.
И тут у вас должен возникнуть вопрос: «Что еще за хендлер?». Речи про него раньше не шло и в коде он не упоминался. Все верно. Сейчас мы этот функционал и разберем.
Для этого создадим отдельный package, который и будет хранить все наши хендлеры. Назовем его handler
Создадим абстрактный класс AbstractHandler
import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import org.telegram.telegrambots.api.objects.Update; public abstract class AbstractHandler < Bot bot; AbstractHandler(Bot bot) < this.bot = bot; >public abstract String operate(String chatId, ParsedCommand parsedCommand, Update update); >
У него будет базовый конструктор, в котором мы передаем с каким именно объектом Bot ему нужно будет взаимодествовать. И объявлена абстрактная функция operate реализацию которой мы должны будем прописать в наследниках нашего класса.
И сразу же реализуем самый простой хендлер, который не будет делать ничего и использовать мы его будем тогда, когда не сможем понять что за тип команды нам передали и от бота никакой реакции не требуется.
import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.objects.Update; public class DefaultHandler extends AbstractHandler < private static final Logger log = Logger.getLogger(DefaultHandler.class); public DefaultHandler(Bot bot) < super(bot); >@Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) < return ""; >>
Как мы его применим и где мы получим результаты его работы — разберем чуть позже.
Следующий на очереди — SystemHandler
Он у нас займется обработкой базовых команд, таких как start, help и мы поручим ему еще и выполнение команды id
Основа его выглядит так:
import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.Command; import com.example.telegrambot.command.ParsedCommand; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.methods.send.SendMessage; import org.telegram.telegrambots.api.objects.Update; public class SystemHandler extends AbstractHandler < private static final Logger log = Logger.getLogger(SystemHandler.class); private final String END_LINE = "\n"; public SystemHandler(Bot bot) < super(bot); >@Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) < Command command = parsedCommand.getCommand(); switch (command) < case START: bot.sendQueue.add(getMessageStart(chatId)); break; case HELP: bot.sendQueue.add(getMessageHelp(chatId)); break; case ID: return "Your telegramID: " + update.getMessage().getFrom().getId(); >return ""; >
Как реализовано формирование ответа на команду start и help вы можете посмотреть в коде 🙂
Формируем текстовые сообщения и складываем их в очередь на отправку. На этом работа хендлера прекращается. Кто и как отправит эти сообщения — его совершенно не волнует.
И помните чуть выше я упоминал, что в результате работы хендлера он возвращает какие-то текстовые данные. И если эта строка не пустая — мы этот текст должны отправить пользователю. Вот именно этот функционал мы и использовали при отработке команды ID:
case ID: return "Your telegramID: " + update.getMessage().getFrom().getId();
Хендлер вернет текст с ID пользователя тому, кто его вызвал и уже там сформируется сообщение на отправку, которое и уйдет потом в очередь.
И в начале статьи я упомянул, что мы реализуем такой вариант обработки сообщения пользователя, которому на работу нужно время. И чтобы он не мешал нашим обработчикам — мы его выделим в отдельный поток и пусть он занимается своим делами, не отвлекая остальных.
В качестве такого «тяжеловесного» потока я придумал команду notify. Принцип её работы такой.
Передав боту команду вида:
/notify 300
Бот должен вам сообщить, что команду понял и через 300 секунд он пришлет вам какое-то уведомление, что 300 секунд прошли. У этой команды может быть даже практическое применение 🙂
Например вы поставили пельмешки на огонь и вам их нужно снять через 5 минут. Бот с этим отлично справится и кинет вам в чат уведомление о том, что время вышло.
Или возьмем задачу более серьезную. Вы идете на важную встречу и вы знаете, что при общении с собеседником вам нужно будет прервать разговор. Для этого обычно просят друзей или позвонить или написать сообщение, что и будет являться мотивом не на долго отвлечься от беседы и сделать какие-то действия. Но зачем мучать друзей, когда у вас есть бот? Задав ему заранее задание и указав время — вы получите нужное уведомление в телеграм. Но это все лирика. Задание и эта команда придуманы лишь для того, чтобы показать вам как выделить в отдельный поток что-то, чья работа может занимать очень большой промежуток времени.
import com.example.telegrambot.ability.Notify; import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.objects.Update; public class NotifyHandler extends AbstractHandler < private static final Logger log = Logger.getLogger(NotifyHandler.class); private final int MILLISEC_IN_SEC = 1000; private String WRONG_INPUT_MESSAGE = "Wrong input. Time must be specified as an integer greater than 0"; public NotifyHandler(Bot bot) < super(bot); >@Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) < String text = parsedCommand.getText(); if ("".equals(text)) return "You must specify the delay time. Like this:\n" + "/notify 30"; long timeInSec; try < timeInSec = Long.parseLong(text.trim()); >catch (NumberFormatException e) < return WRONG_INPUT_MESSAGE; >if (timeInSec > 0) < Thread thread = new Thread(new Notify(bot, chatId, timeInSec * MILLISEC_IN_SEC)); thread.start(); >else return WRONG_INPUT_MESSAGE; return ""; > >
Проверяем, передали ли нам в тексте время задержки. Если нет — ругаемся. Если да — стартуем новый поток, куда мы передаем вводные по нашему заданию. Выполнением этого задания займется отдельный класс Notify.
Функционал предельно простой. Он спит указанное колличество секунд. Но в процессе его сна ваш бот умеет принимать любые другие сообщения, общаться с вами, запускать еще дополнительные уведомления. И все это работает отдельно друг от друга.
И чтобы логично завершить всю эту связку с вызовом хендлеров, вернемся в наш класс MessageReciever и посмотрим как мы понимаем какой хендлер нам нужен и как мы их запускаем.
Нужный хендлер нам возвращает команда
private AbstractHandler getHandlerForCommand(Command command) < if (command == null) < log.warn("Null command accepted. This is not good scenario."); return new DefaultHandler(bot); >switch (command) < case START: case HELP: case ID: SystemHandler systemHandler = new SystemHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + systemHandler); return systemHandler; case NOTIFY: NotifyHandler notifyHandler = new NotifyHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + notifyHandler); return notifyHandler; default: log.info("Handler for command[" + command.toString() + "] not Set. Return DefaultHandler"); return new DefaultHandler(bot); >>
Теперь, если вы захотите добавить еще какие-то команды, нужно будет сделать следующее:
- В классе Command добавить синтаксис команды.
- В ресивере в функции getHandlerForCommand указать, кто будет ответственен за обработку этой команды.
- И собственно написать этот хендлер.
О чем мы поговорим в следующих частях?
Нам нужно понять как формировать разные типы сообщений. Как работать с клавиатурой и кнопками. Как редактировать свои старые сообщения. Как работать с колбеками. Как давать задания боту на выполнение каких-то действий. Как формировать интерактивное сообщение с ботом и многое другое. Все дальнейшие части зависят от вас и вашей активности.
Жду в комментариях ваши отзывы и направления, которые мы рассмотрим в приоритете.
Не стесняйтесь, задавайте вопросы. Если в статье что-то не указано или какой-то момент не ясен — напишите мне об этом. Я обязательно поправлю, отредактирую или уточню спорные моменты.
Программируйте в удовольствие и да прибудет с вами сила и красивый код 🙂
Бот, написанный в этой части статьи, работает. Помучать его можно тут: @test_habr_bot
Так же можно помучать моего планировщика: @EventCheckPlanner_Bot
И Дерзкого киномана: @FilmFanAmateurBot.
РАЗРАБОТКА ЧАТ-БОТА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON В МЕССЕНДЖЕРЕ «TELEGRAM» Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Шумилина Мария Александровна, Коробко Анна Владимировна
В статье рассматривается разработка чат-бота, на основе существующей методологии Agile, поддерживающая информационный поток на основе продвижения обучения востребованным IT — профессиям, с помощью интерактивного тестирования и рекламы в телеграм-канале. Существующие методики для разработки чат — ботов ограничиваются лишь внесением уже разработанных команд в конструкторе чат — ботов, либо шаблонной программы, в которой необходимо заполнить лишь некоторые информационные поля, поэтому данные методики не применимы к области разработки программного продукта. Приведено решение задач по: поиску информации, организации обратной связи, а также наполнение актуальным контентом чат-бота . Особенностью разработки интеллектуального помощника является разделение ролей на пользователя и администратора (модератора чат-бота ), определяемого по индивидуальному номеру на основе которого осуществляется наполнение контента с помощью прописанных команд для бота. Для обеспечения обратной связи с пользователем разработан простой сценарий, позволяющий получить информацию о пользователе: ФИО, номер телефона, локацию.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Шумилина Мария Александровна, Коробко Анна Владимировна
РАЗРАБОТКА ЧАТ-БОТА В КАЧЕСТВЕ ВИРТУАЛЬНОГО ПОМОЩНИКА ДЛЯ МОТИВАЦИИ СТУДЕНТОВ К ПОЛУЧЕНИЮ ПРОФЕССИИ
РАЗРАБОТКА ЧАТ-БОТОВ ДЛЯ ПОДДЕРЖКИ ПОИСКА ПО КОНТЕНТУ ВЕБ-САЙТОВ НА ОСНОВЕ ТЕМАТИЧЕСКИХ И ЖАНРОВЫХ ХАРАКТЕРИСТИК
СОЗДАНИЕ ТЕЛЕГРАМ-БОТА С ПОМОЩЬЮ СРЕДЫ РАЗРАБОТКИ VISUAL STUDIO
АНАЛИЗ И РАЗРАБОТКА ФУНКЦИОНАЛЬНОГО TELEGRAM-БОТА
МОДЕЛИРОВАНИЕ И АВТОМАТИЗАЦИЯ КОНСУЛЬТАНТА-ПОМОЩНИКА ДЛЯ СЕТИ МАГАЗИНОВ «МАГНИТ»
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
DEVELOPMENT OF A CHATBOT IN THE PYTHON PROGRAMMING LANGUAGE IN THE TELEGRAM MESSENGER
The article discusses the development of a chatbot based on the existing Agile methodology, which supports the information flow based on the promotion of training in popular IT professions, using interactive testing and advertising in the telegram channel. The existing methods for developing chatbots are limited only to introducing already developed commands in the chatbot designer, or a template program in which only some information fields need to be filled in, so these methods are not applicable to the field of software product development. The solution of the tasks of: finding information, organizing feedback, as well as filling the chatbot with relevant content is given. A feature of the development of an intelligent assistant is the separation of roles into a user and an administrator (moderator of a chatbot), determined by an individual number on the basis of which content is filled using prescribed commands for the bot. To provide feedback to the users.
Текст научной работы на тему «РАЗРАБОТКА ЧАТ-БОТА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON В МЕССЕНДЖЕРЕ «TELEGRAM»»
РАЗРАБОТКА ЧАТ-БОТА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON В МЕССЕНДЖЕРЕ «TELEGRAM»
Шумилина Мария Александровна
Магистрант, Сибирский государственный университет науки и технологий им. М.Ф. Решетнева marya_dnep@mail. ru
Коробко Анна Владимировна
Доцент, кандидат технических наук, Сибирский государственный университет науки
и технологий им. М.Ф. Решетнева
В статье рассматривается разработка чат-бота, на основе существующей методологии Agile, поддерживающая информационный поток на основе продвижения обучения востребованным IT — профессиям, с помощью интерактивного тестирования и рекламы в телеграм-канале. Существующие методики для разработки чат — ботов ограничиваются лишь внесением уже разработанных команд в конструкторе чат — ботов, либо шаблонной программы, в которой необходимо заполнить лишь некоторые информационные поля, поэтому данные методики не применимы к области разработки программного продукта. Приведено решение задач по: поиску информации, организации обратной связи, а также наполнение актуальным контентом чат-бота. Особенностью разработки интеллектуального помощника является разделение ролей на пользователя и администратора (модератора чат-бота), определяемого по индивидуальному номеру на основе которого осуществляется наполнение контента с помощью прописанных команд для бота. Для обеспечения обратной связи с пользователем разработан простой сценарий, позволяющий получить информацию о пользователе: ФИО, номер телефона, локацию.
Ключевые слова: разработка, чат-бот, программная инженерия, phyton, telegram-bot.
DEVELOPMENT OF A CHATBOT IN THE PYTHON PROGRAMMING LANGUAGE IN THE TELEGRAM MESSENGER
Shumilina Maria Alexandrovna
Master’s student, M.F. Reshetnev Siberian State University of Science and Technology marya dnep@mail.ru
Korobko Anna Vladimirovna
Associate Professor, Candidate of Technical Sciences, M.F. Reshetnev Siberian State
University of Science and Technology
The article discusses the development of a chatbot based on the existing Agile methodology, which supports the information flow based on the promotion of training in popular IT professions, using interactive testing and advertising in the telegram channel. The existing methods for developing chatbots are limited only to introducing already developed commands in the chatbot designer, or a template program in which only some information fields need to be filled in, so these methods are not applicable to the field of software product development. The solution of the tasks of: finding information, organizing feedback, as well as filling the chatbot with relevant content is given. A feature of the development of an intelligent assistant is the separation of roles into a user and an administrator (moderator of a chatbot), determined by an individual number on the basis of which content is filled using prescribed commands for the bot. To provide feedback to the users.
Keywords: development, chatbot, software engineering, phyton, telegram-bot.
На сегодняшний день ^-технологии с большой скоростью шагнули вперед и чат-боты нашли широкое применение в различных сферах бизнеса и жизни, что сильно повлияло на выполнение повседневных задач. В современной жизни при большом количестве информации и в какой-то мере фальсифицирующих данных, в первую очередь требуется умение находить нужную и достоверную информацию, фильтруя бесполезные материалы, выбирая из них только самое необходимое для применения этих знаний при решении поставленной задачи.
удовлетворенности ботами очень велик и в среднем по рынку превышает 10%, отмечают аналитики Markswebb [2]. Текстовых роботов внедряют преимущественно лидеры рынков, а остальным компаниям недостает компетенций в этом.
Чат-бот — это разновидность программного виртуального помощника с ограниченным функционалом, который общается с пользователем посредством текстовых сообщений и виджетов [1]. Программа представляет собой предметно-ориентированный текстовый диалоговый интерфейс, с помощью которого пользователь может выполнить ограниченный набор задач.
Разработчик может программно прописать любые свойства виртуального помощника, который выдает, сохраняет и определяет ответы, схожие с теми, что отвечает специалист контактной помощи. Боты, используются для решения простых ежедневных задач, получения различной информации, консультаций, заказов и др. Таким образом, чат-боты могут заменить
некоторых сотрудников, а также сайты, call-центры и целые приложения.
За последнее время чат-ботов начали активно внедрять в сферу образования. Например, для расширения предоставления существующей информации об
образовательном учреждении, ответов студентам и абитуриентам на вопросы по образовательной деятельности и доступности курсов, что отражено в работах. Исследователи отмечают большой потенциал использования чат-ботов для улучшения процесса обучения и результатов обучения [10].
Одно из направлений внедрения и разработки чат-ботов для образовательных учреждений являться продвижение системы открытого образования. Это и определило цель данного проекта -продвижение обучения востребованным IT — профессиям, с помощью интерактивного тестирования и рекламы отделу дополнительного ИТ — образования СибГУ им. М. Ф. Решетнева путем разработки чат-бота, автоматизирующего бизнес-процесс обработки обращений будущих студентов, подбор курсов посредством прохождения теста в телеграм-чате, а также разработка модуля администратора для управления контентом, на языке программирования python в мессенджере «Telegram».
Актуальностью выбранной темы проекта является улучшение
пользовательского опыта при использовании сервисов учебного заведения слушателями и студентами мобильных устройств, а также повышении понимания проблемы
взаимодействия людей и чат-ботов, на актуальность которой исследователи обращают пристальное внимание в последнее время, в частности в работе [9].
Рис. 1. Диаграмма описания бизнес-процесса «до внедрения чат-бота»
Рис. 2. Диаграмма описания бизнес-процесса «после внедрения чат-бота»
Кроме того, актуальной проблемой может быть не всегда достаточная поддержка мобильных устройств и небольшие размеры экрана смартфона, что затрудняет просмотр сайтов, таблиц и большого текста. Все это в совокупности может сделать опыт для пользователей мобильных устройств малоприятным. В результате можно описать основные требования, которые необходимо учитывать при реализации системы разработки чат — бота. Можно выделить следующие:
— актуальность и доступность информации о курсах;
— получение информации максимально простым и быстрым способом;
— доступный и удобный интерфейс для пользователей, использующих мобильные устройства;
— реализация учета различных особенностей подачи информации о курсах, например, категории обучения: дистанционное, очное, переподготовка, повышение квалификации и т.д.;
— система, предоставляющая информацию о курсах, расположении, цене должен предоставлять последнее состояние данных на случай непредвиденного нарушения работоспособности сервера.
В качестве реализуемости диалогового интерфейса было выбрано использовать платформу с разрабатываемым каналом чат-бота в мессенджере «Telegram». В качестве программной оболочки был выбран язык разработки Python в среде Pycharm.
Разрабатываемый чат-бот будет служить полезным дополнением и к другим способам представления информации об Управлении и актуальных курсов, ориентированным на поколение, привыкшее
достаточно много времени проводить в мессенджерах и социальных сетях и желающее получать от них не только развлечения, но и полезные сервисы, с необходимыми напоминания.
При необходимости получения дополнительной информации от
потенциального клиента в рамках разрабатываемого модуля получения и структурирования информации для более точного формирования статистики пользователя предусматривается подсистема формирования опросов, посредством которой осуществляется систематизированный сбор необходимой информации (возраст, пол, регион проживания, интересы и т.д.) [5].
Описание разработки системы посредством проектирования ПО
На сегодняшний день нет чётких терминологических понятий, дающий определение «программному обеспечению». Поэтому ставиться вопрос, можно ли отнести разработку чат — бота к определению разработки ПО. Для этого необходимо описать алгоритм разработки ПО, провести анализ методов разработки ПО и попробовать применить одну из методологий к разработке чат — бота.
Сравнивая существующие методологии разработки программного обеспечения и оценивая их применимость к процессу разработки чат — бота для образовательного учреждения, можно сказать, что «гибкие» методы позволяют быстро создать первую версию продукта, имеющего законченный функционал и обладающий
самодостаточностью, которую можно предоставить заказчику для тестирования [4]. Наиболее применимой в области разработки и проектирования чат — ботов можно считать FDD
методологию с добавлением в процессе проектирования и реализации практик из других методов (DSDM, Scrum и OpenUP).
Существует два подхода к реализации ПО для разработки чат — бота:
— однокомпонентная архитектура. Вся логика изложена в одно приложение, индивидуально для каждой платформы, но оно не позволяет использовать социальное взаимодействие между пользователями;
— многокомпонентная архитектура или клиент-сервер. Описывает отношения между
клиентом и сервером, где их клиент выполняет последовательность действий, запрос ожидает ответ — обработка при получении. Сервер, в свою очередь, разрешает пользователь выполняет обработку, необходимую для получения результата — передает результат [2].
В нашем случае больше разработки ПО для реализации чат — бота подходит многокомпонентная архитектура (клиент -сервер).
Рис. 3. Многокомпонентная архитектура взаимодействия
Обычно процесс разработки программного обеспечения включает в себя разработку требований, анализ,
проектирование, реализацию, тестирование и внедрение. На этапе проектирования пользовательского интерфейса, необходимо прописать концептуальную модель. Для начала выделим актеров (пользователей), которые будут взаимодействовать с системой:
— администратор чат — бота (moderator)-специалист отдела, который будут управлять всем контентом в системе, также специалист отдела будет иметь полный доступ ко всему функционалу системы;
— пользователь — в основном это будущие слушатели / студенты дополнительных программ, которые хотят получить дополнительное образование или повысить квалификацию, но в дальнейшем приложением могут пользоваться и студенты, которые уже получили дипломы.
Необходимо выделить основные прецеденты телеграм-бота:
— просмотр контактной информации об отделе дополнительного ИТ — образования;
— прохождение тестирования для побора курса;
— предоставление справочной информации;
— сохранение обратной связи;
— наполнение базы данных от роли администратора.
Производится в приложении Telegram.
— запустить бота командой /start;
— перейти к модулю «Основное меню», которое содержит команды: «Что могу», «Где находимся», «Свяжитесь со мной» и
«Подобрать курс» с помощью навигационных кнопок;
— выбрать команду из меню, например, «Подобрать курс» и следовать указаниям бота, отвечая на вопросы, управляя ими инлайн-кнопками;
— после окончания тестирования бот выдает наиболее подходящий курс, под ваши интересы и предлагает записаться на курс.
специалист отдела дополнительного ИТ -образования. Производится в приложении Telegram, в группу с чат-ботом необходимо прописать команду /moderator или /Загрузить. Описание шагов:
— авторизоваться в системе;
— запустить бота командой /moderator;
— дождаться подтверждения роли. После прописанной команды, чат — бот ищет ваш номер ID в администраторах группы, если ваш ID является администратором, то бот выдает администраторскую панель управления, если ваш ID не найден в базе администраторов, то бот пишет сообщение: «Вы не являетесь администратором».
— добавить, редактировать или удалить новости, контакты, или другую информацию;
— загрузить обновленные данные в БД с помощью команды /сохранить данные.
Разработка и оптимизация готового решения.
Функциональная модульная структура разрабатываемого бота состоит из компонентов:
— модуль получения и структурирования информации;
— модуль для обработки полученного сообщения;
— модуль распределения ролей на администратора и пользователя (клиента);
— модуль подключённой базы данных;
модуль передачи конечного
Рис. 5. Схема функциональной модульной структуры
Для того, чтобы создать нового бота, необходимо в контактах мессенджера Telegram включить бота по созданию ботов BotFather командой /start. После того, как BotFather направит пользовательское меню, необходимо задать настройку
разрабатываемого бота. Алгоритм создания бота представлен ниже:
1. В чате с BotFather выбирается команда создания собственного бота: /newbot (новый бот), скриншот доступных команд представлен на рисунке 6.
2. Далее боту присваиваем имя бота (@infokomt_sibguBot), команды представлены на рисунке 7.
3. После того, как BotFather подтвердил имя бота, копируем ссылку с присвоенным token (идентификатор, по которому можно подключить бота) и прописываем пользовательское имя бота (Научим IT — профессии).
Хранение token’a должно быть локальным, так как это ключ для взаимодействия с ботом. ни в коем случае нельзя выгружать его в общий доступ.
Информация о боте
1 can help you create and manage Telegram bots. If you’re new to the Bot API, please see the manual.
You can control me by sending these commands:
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
/newbot • create a new bot /mybots — edit your bots [beta]
Edit Bots /setname — change a bot’s name /setdescription — change bot description /setaboultext — change bot about info /setuserpic — change bot profile photo /setcommands — change the list of commands /deletebot — delete a bot
Bot Settings /token — generate authorization token /revoke — revoke bot access token /setlnline — toggle inline mode /setinlinegeo — toggle inline location requests /setinlinefeedback — change inline feedback settings »setjoingroups — can your bot be added to groups? /setprivacy — toggle privacy mode in groups
BotFather is the one bot to rule them all. Use it to creat« new bot accounts and manage your existing bots.
(JJ^ Остановить и блокировать
Рис. 6. Команды доступные при подключении к BotFather
Рис. 7. Присвоение создаваевому чат — боту название
Запуск бота осуществим с помощью bat-файла (bot_run.bat). В целом, можно обойтись и без него, но запускать приложение бота при помощи bat-файла более правильно во время оформления проекта, т.к. безопасно получится сохранить token и другие данные, ведь приложение будет запускаться в оболочке с необходимыми для неё данными.
Чтобы прописать необходимый функционал для чат-бота необходимо написать соответствующий код. С помощью среды разработки PyCharm разработали код, который
будет описывать требования к функционалу чат-бота.
После установки библиотеки aiogram и создания bat-файла, можно приступать к написанию главного файла — tg_bot.py. Для этого необходимо импортировать
конфигурацию и систему логирования. Затем необходимо подключить модули библиотеки aiogram, а также инициализировать объекты бота и диспетчера, создав две переменные -Bot и Dispatcher, скриншот представлен на рисунке 8.
I^i create_bot.py i£> tg_bot.py X l from aiogram import Bot
from aiogram.dispatcher import Dispatcher
5 from aiogram.contrib.fsm_storage.memory import MemoryStorage
bot = Bot(token=os.getenv(1 TOKEN’)) dp = DispatcherCbot, storage=storage)
Рис. 8. Импортированные модули библиотеки aiogram
Переменная bot отвечает за прямой доступ к методам API и обеспечивает общее взаимодействие с ботом, а вторая переменная Dispatcher — является простым обработчиком событий. Dispatcher в библиотеке aiogram это своего рода диспетчер, который будет выполнять множество задач по взаимодействию с ботом. В т.ч. получение сообщений. А polling не даст завершить работу бота пока приложение активно.
В программный код записываем функцию async def echo_send(): т.к. aiogram -это асинхронная библиотека, а python однопоточный — любые команды выполняются
только после того, как завершилась предыдущая. Но боту необходимо отвечать на множество сообщений и отвечать очень быстро
Для управления чат-ботом необходимо разделение на роли пользователей: администратор и клиент. Если клиентская часть состоит из выбора команд главного меню, то часть администратора состоит в обновлении и ведении информации внутри бота. Пропишем «проверку» на администратора бота, чтобы у любого пользователя не было возможности добавлять и редактировать курсы, рисунок 9.
Рис. 9 — Админская часть чат- бота командой /Загрузить или /moderator
Рис.10. Админская часть чат- бота с загрузкой в БД
Рис. 11. Клиентская часть чат- бота пункта меню
Для хранения контента и контактов студентов подключили базу данных sqlite3. Данная база данных простая встроенная база данных для бота, позволяет очень быстро производить чтение — запись, не требует отдельного сервера т.к. реализована через один файл [8].
Для удобного переноса и расположении на удаленном сервере, а также локальной разработки применялся инструмент по работе с контейнерами Docker (https://www.docker.com/) [3]. В качестве редактора кода использовался Sublime Text.
В образовательных заведениях немаловажным процессом является предоставление актуальной информации о доступных курсах, на которые ведется запись. А также индивидуальный подбор курсов и их реклама. В рамках представленной работы описаны анализ и проектирование системы, позволяющей любому образовательному учреждению разработать и внедрить собственного чат — бота для продвижения обучения востребованным IT — профессиям, с помощью интерактивного тестирования и
рекламы. Аналогичные технологии могут быть эффективными как самостоятельно, так и при интеграции в другие информационные системы учебного заведения, например, сайты, внутренние порты и т.д.
В результате исследования было разработано программное обеспечение чат -бот, а также модуль администрирования по методологии разработки ПО Agile. В данный момент степень внедрения находится на этапе тестирования, модуль работает.
Использование программного обеспечения может осуществляться везде, где есть сеть интернет, для него не требуется подключения никаких дополнительных устройств.
Разработка чат-бота направлена для помощи выбора подходящего курса обучения по дополнительным программам. Основная аудитория, которая будет пользоваться данным ПО это будущие слушатели / студенты отдела дополнительного IT- образования, а также люди, которые нуждаются в новой профессии и ищут краткую информации об обучении.
1. Документация Telegram: боты. [Электронный ресурс] — Режим доступа: https://tlgrm.ru/docs/bots
2. Гниденко, И. Г. Технология разработки программного обеспечения: учеб. пособие для СПО / И. Г. Гниденко, Ф. Ф. Павлов, Д. Ю. Федоров. — М. : Издательство Юрайт, 2017. — 235 с.
3. Моуэт Э., Использование Docker / пер. с англ. А. В. Снастина; науч. ред. А. А. Маркелов. -М.: ДМК Пресс, 2017. — 354 с.
4. Рассел, Джесси Гибкая методология разработки / Джесси Рассел. — М.: VSD, 2017. — 179 c.
5. Рынок чат-ботов в цифрах и фактах. Инфографика // Журнал ПЛАС [Электронный ресурс] URL: https://plusworld.ru/daily/tehnologii/403076-2/ (дата обращения: 2.05.2022).
6. Chatbot Rank 2021 [Электронный ресурс] / URL: https://www.markswebb.ru/report/chatbot-rank-2021 /#rejection
7. Aarthi Ganitha N., Vaishnavee V., Oviya K., Jayaseelan J. Salem. Implementation of Chatbot in Trading Application Using SQL and Python // Bioscience Biotechnology Research Communications, 2020. Vol. 13. No. 2. Pp. 111-115.
8. Documentation SQLite3 [Электронный ресурс] / URL: https://www.sqlite.org/docs.html
9. Ho C. Chun, Lee H. L., Lo W. K., Lui K. F. A. Developing a Chatbot for College Student Programme Advisement // International Symposium on Educational Technology (ISET). 2018. Pp. 52-56.
10. Skjuve M., Folstad A., Fostervold K. I., Brandtzaeg P. B. My Chatbot Companion — a Study of Human-Chatbot Relationships. International Journal of Human-Computer Studies, 2021, Vol. 149, May, 102601.