Как написать Telegram бота: практическое руководство

6 Апрель 2016 , Python, 455360 просмотров, How To Create a Telegram Bot Using Python
В последнее время Telegram у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной из основных «фишек» Telegram является его якобы защищённость — по словам Павла Дурова вся переписка между пользователями шифруется. Более того, ни одна спец.служба мира не будет иметь доступ к вашим сообщениям. Но в данной статье речь не об этом. Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода Telegram ботах (github бот, например), мессенджер открыл своё API для разработчиков, и теперь каждый может создать своего собственного бота с блэкджеком и плюшками.
В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы «запилим» полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.
Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую Python библиотеку, реализующую все основные функции ботов — telepot. Как я уже упоминал ранее, для того, чтобы обслуживать пользователей нашего бота мы будет разрабатывать веб-приложение, используя Django фреймворк.
Как создать Telegram бота?
Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:
- Необходимо установить приложение Telegram на телефон или компьютер. Скачать приложение можно тут
- Добавляем к себе в контакт-лист бота с именем BotFather
- Запускаем процедуру «общения» с ботом нажатием кнопки Start. Далее перед нами предстанет список команд точно как на скриншоте.
- Для того, чтобы создать нового бота необходимо выполнить команду /newbot и следовать инструкциям. Обратите внимание, что username для бота должен всегда содержать в конце слово bot. Например, DjangoBot или Django_bot.

- Для нашего бота я выбрал имя PythonPlanetBot, так как его основная функция заключается в парсинге RSS feed сайта Python Planet и выдача информации о последних постах пользователю 🙂

После создания бота, обратите внимание на строку с текстом:
Use this token to access the HTTP API:
За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:
- Присвоить боту описание
- Установить аватар
- Поменять token
и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.
Приступаем к кодированию
Как я ранее уже упоминал, мы будем писать веб-приложение на Django. Но стоит отметить, что это делать необязательно. Можно обойтись и обычным Python скриптом, правда в этом случае необходимо будет периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates) и увеличивая offset для получения самых последних данных без повторений. В Telegram существует два взаимоисключающих метода получения команд/сообщений для вашего бота.
- Использование вызова API метода getUpdates
- Установка Webhook
Установка Webhook заключается в передаче боту специального URL адреса на который будет поступать POST запрос каждый раз, когда кто-то начнёт посылать сообщения боту. Именно этот вариант мы и будем использовать для взаимодействия между ботом и его пользователем. Для того, чтобы задать URL, необходимо использовать API метод setWebhook. Отмечу, что URL должен начинаться с https, то есть иметь защищённое SSL соединение с валидным сертификатом. Telegram разрешает использовать самоподписанный сертификат, правда для этого необходимо в методе setWebhook передавать также публичный ключ в PEM формате (ASCII base64). Либо же можно получить валидный бесплатный SSL сертификат от Let’s Encrypt.
Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.
Итак, вернёмся к python библиотеке для работы с Telegram — telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:
pip install telepot
Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:
import telepot token = '123456' TelegramBot = telepot.Bot(token) print TelegramBot.getMe()
Переменной token присваиваем значение токена, полученного при создании бота через BotFather. В итоге после выполнения этих команд мы получим:
Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.
Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

TelegramBot.getUpdates() [, u'message_id': 1, u'chat': >, u'update_id': 649179764>]
Процесс общения с telegram ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список/массив из объектов типа Update. Внутри Update находится объект Message. Для стандартного взаимодействия с ботом нас фактически интересует именно объект Message, у которого мы считываем атрибут text, хранящий в себе текст, переданный боту и объект chat, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве offset параметра при вызове метода getUpdates. То есть update_id+1 вернёт все сообщения, поступившие после последнего update_id, при этом все предыдущие сообщения будут удалены.
TelegramBot.getUpdates(649179764+1) [, u'message_id': 13, u'chat': >, u'update_id': 649179765>]
На этапе написания простейшего Telegram бота нам этих вызовов достаточно. Приступим к написанию Django приложения для обслуживания наших пользователей.
Простая функция парсинга RSS фида Planet Python выглядит вот так:
# -*- coding: utf8 -*- from xml.etree import cElementTree import requests def parse_planetpy_rss(): """Parses first 10 items from http://planetpython.org/rss20.xml """ response = requests.get('http://planetpython.org/rss20.xml') parsed_xml = cElementTree.fromstring(response.content) items = [] for node in parsed_xml.iter(): if node.tag == 'item': item = <> for item_node in list(node): if item_node.tag == 'title': item['title'] = item_node.text if item_node.tag == 'link': item['link'] = item_node.text items.append(item) return items[:10]
Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django «вьюшка» выглядит следующим образом:
TOKEN = '' TelegramBot = telepot.Bot(TOKEN) def _display_help(): return render_to_string('help.md') def _display_planetpy_feed(): return render_to_string('feed.md', ) class CommandReceiveView(View): def post(self, request, bot_token): if bot_token != TOKEN: return HttpResponseForbidden('Invalid token') commands = < '/start': _display_help, 'help': _display_help, 'feed': _display_planetpy_feed, >try: payload = json.loads(request.body.decode('utf-8')) except ValueError: return HttpResponseBadRequest('Invalid request body') else: chat_id = payload['message']['chat']['id'] cmd = payload['message'].get('text') # command func = commands.get(cmd.split()[0].lower()) if func: TelegramBot.sendMessage(chat_id, func(), parse_mode='Markdown') else: TelegramBot.sendMessage(chat_id, 'I do not understand you, Sir!') return JsonResponse(<>, status=200) @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(CommandReceiveView, self).dispatch(request, *args, **kwargs)
CommandReceiveView ждёт POST запрос на себя, парсит его и отвечает исходя из заданной команды. Полноценное Django приложение можно найти по этой ссылке. Стоит отметить в коде использование ещё одного API вызова — sendMessage. Этот метод отправляет сообщение заданному пользователю, используя при этом chat_id и сам текст сообщения. Chat_id — это уникальный идентификатор чата между пользователем и ботом (его идентификатор есть в ответе на запрос getUpdates). У Telegram ботов есть одно ограничение, они не могут посылать сообщения пользователям, которые предварительно не инициировали общение с ним. По-видимому это сделано дабы избежать массового создания спам-ботов.
Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь 🙂
Итак, веб-приложение на Django запущено. Как же начать тестировать бота? А всё очень просто — необходимо симулировать действия Telegram сервиса. Для этого нам понадобится HTTP клиент и тело запроса. В качестве HTTP клиента я часто использую Chrome плагин под названием Postman, а тело запроса мы возьмём напрямую из данных, полученных с помощью API вызова getUpdates.
После запуска runserver, URL на который необходимо посылать запрос выглядит следующим образом:
http://127.0.0.1:8000/planet/b. BOT_TOKEN/
где BOT_TOKEN — это токен нашего бота. Смотрим скриншот:


А давайте-ка отправим команду feed для получения списка новостей из Planet Python:


На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.
Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.
Интересные записи:
- Почему Python?
- Введение в logging на Python
- Работа с MySQL в Python
- Руководство по работе с HTTP в Python. Библиотека requests
- Обзор Python 3.9
- Что нового появилось в Django Channels?
- Celery: начинаем правильно
- Pyenv: удобный менеджер версий python
- Django Channels: работа с WebSocket и не только
- FastAPI, asyncio и multiprocessing
- Авторизация через Telegram в Django и Python
- Введение в pandas: анализ данных на Python
- Работа с PostgreSQL в Python
- Python-RQ: очередь задач на базе Redis
- Разворачиваем Django приложение в production на примере Telegram бота
- Django, RQ и FakeRedis
- Итоги первой встречи Python программистов в Алматы
- Обзор Python 3.8
- Интеграция Trix editor в Django
- Участие в подкасте TalkPython
- Строим Data Pipeline на Python и Luigi
- Авторизация через Telegram в Django приложении
- Видео презентации ETL на Python
Создание бота с помощью Python и Telegram
Некоторые мессенджеры, такие как Telegram, иногда предоставляют API, который можно использовать для создания бота. Боты — это полезная в хозяйстве вещь. Например — хороший способ взаимодействия с приложениями, работающими на вашем домашнем сервере, без заморочек (в плане безопасности) с открытием директорий, проброса и подобной нездоровой фигни. Данный тип ботов легко написать, и они очень универсальны. В этой статье я покажу, как создать бота с помощью Python и Telegram.
Создание бота с помощью Python и Telegram
Недавно мне пришлось подавать документы на визу, а чтобы записаться на прием, нужно зайти на правительственный сайт и постоянно мониторить появление свободных мест. В этом деле надо быть шустрым, чтобы успеть, так как квоты разлетаются, как горячие бабушкины пирожки.
Поэтому я решил написать бота, который перемещается по формам каждые 10 минут и в случае появления изменений отправляет мне сообщение в Telegram.
Бот состоит из двух частей:
- Код для взаимодействия с Selenium WebDriver.
- Оповещения об изменениях через Telegram.
Для начала нужно скачать с сайта Selenium WebDriver один драйвер для браузера:

Затем используем библиотеку Splinter, которая абстрагирует взаимодействие с драйвером.
from splinter import Browser
with Browser ( ) as browser :
browser . visit ( «http://www.google.com» )
# Find and fill out the search form.
browser . find_by_name ( ‘q’ ) . fill ( ‘splinter’ )
# Find and click the ‘search’ button.
button = browser . find_by_name ( ‘btnK’ ) . click ( )
# Check for result on the page.
if browser . is_text_present ( ‘splinter.readthedocs.io’ ) :
print ( «Yes, the official website was found!» )
print ( «No, it wasn’t found. » )
Чтобы запустить код, сначала запустите ранее загруженный драйвер, а затем запустите приложение Python.
Теперь, когда у нас есть скрипт, который мониторит изменения на сайте, нам нужен способ получения уведомлений. Чтобы создать бота Telegram, нам понадобится токен. Для получения токена воспользуемся ботом BotFather.

После отправления команды / newbot , BotFather предложит придумать имя бота, а затем предоставит токен.
Здесь я обернул библиотеку python-telegram-bot в класс только для того, чтобы при необходимости было проще перейти на другое решение, но вы можете пропустить это и использовать библиотеку напрямую.
import telegram
class Telegram :
def __init__ ( self , token : str ) :
self . bot = telegram . Bot ( token = token )
self . offset = 0
def send ( self , chat_id , message ) :
self . bot . send_message ( chat_id = chat_id , text = message )
Добавьте бота в группу.
Ссылка для получения обновлений бота:
https : //api.telegram.org/bot/getUpdates
https : //api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
Найдите объект chat :
«update_id» : 8393 ,
«message_id» : 3 ,
«first_name» : «AAA»
«date» : 25497 ,
«new_chat_participant» : <
"first_name" : "NAME" ,
"username" : "YOUR_BOT_NAME"
Мы можем отправлять сообщения с помощью своего бота, но мы также можем получать сообщения. И это открывает широкий спектр возможностей для различных интересных проектов. Используя Telegram в качестве моста для связи с вашими приложениями, вам не нужно предоставлять их напрямую в Интернет или иметь дело с пробросом портов и изменениями IP или динамической настройкой DNS.
Кстати, не так давно, я написал небольшого бота, который слушает команду / lotto . Затем бот отвечает случайно сгенерированными номерами лотереи. Поэтому я оставил бота работающим в контейнере Docker и мог взаимодействовать с ним с помощью мобильного телефона.
Создавать ботов — интересное занятие. В данной статье для создания бота я использовал Python и Telegram, но в прошлом я также использовал Slack bot API для взаимодействия с домашней сигнализацией.
РЕКОМЕНДУЕМ:
- Используем Телеграм-боты для пробива
- Парсинг телеграм каналов и чатов своими руками
Как создать Telegram-бота с помощью библиотеки python-telegram-bot

Делимся инструкцией, как написать бота с помощью библиотеки python-telegram-bot за считанные минуты. На примере гайда от программиста Давида Мастроматтео.
Курс Стратегический маркетинг.
Від хаосу до системного маркетингу разом із Тетяною Лукинюк, B2C-директором у Kyivstar, колишнім CMO у Coca-Cola, Mars Ukraine та генеральною директоркою у Red Bull Ukraine.
Установка python-telegram-bot
Для создания бота понадобится пакет python-telegram-bot — оболочка для API от Telegram. Написать бота с помощью этой библиотеки очень просто, так как она полностью совместима с Python 3.6+.
Первое, что нужно сделать — установить python-telegram-bot. Вот ссылка на официальную документацию библиотеки .
$ pip install python-telegram-bot –upgrade
Создание бота
Теперь можно взяться за создание бота. Для этого даже не нужно писать код. Перейдите в Telegram и найдите канал @BotFather, который отвечает за регистрацию новых ботов. Начните общаться с ботом и введите команду /newbot . Затем BotFather спросит у вас имя и юзернейм.
Курс Комерційний директор.
Зосередження на практичних завданнях та послідовному аналізі проектів замість великої теорії. Реалізуй свої мрії про керівну посаду після завершення курсу.


У BotFather можно запросить много других интересных вещей. Например, изменить изображение профиля бота.
Теперь нужно принять важное решение: определиться с главной задачей бота. В этой инструкции мы сделаем бота, который предоставляет информацию о биоритмах пользователей . Будьте осторожны: речь идет о псевдонаучных теориях, так что б от будет такой же полезный, как и гороскопы. Но если дойдете до конца — сможете создавать любых ботов.
Освоить язык программирования Python вам могут помочь онлайн курсы от наших партнеров Mate Academy и Powercode. Получите качественный уровень знаний от практикующих специалистов.
Программирование бота
Пакет python-telegram-bot состоит из оболочки API Telegram. Этот инструмент доступен через telegram.Bot- классы. Помимо них, есть еще модуль telegram.ext , который значительно упростит работу.
Модуль telegram.ext содержит много классов, но самые важные — telegram.ext.Updater и telegram.ext.Dispatcher . Updater отвечает за выборку новых обновлений от Telegram. Также он передает их в Dispatcher , после чего они обрабатываются с помощью Handler .
Приступим к программированию:
# mastrobot_example.py from telegram.ext import Updater, CommandHandler, MessageHandler, Filters # function to handle the /start command def start(update, context): update.message.reply_text('start command received') # function to handle the /help command def help(update, context): update.message.reply_text('help command received') # function to handle errors occured in the dispatcher def error(update, context): update.message.reply_text('an error occured') # function to handle normal text def text(update, context): text_received = update.message.text update.message.reply_text(f'did you said "" ?') def main(): TOKEN = "insert here your token and don't share it with anyone!" # create the updater, that will automatically create also a dispatcher and a queue to # make them dialoge updater = Updater(TOKEN, use_context=True) dispatcher = updater.dispatcher # add handlers for start and help commands dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("help", help)) # add an handler for normal text (not commands) dispatcher.add_handler(MessageHandler(Filters.text, text)) # add an handler for errors dispatcher.add_error_handler(error) # start your shiny new bot updater.start_polling() # run the bot until Ctrl-C updater.idle() if __name__ == '__main__': main()
В функции main создан класс Updater , который автоматически сгенерировал объект Dispatcher , доступный через .dispatcher- свойства класса Updater .
Добавьте несколько обработчиков:
-
команда /start вызывает функцию start() , которая отвечает пользователю информативным сообщением;
Курс Микросервисная архитектура.
програма, яка допоможе опанувати головні принципи розробки мікросервісної архітектури, щоби ви могли проєктувати незалежні сервіси, а потім інтегрувати їх в одну систему. Практики буде багато.
Сейчас в коде прописаны функции обратного вызова, которые используют полученные данные для отправки сообщений пользователю.
Тестирование
Теперь можно протестировать бота. Запустите его.
Пошлите ему команду /start .
Ура, бот работает!
Но это не конец. Надо создать бота, который сообщает пользователю его ежедневный биоритм. Для этого следует применить команду /start . С ее помощью при запуске чата можно получить данные о дне рождения пользователя. Затем надо создать функцию для обработки новой команды /biorhythm , чтобы отправить ответ пользователю с его личным биоритмом.
Чтобы узнать день рождения пользователя, для начала нужно изменить функцию, обрабатывающую команду /start . Чтобы упростить задачу, попросите пользователя указать год, месяц и день рождения.
Курс Python.
Цю мову програмування використовують від базових концепцій до складних застосувань у сферах штучного інтелекту. Після проходження курсу гарантовано отримай роботу в ІТ.
# function to handle the /start command def start(update, context): first_name = update.message.chat.first_name update.message.reply_text(f"Hi , nice to meet you!") start_getting_birthday_info(update, context)
В параметре update можно найти полезную информацию о пользователе, например, его имя.
В самом начале скрипта определите новую переменную STATE , которая нужна, чтобы понять, на какой вопрос отвечает пользователь.
STATE = None BIRTH_YEAR = 1 BIRTH_MONTH = 2 BIRTH_DAY = 3
Теперь необходимо реализовать функцию start_getting:_birthday_info() , она вызывается с помощью команды start() . После запуска вы получите информацию о дне рождения от пользователя.
def start_getting_birthday_info(update, context): global STATE STATE = BIRTH_YEAR update.message.reply_text(f"I would need to know your birthday, so tell me what year were you born in. ")
Для переменной STATE устанавливается значение BIRTH_YEAR , чтобы после ответа пользователя было понятно, что вопрос касался года рождения. Затем отправляется сообщение, чтобы узнать год рождения.
Теперь пользователь ответит обычным текстом, поэтому нужно изменить функцию text() .
def text(update, context): global STATE if STATE == BIRTH_YEAR: return received_birth_year(update, context) if STATE == BIRTH_MONTH: return received_birth_month(update, context) if STATE == BIRTH_DAY: return received_birth_day(update, context)
В функции text() необходимо понять, на какой вопрос отвечает пользователь, используя переменную STATE . После чего остается вызвать функцию для обработки каждого ответа.
Эти функции можно записать так:
def received_birth_year(update, context): global STATE try: today = datetime.date.today() year = int(update.message.text) if year > today.year: raise ValueError("invalid value") context.user_data['birth_year'] = year update.message.reply_text(f"ok, now I need to know the month (in numerical form). ") STATE = BIRTH_MONTH except: update.message.reply_text("it's funny but it doesn't seem to be correct. ") def received_birth_month(update, context): global STATE try: today = datetime.date.today() month = int(update.message.text) if month > 12 or month < 1: raise ValueError("invalid value") context.user_data['birth_month'] = month update.message.reply_text(f"great! And now, the day. ") STATE = BIRTH_DAY except: update.message.reply_text("it's funny but it doesn't seem to be correct. ") def received_birth_day(update, context): global STATE try: today = datetime.date.today() dd = int(update.message.text) yyyy = context.user_data['birth_year'] mm = context.user_data['birth_month'] birthday = datetime.date(year=yyyy, month=mm, day=dd) if today - birthday < datetime.timedelta(days=0): raise ValueError("invalid value") context.user_data['birthday'] = birthday STATE = None update.message.reply_text(f'ok, you born on ') except: update.message.reply_text("it's funny but it doesn't seem to be correct. ")
Когда получен год рождения пользователя, остается проверить, допустимое ли это значение. Если да, то оно сохраняется в словаре context.user_data[] . Продолжайте устанавливать значения для переменной STATE и задавать следующие вопросы.
Когда зададите последний вопрос и будете знать день рождения, создайте переменную даты и сохраните ее в context.user_data[] словаре.
Если пользователь вводит недопустимое значение, то получает ответ, что оно неверно. Значение переменной STATE не меняется, поэтому пользователь застревает на этом вопросе, пока не ответит правильно.
Получить новые знания в языке программирования Python вам могут помочь специальные курсы от Hillel и ШАГ . Получите качественный уровень знаний от практикующих специалистов.
Создание команды
Теперь нужно обработать команду /biorhythm .
Добавьте новый обработчик команд в функцию main() .
Напишите функцию расчета биоритма:
# This function is called when the /biorhythm command is issued def biorhythm(update, context): user_biorhythm = calculate_biorhythm( context.user_data['birthday']) update.message.reply_text(f"Phisical: ") update.message.reply_text(f"Emotional: ") update.message.reply_text(f"Intellectual: ") def calculate_biorhythm(birthdate): today = datetime.date.today() delta = today - birthdate days = delta.days phisical = math.sin(2*math.pi*(days/23)) emotional = math.sin(2*math.pi*(days/28)) intellectual = math.sin(2*math.pi*(days/33)) biorhythm = <> biorhythm['phisical'] = int(phisical * 10000)/100 biorhythm['emotional'] = int(emotional * 10000)/100 biorhythm['intellectual'] = int(intellectual * 10000)/100 biorhythm['phisical_critical_day'] = (phisical == 0) biorhythm['emotional_critical_day'] = (emotional == 0) biorhythm['intellectual_critical_day'] = (intellectual == 0) return biorhythm
В примере представлены две разные функции: одна для обработки команды, а другая для расчета биоритма. Таким образом удается разделить ответственность этих функций.
Полный код бота
# mastrobot_example2.py import datetime import math from telegram.ext import Updater, CommandHandler, MessageHandler, Filters STATE = None BIRTH_YEAR = 1 BIRTH_MONTH = 2 BIRTH_DAY = 3 # function to handle the /start command def start(update, context): first_name = update.message.chat.first_name update.message.reply_text(f"Hi , nice to meet you!") start_getting_birthday_info(update, context) def start_getting_birthday_info(update, context): global STATE STATE = BIRTH_YEAR update.message.reply_text( f"I would need to know your birthday, so tell me what year were you born in. ") def received_birth_year(update, context): global STATE try: today = datetime.date.today() year = int(update.message.text) if year > today.year: raise ValueError("invalid value") context.user_data['birth_year'] = year update.message.reply_text( f"ok, now I need to know the month (in numerical form). ") STATE = BIRTH_MONTH except: update.message.reply_text( "it's funny but it doesn't seem to be correct. ") def received_birth_month(update, context): global STATE try: today = datetime.date.today() month = int(update.message.text) if month > 12 or month < 1: raise ValueError("invalid value") context.user_data['birth_month'] = month update.message.reply_text(f"great! And now, the day. ") STATE = BIRTH_DAY except: update.message.reply_text( "it's funny but it doesn't seem to be correct. ") def received_birth_day(update, context): global STATE try: today = datetime.date.today() dd = int(update.message.text) yyyy = context.user_data['birth_year'] mm = context.user_data['birth_month'] birthday = datetime.date(year=yyyy, month=mm, day=dd) if today - birthday < datetime.timedelta(days=0): raise ValueError("invalid value") context.user_data['birthday'] = birthday STATE = None update.message.reply_text(f'ok, you born on ') except: update.message.reply_text( "it's funny but it doesn't seem to be correct. ") # function to handle the /help command def help(update, context): update.message.reply_text('help command received') # function to handle errors occured in the dispatcher def error(update, context): update.message.reply_text('an error occured') # function to handle normal text def text(update, context): global STATE if STATE == BIRTH_YEAR: return received_birth_year(update, context) if STATE == BIRTH_MONTH: return received_birth_month(update, context) if STATE == BIRTH_DAY: return received_birth_day(update, context) # This function is called when the /biorhythm command is issued def biorhythm(update, context): print("ok") user_biorhythm = calculate_biorhythm( context.user_data['birthday']) update.message.reply_text(f"Phisical: ") update.message.reply_text(f"Emotional: ") update.message.reply_text(f"Intellectual: ") def calculate_biorhythm(birthdate): today = datetime.date.today() delta = today - birthdate days = delta.days phisical = math.sin(2*math.pi*(days/23)) emotional = math.sin(2*math.pi*(days/28)) intellectual = math.sin(2*math.pi*(days/33)) biorhythm = <> biorhythm['phisical'] = int(phisical * 10000)/100 biorhythm['emotional'] = int(emotional * 10000)/100 biorhythm['intellectual'] = int(intellectual * 10000)/100 biorhythm['phisical_critical_day'] = (phisical == 0) biorhythm['emotional_critical_day'] = (emotional == 0) biorhythm['intellectual_critical_day'] = (intellectual == 0) return biorhythm def main(): TOKEN = "insert here your token and don't share it with anyone!" # create the updater, that will automatically create also a dispatcher and a queue to # make them dialoge updater = Updater(TOKEN, use_context=True) dispatcher = updater.dispatcher # add handlers for start and help commands dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("help", help)) # add an handler for our biorhythm command dispatcher.add_handler(CommandHandler("biorhythm", biorhythm)) # add an handler for normal text (not commands) dispatcher.add_handler(MessageHandler(Filters.text, text)) # add an handler for errors dispatcher.add_error_handler(error) # start your shiny new bot updater.start_polling() # run the bot until Ctrl-C updater.idle() if __name__ == '__main__': main()
Пришло время проверить его:

Поздравляем! Telegram-бот на Python полностью готов.
Бот, созданный для примера, был сохранен. Его можно протестировать по имени пользователя @mastro35_mastrobot.
РАЗРАБОТКА ЧАТ-БОТА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ 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.