Как написать простого бота для ВК и Телеграм / Хабр
Мы уже упоминали, как мы предоставляем бесплатные VPS для студентов, чтобы они учились программировать. Один из наших подопечных Павел сделал простеньких телеграм и ВК ботов для FAQ. Они очень простые, тем не менее, начинающему программисту не помешают комментарии опытных ребят — поэтому публикуем его рассказ — Павел будет рад, если в комментариях ему дадут советы.
Я — студент Новосибирского Государственного Технического Университета, не так давно мы с парочкой моих друзей реализовали площадку для продвижения проектов во всех возможных областях научной деятельности. Мы помогаем «сводить» заинтересованных преподавателей и студентов всех ВУЗов Сибири, чтобы проектная научная деятельность развивалась по территории Сибири и РФ.
Студенты и преподаватели часто обращались ко мне с вопросами и я решил автоматизировать этот процесс, написав ботов для ВК и Телеграм.
На вход они принимают сообщения, а на выходе выдают либо текстовый ответ, либо специальную структуру данных, замаскированное под сообщение: инлайновые или висячие клавиатуры.
Я использовал Python версии 3.6 просто потому, что он самый простой для меня. Кодил в PyCharm Community Edition. Весь код опубликован на GitHub. Удачи!
1. Предварительные приготовления для телеграм-бота
1.1 Получение токена от BotFather в телеграмме
Первым делом, нам нужно «зарегистрировать» нашего бота в Telegram.
Для этого, в поисковике телеги ищем BotFather
далее, делаем всё также, как на скриншотах:
После нажимаем на команду /newbot
или же прописываем вручную.
Надо придумать уникальное имя для бота, придумываем и получаем соответствующий токен.
1.2 Переходим в любой редактор кода и создаем файл config.py
Перед созданием данного файла, нам нужно выбрать директорию, в которой будет реализован весь функционал бота. Если вы используете PyCharm Community/Professional Edition, то предлагаю просто создать новый проект, и писать там весь функционал бота.
Если Вы используете любой другой редактор, такой как Sublime Text 3, например, то Вам самостоятельно придётся создать директорию, создать виртуальное окружение, и работать из консоли со всеми предварительными тестами. Во избежание трудностей, предлагаю скачать продукт PyCharm Community Edition от компании JetBrains, с помощью данного продукта можно обойти действия, описанные в предыдущем абзаце, так как данный продукт сделает их самостоятельно, от Вас потребуется только указать путь до интерпретатора Python в конфигурациях PyCharm, с помощью которого и будет работать Ваш бот.
В данном файле (config.py) будет храниться только токен, который нам дал BotFather, поэтому пишем:
token = "Здесь хранится Ваш токен".
1.3 Cоздаём главный файл — bot.py
Делаем cледующие импорты и для соответствующих библиотек, в консоли прописываем закоментированные строчки:
import config
import telebot # pip install telebot
from telebot import types # pip install pyTelegramBotAPI
Далее, нам необходимо использовать наш токен:
bot = telebot.TeleBot(config.token)
Этими действиям мы устанавливаем то, что мы будем накручивать функционал именно для того бота, для которого нам и дал токен BotFather.
2. Разворачиваем функционал
Начнём с того, что для того, чтобы пользователю запустить бота, нам необходимо прописать команды для старта они могут быть разными, например,
/start
или
/go
и вообще любыми, какие Вы сочтёте нужными.
Для обработки команд нам потребуется message_handler
, с помощью которого и будет реализован весь функционал обработки команд для старта и завершения, если Вы сочтёте нужным добавить завершение. Как только придёт команда /go
или /start
, message_handler
с соответствующими командами сравнит, совпадают ли строки и если совпадают, то обработает соответствующей функцией.
Каждая функция, как и в примере сейчас, должна принимать один параметр — сообщение от пользователя, которое будет обработано соответствующей функции «в обёртке» декоратора. А также, каждая функция (или связка функций) должна возвращать соответсвующее сообщение от бота.
Итак:
@bot.message_handler(commands=['go', 'start']) # Обработка команды для старта def welcome(message): sti = open(path+'stiker.tgs', 'rb') bot.send_sticker(message.chat.id, sti) markup = types.ReplyKeyboardMarkup(resize_keyboard=True) item3 = types.KeyboardButton("Приложения") item2 = types.KeyboardButton("Мероприятия") item1 = types.KeyboardButton('О нас') markup.add(item1, item2, item3) bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\\n\\nЯ - <b>{1.first_name}</b>, бот команды Projector в НГТУ, " "создан для того, " "чтобы помочь Вам влиться в нашу команду," "просто узнать что-то о нас или же просто пообщаться и весело провести время.\\n\\n" "<i>Have a nice time</i>".format( message.from_user, bot.get_me()), parse_mode='html', reply_markup=markup)
В этой функции реализовано сразу два действия: отправка приветственного сообщения и создание встроенной клавиатуры —
ReplyKeyboardMarkup
, которая будет открыта, пока мы не завершим выполнения бота соответсвующей командой. Об этом будет сказано ниже.
Итак, пройдёмся по строчкам:
В строках 20-21: открывается стикер по тому пути к директории, в которой я его сохранил, после чего отправляется.
Строки 22-28: создаем встроенную клавиатуру, добавляя туда три элемента.
Строки 30-37: описано создание и отправка приветственного сообщения
Как вы можете заметить, метод send_message
в строке 30, позволяет использовать HTML, для форматирования текста.
Строками ниже, добавим запуск самого бота, который будет хоститься, пока не случится ошибка или же, пока мы Сами его не закроем.
# RUN if __name__ == "__main__": try: bot.polling(none_stop=True) except ConnectionError as e: print('Ошибка соединения: ', e) except Exception as r: print("Непридвиденная ошибка: ", r) finally: print("Здесь всё закончилось")
Сделаем первый запуск! Для этого, в PyCharm-е нажмём зеленую кнопку старт в правом верхнем углу или же, можно запустить из консоли командой: python
bot.pyРезультат первого запуска:
2.1 Обработка нажатия на кнопки и создание inline keyboard
Так как любое сообщение — это текст, то мы будем обрабатывать именно текстовые сообщения.
Сделаем следующее и аналогично разберём по строчкам:
@bot.message_handler(content_types=["text"]) def go_send_messages(message): if message.chat.type == 'private': if message.text == 'Приложения': keyboard = types.InlineKeyboardMarkup(row_width=1) itemboo = types.InlineKeyboardButton(text="Тыщ на кнопку и ты уже в Google", url="<https://www.google.ru>") itemboo1 = types.InlineKeyboardButton('Рандомное число', callback_data='good2') itemboo2 = types.InlineKeyboardButton("Калькулятор", callback_data='bad2') itemboo3 = types.InlineKeyboardButton("Хочу узнать погоду в моем городе/стране", callback_data='good3') itemboo4 = types.InlineKeyboardButton("Как твои дела?", callback_data='bad4') keyboard.add(itemboo, itemboo1, itemboo2, itemboo3, itemboo4) bot.send_message(message.chat.id, "{0.first_name}, окей, смотри, что у нас есть тут:\\n".format(message.from_user), reply_markup=keyboard) elif message.text == "Мероприятия": one_markup = types.InlineKeyboardMarkup(row_width=1) ite1 = types.InlineKeyboardButton("Ближайшие мероприятия", callback_data="one") ite2 = types.InlineKeyboardButton("Проведенные мероприятия", callback_data="two") ite3 = types.InlineKeyboardButton("Волонтерство на мероприятие", callback_data="three") ite4 = types.InlineKeyboardButton("Действующие проекты в НГТУ", callback_data="fourth") ite5 = types.InlineKeyboardButton("Мероприятия Межвузовского центра", callback_data="five") one_markup.add(ite1, ite2, ite3, ite4, ite5) bot.send_message(message.chat.id, "{0.first_name}, у нас <u>ежемесячно</u> проводится множество " "мероприятий,\\nмы постарались разбить их на следующие составляющие:".format( message.from_user), parse_mode="html", reply_markup=one_markup)
Строка 339 — обработчик любых текстовых сообщений
Строка 341 предназначена для того, чтобы сказать, что если данное сообщение предназначено боту, то сравни эту строку с теми, что здесь обрабатываются и отправь ответ.
Строки 344 — 351 — создаём инлайновую клавиатуру InlineKeyboardMarkup и помещаем в эту клавиатуру 5 элементов, которые также можно будет обработать по установленной
. Элементы данной клавиатуры будут расположены друг под другом, так как в строке 344, мы установили row_width = 1
, что обозначает самую широкую грань одной кнопки, поэтому они и будут расположены друг под другом.
Строки 353-355 — отправляют текст, вместе с нашей Inline Keyboard.
В условиях ниже представлены аналогичные представления обработки сообщений.
Итак, сделаем запуск:
2.2 Обработка InlineKeyboardButton
Как было сказано выше, каждый элемент
InlineKeyboardButton
имеет параметр
callback_data
, и именно по этим параметрам будет обрабатываться каждая кнопка. Для этого нам потребуется обработчик инлайновой клавиатуры
callback_query_handler
.
@bot.callback_query_handler(func=lambda call: call.data in ['one', 'two', 'three', 'fourth', 'five']) # Мероприятия
def callback_inline_one(call):
try:
if call.message:
if call.data == 'one': # Ближайшие мероприятия
bot.send_message(call.message.chat.id,
"Итак,<b>ближайшие мероприятия</b>:\\n\\n" # Здесь будут ссылки ещё
"Форум «Байкал»\\n"
"Конкурс «Цифровой ветер»\\n"
"PRONETI", parse_mode="html")
elif call.data == 'two': # Проведённые мероприятия
bot.send_message(call.message.chat.id, "Вот список <b>проведённых мероприятий</b>:\\n\\n"
"МНТК\\n"
"Семинары по проектной деятельности\\n"
"Встреча с представителями предприятий", parse_mode="html")
elif call.data == 'three':
Итак, разберём построчно:
Строка 269 — объявляем обработчик, который будет обрабатывать каждую из нажатых кнопок с использованием лямбда-функции
Строки 273-278 — В данном блоке if, мы просто обрабатываем сообщение и отправляем сообщение пользователю.
Строки 279-283 — Делают аналогичное действие, что и в предыдущем условном блоке.
и т. д.
Также, в данных блоках можно определить аналогичную инлайновую клавиатуру, только тогда придётся создать ещё один обработчик callback_data
, аналогичный обработчику callback_query_handler
, показанный на скриншоте выше.
Результат:
Так просто и обрабатываются inline keyboards.
3. Завершаем работу бота
Данная функция будет аналогичной функции обработки команд для старта бота, поэтому Вы сможете легко понять её функционал:
@bot.message_handler(commands=['stop']) # Обработка команды для выхода
def bye(message):
bye_Sti = open(path+'byeMorty.tgs', 'rb')
hideBoard = types.ReplyKeyboardRemove()
bot.send_message(message.chat.id,
"Досвидания, {0.first_name}!\\nМы, команда <b>{1.first_name}</b>, надеемся, что ты хорошо провел(а) время \\n\\n"
"Присоединяйся к нашей команде в <a href='<https://vk.com/projector_neti>'>vk</a>\\n"
"Наш <a href='<https://instagram.com/projector_neti>'>inst</a>\\n\\n"
"Напиши Координатору проектов (<a href='<https://vk.com/nikyats>'>Никите Яцию</a>) и задай интересующие тебя вопросы по <i>проектной деятельности</i>\\n\\n"
"Надеемся, что тебе ответят очень скоро \\n\\n"
"<u>Don't be ill and have a nice day</u> \\n\\n\\n"
"P.S.: Если есть какие-то пожелания или вопросы по боту, то напиши <a href='<https://vk.com/setmyaddresspls>'>мне</a>".format(
message.from_user, bot.get_me()), parse_mode='html', reply_markup=hideBoard)
exit()
Здесь происходит следующее:
- Отправляется прощальный стикер.
- Закрывается встроенная клавиатура (строка 44).
- Отправляется прощальное сообщение.
Так как мы используем
bot.polling
, с параметром
none_stop = True
, то пользователь может снова вознообновить общение с ботом при помощи команды
/start
или
/go
, обработка которых показано в пункте выше.
Результат:
ВК БОТ
Перейдём к реализации бота Вконтакте, написанном на том же родном языке Python, его основное отличие от предыдущего в том, что он был написан с использованием ООП, а именно класса. Внешне, он выполняет ту же миссию. Сама библиотека для написания вк бота намного проще телеграмм бота, поэтому разобраться в ней самостоятельно не составит большого труда. Итак, начнём.
1. Предварительные подготовления
Установим следующие библиотеки по тем же технологиям:
import vk_api # pip install vk-api
import json # pip install json
from vk_api.longpoll import VkLongPoll, VkEventType
▍1.1 Получение токена для сообщества Вконтакте.
- На главной странице сообщества найти раздел «Управление»
- Работа с API
- Создать ключ. Выбираете нужные для вас пункты, которые будут доступны боту.
В итоге должно получиться примерно следующее:
Берем ключ и переходим в среду разработки и делаем следующее:
vk = vk_api.VkApi(token=
"Ваш_токен")
Далее — следующее:
longpoll = VkLongPoll(vk)
На этом, закончим подготавления.
2. Разворачиваем функционал
Первым делом создадим файл
manage.pyCоздадим прототип встроенной клавиатуры ( всё с помощью документации VkBotAPI ).
main_keyboard = {
"one_time": False,
"buttons": [
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"1\\"}",
"label": "О нас"
},
"color": "positive"
}],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"2\\"}",
"label": "Мероприятия"
},
"color": "positive"
},
{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"3\\"}",
"label": "Приложения"
},
"color": "positive"
}
],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"4\\"}",
"label": "Контакты"
},
"color": "primary"
}]
]
}
Затем переводим её в формат json, как требуется в документации:
main_keyboard = json.dumps(main_keyboard, ensure_ascii=False).encode('utf-8')
main_keyboard = str(main_keyboard.decode('utf-8'))
Пример инлайн клавиатуры:
about_us_keyboard = {
"inline": True,
"buttons": [
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"1\\"}",
"label": "Основная информация"
},
"color": "positive"
}],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"2\\"}",
"label": "Чем мы занимаемся ?"
},
"color": "primary"
},
{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"3\\"}",
"label": "Где мы находимся ?",
},
"color": "positive"
}],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"4\\"}",
"label": "Как попасть в команду ?",
},
"color": "primary"
}],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"5\\"}",
"label": "Контакты",
},
"color": "secondary"
}],
[{
"action": {
"type": "text",
"payload": "{\\"button\\": \\"6\\"}",
"label": "Задать вопрос руководителю проекта",
},
"color": "negative"
}]
],
}
Не забываем все используемые клавиатуры переводить в формат json:
about_us_keyboard = json.dumps(about_us_keyboard, ensure_ascii=False).encode('utf-8')
about_us_keyboard = str(about_us_keyboard.decode('utf-8'))
Создадим функцию
write_msg
, для того, чтобы не мучиться с постоянной отправкой сообщений от бота:
def write_msg(user_id, message, key):
vk.method('messages.send',
{'user_id': user_id,
'message': message,
'keyboard': key,
'random_id': random.randint(0, 2048)})
После создания всех прототипов, мы можем перейти к следующему шагу. ( к этому файлу мы позже вернёмся и доработаем обработку общения пользователя и нашего vk-бота )
▍2.1 Основной функционал (создаем файл vk_bot.py)
Мы не будем разрабатывать методы, которые будут выполнять, например, функцию парсинга времени или погоды, назовем их второстепенными. Я покажу лишь основной метод, который будет обращаться к этим второстепенным методам, для обработки тех или иных сообщений от пользователя. В конце статьи я выложу ссылку на свой GitHub, где Вы сможете самостоятельно просмотреть интересующий Вас функционал любого из метода. Итак:
Конструктор класса:
class VkBot:
def __init__(self, user_id):
self.USER_ID = user_id
self._USERNAME = self._get_user_name_from_vk_id(user_id)
self.my_str = ""
self._COMMANDS = ["привет", "погода", "время", "пока"]
self._inputMes = {"основная информация": answers.about_us1,
"чем мы занимаемся ?": answers.about_us2,
"где мы находимся ?": answers.about_us3,
"ближайшие мероприятия": answers.events1,
"проведённые мероприятия": answers.events2,
"волонтёрство на мероприятие": answers.events3,
"действующие проекты в нгту": answers.events4,
"мероприятия межвузовского центра": answers.events5
}
Последнее свойство класса —
inputMes
— это особый словарь, у которого значения ключей — это текст из файла
answers.py, где я расположил текст в виде строк, поэтому, чтобы не загромождать код я и вынес основной текст в другой файл.
(Пример кода из файла answers.py)
events1 = "Итак,ближайшие мероприятия:\\n\\n" \\
"Форум «Байкал»\\n"\\
"Конкурс «Цифровой ветер»\\n"\\
"PRONETI"
events2 = "Вот список проведенных мероприятий:\\n"\\
"МНТК\\n"\\
"Семинары по проектной деятельности\\n"\\
"Встреча с представителями предприятий\\n"\\
events3 = "По поводу этого критерия напиши Илье (<https://vk.com/ki1337ki>)\\n"\\
"А также, ты можешь заполнить анкету, благодаря которой,\\n"\\
"с тобой лично свяжется один из руководителей направления\\n"\\
"или координатор проекта (<https://vk.com/nikyats>)"
Итак, основной метод класса — это
new_message
, который принимает один параметр —
message
, который обрабатывается соответствующим условным блоком и возвращает какое -то значение обратно туда, откуда был вызван.
def _get_user_name_from_vk_id(self, user_id):
request = requests.get("<https://vk.com/id>" + str(user_id))
bs = bs4.BeautifulSoup(request.text, "html.parser")
user_name = self._clean_all_tag_from_str(bs.findAll("title")[0])
return user_name.split()[0]
def new_message(self, message):
# self.my_str = " ".join(re.findall('[0-9]{2}', message))
if message.lower() == self._COMMANDS[0]:
return f"Привет, {self._USERNAME}!"
elif message.lower() == self._COMMANDS[1] or message.lower() == "узнать погоду ":
return self._get_weather()
elif message.lower() == self._COMMANDS[2] or message.lower() == "узнать точное время ":
return self._get_time()
elif message.lower() == self._COMMANDS[3]:
return f"До скорой встречи, {self._USERNAME}!"
else:
for key, value in self._inputMes.items():
if message.lower() == key:
return value
return "Не понимаю тебя "
3. Возвращаемся в manage.py и дописываем функционал
Теперь в первых строках нам необходимо проимпортить файл vk_bot. А также нам потребуется библиотека random.
import random # pip install random
from vk_bot import VkBot
После того, как мы объявили longpoll, дописываем основной функционал.
longpoll = VkLongPoll(vk)
try:
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
if event.to_me:
bot = VkBot(event.user_id)
if event.text.lower() == "о нас":
write_msg(event.user_id, "Немного о нашем проекте", about_us_keyboard)
elif event.text.lower() == "мероприятия":
write_msg(event.user_id, "Что ты хочешь узнать?", events_keyboard)
elif event.text.lower() == "приложения":
write_msg(event.user_id, "Посмотри, что есть здесь!", app_keyboard)
elif event.text.lower() == "контакты":
write_msg(event.user_id, "По любым вопросам можешь обращаться к:", contacts_keyboard)
elif event.text.lower() == "задать вопрос руководителю проекта":
write_msg(event.user_id, "У тебя есть возможность написать сообщение нашему Руководителю проекта",
go_answer)
elif event.text.lower() == "калькулятор":
write_msg(event.user_id, "В разработке...", calc_keyboard)
# elif event.text == " ".join(re.findall('\\d{2}', event.text)):
# write_msg(event.user_id, "Отлично, мы здесь", calc_keyboard)
elif event.text.lower() == "как попасть в команду ?":
write_msg(event.user_id, "Напиши координатору проекта - Никите\\n"
"или перейди на сайт проектной деятельности,\\n"
"найди проект номер 612 и подай заявку", in_team)
else:
write_msg(event.user_id, bot.new_message(event.text), main_keyboard)
except Exception as e:
print(e)
Как можете заметить, в условных блоках if и elif — присутствует обработка тех сообщений, которые подразумевают под собой вывод инлайн или встроенной клавиатуры (в данном примере — выводятся только инлайн клавиатуры). Сюда также можно добавить более сложные обработки сообщений, после которых обработка будет метаться туда сюда по блокам if и elif. Таким образом бот будет работать, пока не «упадёт с ошибкой».
Другое дело обстоит с блоком else, здесь мы обращаемся как раз ко классу нашего Бота, после чего он аналогичным способом находит обработку сообщения и выводит результат. Это можно назвать вложенной обработкой, а так как вложенностей лучше избегать, то лучше использовать тот метод программирования бота, который как раз-таки реализован в телеграмм боте.
Заключение
Надеюсь, что после прочтения данной статьи, Вы как минимум поняли основной принцип создания своего Telegram или Vk бота, а как максимум — легко сможете написать своего бота.
Как вы можете видеть, создать его функционал очень просто, особенно, если вы знаете основы языка Python.
Весь код опубликован в моём профиле GitHub:
Как создать бот собственными силами за пять минут
Боты в мессенджерах – тренд сезона. Они присылают уведомления и новости, заменяют собой колл-центры, играют в игры, в общем, интегрируют в формат чата всевозможные сервисы.
Создать собственный бот можно за несколько минут, причем иногда сделать это можно, даже не зная языков программирования.
У мессенджера Telegram есть специальный бот для создания ботов и управления уже созданными – @BotFather. Просто начните разговаривать с ним и, следуя подсказкам, сделайте несколько простых шагов.
Напишите в окне диалога /newbot для создания нового бота. @BotFather спросит, как новый бот будет называться и какой юзернейм использовать (имя у всех ботов в Telegram должно заканчиваться на «bot»). Дальше предложит добавить описание возможностей бота и юзерпик, а также выдаст уникальный токен, который пригодится в дальнейшей настройке и работе бота.
Все, бот готов.
Правда, пока он еще ничего не умеет. Дальше на помощь приходят сервисы:
- Chatfuel – именно этот сервис помог сделать свои боты изданиям Forbes и TechCrunch и привлек инвестиции Яндекса. С его помощью можно сделать бот для Telegram и Facebook Messenger, а в будущем – и для Slack, Kik, WhatsApp и Viber. Работа сервиса по настройке вашего бота также происходит в режиме общения с ботом @Chatfuelbot. Пока что все это бесплатно;
- Api.ai – сервис для создания чат-ботов для Facebook Messenger и Slack. Подключаете бот и через веб-интерфейс задаете команды и реакции на сообщения пользователей, заполняя и редактируя пошаговую форму. Инструмент бесплатный, пока к вашему боту поступает меньше 6000 обращений в месяц. Дальше придется покупать подписку – от 89$ в месяц.
- Meya – еще один сервис для создания ботов, работает с Telegram, Slack, Kik, Facebook Messenger, Twitter и др. Предоставляет хостинг для ботов, базы данных, фреймворк для понимания естественной речи пользователя, средства для интеграции и т.п.
- Pandorabots – платформа по созданию чат-ботов для Twilio, Twitter, Facebook, Firebase, Skype и Slack, о ней мы писали отдельно.
- Manybot – довольно популярная в рунете платформа для создания ботов в Telegram.
Как написать Telegram бота: практическое руководство
В последнее время 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. В итоге после выполнения этих команд мы получим:
{u'username': u'PythonPlanetBot', u'first_name': u'Python Planet Bot', u'id': 199266571}
Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.
Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start
Выполняем код:
TelegramBot.getUpdates()
[{u'message': {u'date': 1459927254, u'text': u'/start', u'from': {u'username': u'adilkhash', u'first_name': u'Adil', u'id': 31337}, u'message_id': 1, u'chat': {u'username': u'adilkhash', u'first_name': u'Adil', u'type': u'private', u'id': 7350}}, 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': {u'date': 1459928527, u'text': u'hello bro', u'from': {u'username': u'adilkhash', u'first_name': u'Adil', u'id': 31337}, u'message_id': 13, u'chat': {u'username': u'adilkhash', u'first_name': u'Adil', u'type': u'private', u'id': 7350}}, 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 = '<Our_Bot_Token>'
TelegramBot = telepot.Bot(TOKEN)
def _display_help():
return render_to_string('help.md')
def _display_planetpy_feed():
return render_to_string('feed.md', {'items': parse_planetpy_rss()})
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 каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.
💌 Присоединяйтесь к рассылке
Понравился контент? Пожалуйста, подпишись на рассылку.
этапы написания, исследования, рабочие схемы, структура, тексты и рекомендации
Как и любой инструмент, чат-бот сам по себе не принесет никакой пользы. Даже наоборот, криво настроенный бот бесит клиентов, которые в ответ на бесполезные сообщения в лучшем случае позовут оператора. В худшем — закроют ваш сайт навсегда.
Предварительная работа
Чат-бот — скрипт, который без участия человека приведет клиента к целевому действию. Соответственно, для автоматической работы бота вы должны иметь на руках данные о вашей аудитории и не только. Подготовка идет в несколько шагов.Узнайте свою аудиторию
Вы должны понимать, что движет вашей аудиторией и побуждает её обращаться к вам. Составьте портрет Персоны покупателя.
Персона покупателя — смоделированный профиль вашего типичного клиента, созданный со слов реальных покупателей.
То есть, предстоит провести набор интервью с реальными клиентами, изучить отзывы, записи разговоров с менеджерами и превратить это в условную модель потребителя. По сути, вы получите схему, в которой расписан портрет вашего клиента. Там есть проблемы и критерии клиента, мнение о процессе взаимодействия с брендом, а также классический набор данных о поле, возрасте и интересах вашей аудитории.
Совместите эту информацию с данными теории по Jobs to be done. Имея на руках достоверный профиль клиента, вы поймете, какую конкретную потребность закрывает человек, придя к вам. Создайте схему потребностей и болей клиента, которые решает ваш продукт. Если хотите быть максимально осведомленным, можете составить и Customer Journey Map, где отражены проблемы и барьеры, которые встречает клиент, взаимодействуя с вами. О CJM мы написали отдельную статью.Читайте также:
Что такое CJM? Разбираем основные элементы карты клиентского пути
Подход к проблеме со стороны клиента приведет к тому, что открыв диалог в чате, потребитель сразу получит предложение, которое закрывает его потребность.Поставьте цель и задачи
Ответьте себе на вопрос: «для чего нам нужен чат-бот?». Ответом на этот вопрос и станет цель работы онлайн-консультанта. Ниже несколько типичных целей для бота:
- Сбор лидов — бот может собирать данные клиентов для отдела продаж;
- Оформление заказов — особенно актуально для ресторанов или доставки пиццы, где точно известен конечный результат и немного шагов до конверсионного действия;
- Сбор обратной связи — бот соберет отзывы от клиентов в автоматическом режиме;
- Консультация пользователя по выбору товара/услуги — бот расскажет посетителям об основных характеристиках товаров и услуг, ответ на часто задаваемые вопросы и подберёт лучшее предложение;
- Техническая поддержка пользователя — бот поможет решить типичные проблемы клиентов;
- Повысить эффективность работы менеджеров — бот узнает основную информацию о пользователе и его потребности, чем ускорит и упростит работу сотрудника отдела продаж.
Для каждой из целей задачи составляют в индивидуальном порядке, перекладывая алгоритмы общения менеджеров на ветки бота и делегируя рутинные ответы машине.
Определите структуру чат-бота
Структура чат-бота определяет его вариативность и длину. Некоторые выявляют, на каком этапе воронки продаж находится пользователь, другие больше направлены на консультацию и продажу. Ниже несколько вариантов структуры чат-ботов.
Пирамида
Простейшая структура, бот задает клиенту несколько вопросов, выдавая по итогу 1 из нескольких заготовленных вариантов продукта. Подойдет для интернет-магазинов с узким ассортиментом или для изучения меню в ресторанах с простым меню.Перчатка
Этот алгоритм чат-бота представляет собой длинное дерево с большим набором ветвей. Эта схема подходит для прогревающих воронок. Бот задает вопросы пользователю, предлагая либо пройти дальше по цепочке, либо лид-магнит, соответствующий его месту в воронке продаж. К примеру, записи вебинаров или другой экспертный контент компании.Карта
Структура, которая позволяет пользователю свободно перемещаться между ветками бота. Полезна, если пользователь изучает конкретный продукт и начинает диалог для консультации.Квест
Сложная и детализированная схема чат-бота. Полезна, если вы хотите досконально изучить пользователя, либо внедрить элементы геймификации.Сценарий и тексты для чат-бота
Создание сценария к чат-боту происходит в 3 этапа: цели, схема, контент. Некоторые редактируют готовые сценарии чат-бота под свои цели, но мы рекомендуем их использовать максимум как пример для разработки собственного сценария.
Как можно догадаться, первый этап вы выполните еще на моменте предварительного исследования. Вы должны понимать, какую цель достигает клиент с помощью бота. Это фундамент для разработки схемы диалога.
Второй этап — разработка визуальной схемы вопросов и ответов чат-бота. Закройтесь в переговорке, взяв с собой весь набор стандартных вопросов и ответов, и начните выстраивать логику и цепочки чат-бота. Сейчас вы определяете, какой вопрос ведет к какой ветке, и объединяете это в единую систему.
Вы можете сделать это по классике, взяв ватман и маркеры. Однако проще воспользоваться графическими конструкторами. Но главное — визуально отразить схему работы чат-бота. На этом моменте вы увидите взаимосвязь между ветками, а также пробелы, которые всплывают только в момент визуализации. Быть может, где-то стоит установить еще один этап, а где-то убрать лишнюю ветвь.Читайте также:
5 проблем онлайн-консультанта и можно ли их решить
Собрав скелет сценария, вы переходите к третьему этапу — наполнению веток контентом. Помните, что чат-бот — представитель компании, часть айдентики. А это значит, что бот должен соответствовать бренду. Установите несколько правил, которые сделают бота органичным и приятным для клиента.- Соответствуйте Tone of voice. Тексты в боте должны быть аналогичны общему стилю общения компании с клиентами. Вы местный автосервис? Тогда нет смысла «выкать» и играть во франта в чате, говорите с аудиторией на одном языке на всех площадках.
- В чатах принято писать емко и коротко. Ограничьте ответы бота 60-150 знаками максимум. Разбивайте большие предложения на два коротких. Используйте тот же принцип, что и в переписке в мессенджерах.
- Разбивайте любые инструкции на шаги и отдельные сообщения. 1 мысль — 1 сообщение. Это удобно для восприятия.
- Не бойтесь эмодзи. Для мессенджеров и чатов это органично. К тому же, вы добавляете еще один эмоциональный слой и упрощаете усвоение информации. 😎
- Пишите естественно. Даже если у вас тысячи клиентов, общаться с человеком бот будет персонально. Поэтому не душите его канцеляризмами и титулами. Приветливо предложенная помощь куда нужнее обещания премиум-сервиса и широкого ассортимента.
Вёрстка и тест чат-бота
Рассмотрим процесс верстки чат-бот на примере МультиЧата Callibri, куда инструмент включен по-умолчанию. С настройками чат-бота вы справитесь без помощи программиста. Весь процесс происходит в визуальном редакторе. Все начинается с приветственного экрана, который увидит посетитель, открыв чат. А уже затем вы настраиваете ветки и реакции.- Добавьте новую или вставьте скопированную реакцию. Новые реакции появятся ниже отдельными кнопками.
- Вы можете копировать как отдельные шаги, так и целые ветки в чат-боте. Удобно, если у вас много повторяющихся элементов. Скопированное можно вставить в любое место в существующем боте, либо другой проект.
- На каждом этапе вы можете предложить пользователю оставить контакты или позвать оператора.
- Реакции пользователей можно менять местами. Каждая реакция ведет к новой ветке диалога и запускает отдельный сценарий.
- Для дополнительных настроек чат-бота перейдите в отдельную вкладку. Там вы можете установить время работы чат-бота, его имя, каналы работы, аватарку и прочее. Подробнее о настройках есть заметка в Помощи.
7 рекомендаций по написанию чат бота
Репетируйте. Выявить неестественность и слабые этапы в сценарии поможет обыкновенная читка текстов вслух. Пройдитесь по сценарию вместе с сотрудниками и отправляйте на доработку те ветки, которые ослабляют погружение клиента и не несут явной пользы.
Создайте доброжелательные приветствие и финальное слово. Начинайте общение вежливо. Поздоровайтесь с клиентом и предложите ему помощь. Выстраивайте старт диалога так, чтобы ненавязчиво подтолкнуть клиента к клику по кнопкам с реакциями. Аналогично с окончанием диалога. Получив желанную конверсию, будьте доброжелательны и не забудьте попрощаться с клиентом и поблагодарить его за обращение или заказ.
Всегда смотрите на все с точки зрения клиента. Нет смысла углубляться в специфику бренда, чат с клиентом не должен поощрять ваше эго. Хорошие тексты в сценарии решают потребительские проблемы, если хоть одна ветка этого не делает — удаляйте её.
Заканчивайте этапы вопросами. Вопрос в конце этапа показывает, что польза бота для человека еще не закончилась. Это мотивирует продолжить диалог.
Не выдавайте бота за человека. Любой обман отталкивает клиента от вас. И если вы постараетесь выдать чат-бота за настоящего оператора, то вас быстро раскусят и оставят без конверсионного действия. Поэтому рекомендуем уже в приветствии сообщить клиенту, что он пишет роботу.
Выстройте тайминги появления ответа. Не сбивайте темп переписки в чате, показывайте ответ на вопрос человеку спустя 1-3 секунды, чтобы создать иллюзию живого общения.
Давайте человеку выбор. Всегда оставляйте возможность вызвать оператора и вернуться на предыдущий шаг. Заперев пользователя в цепочке, вы рискуете вскоре увидеть высокий показатель отказов в отчетах.
Заключение
Как оказалось, создать чат-бот не так уж сложно. Достаточно пары базовых маркетинговых исследований и рабочего визуального конструктора. Однако создав сценарий и запустив робота, вы не закрыли задачу. Поведение пользователей постоянно меняется, поэтому совершенствование бота станет регулярным делом. Цепочки, которые работали вчера, не работают сегодня и так далее.
Регулярно тестируйте эффективность диалогов, расширяйте возможности чат-бота и займитесь аналитикой. В итоге вы получите современный инструмент автоматизации, чья польза для клиента и бренда будет безусловной.
Создать бота — Teams | Microsoft Docs
- Чтение занимает 2 мин
В этой статье
Важно!
Эта статья основана на SDK bot Framework v3. Если вы ищете текущую версию документации 4.6 или более поздней версии SDK, см. раздел разговорных ботов.
Все боты, созданные с Microsoft Bot Framework, настроены и готовы к работе в Microsoft Teams.
Дополнительные сведения см. в документе Bot Framework Documentation для общих сведений о ботах.
Создание бота для Microsoft Teams
Teams App Studio — это средство, которое может помочь создать бот, а также пакет приложений, который ссылается на бота. Оно также содержит библиотеку элементов управления React и настраиваемые примеры для карточек. Дополнительные сведения см. в Teams App Studio. Последующие действия предполагают, что вы настраиваете бот вручную и не используете Teams App Studio:
Создайте бот с помощью этой ссылки: https://dev.botframework.com/bots/new . После создания бота обязательно добавьте Microsoft Teams в виде канала из списка основных каналов. Вы можете повторно использовать любой сгенерированный вами идентификатор приложения Майкрософт, если вы уже создали пакет или манифест приложения.
Примечание
Если вы не хотите создавать бота в Azure, необходимо использовать эту ссылку для создания нового бота: https://dev.botframework.com/bots/new . Если вместо этого нажать кнопку Создать бот на портале Bot Framework, вместо этого вы создайте бот в Microsoft Azure.
Создайте бот с помощью пакета Microsoft.Bot.Connector.Teams NuGet, SDKbot Framework или API соединителов ботов.
Проверьте бот с помощью Bot Framework Emulator.
Развертывание бота в облачной службе, например в Microsoft Azure. Кроме того, запустите приложение локально и используйте службу тоннелей, такую ngrok, чтобы https:// конечную точку для вашего бота, например
https://45az0eb1.ngrok.io/api/messages
.
Примечание
Боты и Microsoft Azure
С декабря 2017 г. портал Bot Framework оптимизирован для регистрации ботов в Microsoft Azure. Вот некоторые моменты, которые следует знать:
- Каналы Microsoft Teams для ботов, зарегистрированных в Azure, являются бесплатными. Сообщения, отправленные по Teams канала, не будут учитываться в отношении потребляемых сообщений для бота.
- Хотя можно создать новый бот Bot Framework без использования Azure, необходимо использовать этот URL-адрес ( который больше не будет выставлен на https://dev.botframework.com/bots/new) портале Bot Framework.
- При редактировании свойств существующего бота в списке ваших ботов в Bot Framework, таких как его «конечная точка обмена сообщениями», которая распространена при первом разработке бота, особенно если вы используете ngrok,вы увидите столбец «Состояние миграции» и голубую кнопку «Миграция», которая будет принимать вас на портале Microsoft Azure. Не нажимайте кнопку «Миграция», если это не то, что вы хотите сделать; вместо этого щелкните имя бота, и вы можете изменить его свойства:
- Если вы регистрируете бота Microsoft Azure, код бота не должен быть Microsoft Azure.
- Если вы зарегистрировали бота с помощью портала Microsoft Azure, у вас должна быть учетная запись Microsoft Azure. Вы можете создать ее бесплатно. Чтобы проверить вашу личность при создании, необходимо предоставить кредитную карту, но она не будет взиматься; всегда бесплатно создавать и использовать боты с помощью Microsoft Teams.
- Теперь вы можете использовать App Studio для регистрации и обновления сведений о приложениях и ботах непосредственно в Microsoft Teams. Для добавления или настройки других каналов Bot Framework Microsoft Azure, таких как Direct Line, Web Chat, Skype и Facebook Messenger, необходимо использовать Microsoft Azure портал.
См. также
Примеры Bot Framework.
Как создать бота. Pyrus Help
Важно: создавать ботов может только пользователь с правами Управляющего.
Чтобы настроить бота, перейдите в раздел Боты.
Чтобы создать бота, нажмите Добавить нового бота.
Во всплывающем окне задайте конфигурацию бота:
Имя — придумайте любое название бота;
URL — введите адрес страницы на вашем сайте. На этой странице должен располагаться код обработчика событий — когда происходит событие бота, Pyrus делает запрос по этому адресу. Разрешены только HTTPS-адреса.
Нажмите кнопку Добавить. Pyrus сформирует параметры нового бота и покажет их во всплывающем окне:
Логин — логин для бота в формате bot@<guid>.
Секретный ключ нужен для вызовов API — используется для подписи каждого вызова и гарантирует, что вызовы делаются от имени Pyrus.
После добавления бот будет доступен в разделе Боты. Чтобы изменить конфигурацию бота, откройте его профиль — нажмите на соответствующую кнопку.
Здесь боту можно задать Дополнительные права. Права Управляющего подойдут, если нужен доступ к редактированию справочников. Права Руководителя понадобятся для сбора статистики через приложение Pyrus Sync.
Параметры сценария для бота можно задать в поле Настройки прямо в его профиле. Это может быть текст смс или электронного письма, которое он будет отправлять при опредёленном событии, имя поля формы или, например, JSON-объект.
Поставить бота на паузу можно, просто передвинув переключатель в положение Отключено.
В строке Секретный ключ можно изменить значение ключа безопасности — для этого нажмите Сбросить. Это нужно, если вы подозреваете, что текущий ключ безопасности скомпрометирован. После сброса ключа злоумышленник не сможет получить новый токен со старым ключом. При этом настроенные раньше боты будут работать, как и прежде.
Также в профиле бота вы можете отслеживать отклонения его действий от заданного сценария — ошибки. Они отображаются в Журнале событий внизу страницы.
Если нужно заблокировать бота, нажмите Заблокировать. При удалении бот пропадает из списка, а соответствующий ему неактивированный пользователь блокируется (его можно будет видеть в списке Заблокированы в разделе Пользователи).
Если восстановить заблокированного пользователя-бота, все настройки восстановятся в том виде, какими они были до блокировки. Можно блокировать и восстанавливать бота сколько угодно раз, ограничений нет.
Конфигурация бота
Конфигурация бота состоит из адреса для вызовов (URL), параметров Security Key, ClientId и свойства включен/выключен.
URL — адрес страницы на вашем сайте. На этой странице должен располагаться код обработчика событий. Когда задача переходит к боту, Pyrus делает запрос по этому адресу. Разрешены только HTTPS-адреса.
Требования к сертификату: сертификат HTTPS должен быть проверяем. Цепочка сертификатов должна прослеживаться до известного удостоверяющего центра.
Security Key и ClientId генерируются автоматически при создании бота и нужны для вызовов API. Ключ Security Key используется для подписи каждого вызова и гарантирует, что вызовы делаются от имени Pyrus.
Структура данных
POST-запрос
- Тело.
task — задача, в которой произошло событие. Формат этого поля совпадает с ответом API-запроса получения задачи.
task_id — номер задачи, в которой произошло событие. См. подробное описание структуры.
access_token — авторизационный токен. В течение 5 минут после вызова бот может выполнять запросы к Pyrus через PublicAPI, используя access_token для авторизации. Если на обработку вызова бота требуется больше 30 секунд, мы рекомендуем сразу вернуть код 200 без тела запроса, а по окончании вычислений создать комментарий в задаче, отправив запрос на добавление комментария через PublicAPI с использованием access_token.
{ "task_id":5600, "task":{/* task with comments */}, "access_token":"{token}" }
- Дополнительный заголовок X-Pyrus-Sig. Значение — строка, содержащая подпись сообщения для проверки того, что вызов бота выполнил Pyrus, а не кто-то другой. Для проверки подписи необходимо к телу запроса добавить секретный ключ и вычислить для получившейся строки HMAC-дайджест с использованием алгоритма SHA1. Смотрите реализацию проверки подписи на Python.
Дополнительный заголовок X-Pyrus-Retry. Значение — одно из трех: «1/3», «2/3» или «3/3». В числителе номер попытки, начиная с единицы, а в знаменателе — количество попыток (три попытки). Для первого вызова, который не является повтором, значение ставится «1/3».
Ответ: HTTP 2XX
При необходимости можно указать тело ответа. Тело ответа повторяет структуру запроса Pyrus API AddComment. Указывать авторизационный заголовок (Header Authorization) не нужно.
Telegram-бот на Python: пошаговое руководство
Делимся инструкцией, как написать бота с помощью библиотеки python-telegram-bot за считанные минуты. На примере гайда от программиста Давида Мастроматтео.
Установка 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 1
BotFather 2
У BotFather можно запросить много других интересных вещей. Например, изменить изображение профиля бота.
Теперь нужно принять важное решение: определиться с главной задачей бота. В этой инструкции мы сделаем бота, который предоставляет информацию о биоритмах пользователей. Будьте осторожны: речь идет о псевдонаучных теориях, так что бот будет такой же полезный, как и гороскопы. Но если дойдете до конца — сможете создавать любых ботов.
Программирование бота
Пакет 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 "{text_received}" ?') 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(), которая отвечает пользователю информативным сообщением;
- команда /help вызывает функцию help(), которая отвечает пользователю информативным сообщением;
- если при отправке сообщений возникает ошибка, вызываем функцию error();
- если пользователь напишет фразы или символы, которые не являются командой, вызываем функцию text(), отвечающую пользователю тем же полученным текстом.
Сейчас в коде прописаны функции обратного вызова, которые используют полученные данные для отправки сообщений пользователю.
Тестирование
Теперь можно протестировать бота. Запустите его.
$ python mastrobot_example.py
Пошлите ему команду /start .
Ура, бот работает!
Но это не конец. Надо создать бота, который сообщает пользователю его ежедневный биоритм. Для этого следует применить команду /start. С ее помощью при запуске чата можно получить данные о дне рождения пользователя. Затем надо создать функцию для обработки новой команды /biorhythm, чтобы отправить ответ пользователю с его личным биоритмом.
Чтобы узнать день рождения пользователя, для начала нужно изменить функцию, обрабатывающую команду /start. Чтобы упростить задачу, попросите пользователя указать год, месяц и день рождения.
# function to handle the /start command def start(update, context): first_name = update.message.chat.first_name update.message.reply_text(f"Hi {first_name}, 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 did 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 {birthday}') except: update.message.reply_text("it's funny but it doesn't seem to be correct...")
Когда получен год рождения пользователя, остается проверить, допустимое ли это значение. Если да, то оно сохраняется в словаре context.user_data[]. Продолжайте устанавливать значения для переменной STATE и задавать следующие вопросы.
Когда зададите последний вопрос и будете знать день рождения, создайте переменную даты и сохраните ее в context.user_data[] словаре.
Если пользователь вводит недопустимое значение, то получает ответ, что оно неверно. Значение переменной STATE не меняется, поэтому пользователь застревает на этом вопросе, пока не ответит правильно.
Создание команды
Теперь нужно обработать команду /biorhythm.
Добавьте новый обработчик команд в функцию main().
dispatcher.add_handler(CommandHandler("biorhythm", biorhythm))
Напишите функцию расчета биоритма:
# 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: {user_biorhythm['phisical']}") update.message.reply_text(f"Emotional: {user_biorhythm['emotional']}") update.message.reply_text(f"Intellectual: {user_biorhythm['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 {first_name}, 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 did 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 {birthday}') 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: {user_biorhythm['phisical']}") update.message.reply_text(f"Emotional: {user_biorhythm['emotional']}") update.message.reply_text(f"Intellectual: {user_biorhythm['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 bot
Поздравляем! Telegram-бот на Python полностью готов.
Бот, созданный для примера, был сохранен. Его можно протестировать по имени пользователя @mastro35_mastrobot.
Python Discord Bot Tutorial — Создайте код для Discord бота и разместите его бесплатно
Из этого туториала Вы узнаете, как полностью создать собственного бота Discord в облаке.
Вам не нужно ничего устанавливать на свой компьютер, и вам не нужно ничего платить за размещение своего бота.
Мы собираемся использовать ряд инструментов, включая Discord API, библиотеки Python и платформу облачных вычислений Repl.it.
Существует также видеоверсия этого письменного руководства.Видео встроено ниже, а письменная версия — после видео.
Как создать учетную запись Discord Bot
Чтобы работать с библиотекой Python и API Discord, мы должны сначала создать учетную запись Discord Bot.
Вот шаг к созданию учетной записи Discord Bot.
1. Убедитесь, что вы вошли на сайт Discord.
2. Перейдите на страницу приложения.
3. Щелкните кнопку «Новое приложение».
4.Дайте приложению имя и нажмите «Создать».
5. Перейдите на вкладку «Бот» и нажмите «Добавить бота». Вам нужно будет подтвердить, нажав «Да, сделай это!»
Оставить настройки по умолчанию для Public Bot (отмечен) и Require OAuth3 Code Grant (не отмечен).
Ваш бот создан. Следующим шагом будет копирование токена.
Этот токен является паролем вашего бота, поэтому никому его не сообщайте. Это может позволить кому-то войти в ваш бот и делать разные плохие вещи.
Вы можете регенерировать токен, если он случайно станет доступен для общего доступа.
Как пригласить вашего бота присоединиться к серверу
Теперь вам нужно подключить своего бота к серверу. Для этого вы должны создать для него URL-адрес приглашения.
Перейдите на вкладку «OAuth3». Затем выберите «бот» в разделе «области действия».
Теперь выберите необходимые разрешения для бота. Наш бот будет в основном использовать текстовые сообщения, поэтому нам не нужно много разрешений. Вам может потребоваться больше, в зависимости от того, что вы хотите, чтобы ваш бот делал.Будьте осторожны с разрешением «Администратор».
После выбора соответствующих разрешений нажмите кнопку «Копировать» над разрешениями. Это скопирует URL-адрес, который можно использовать для добавления бота на сервер.
Вставьте URL-адрес в свой браузер, выберите сервер, на который будет приглашен бот, и нажмите «Авторизовать».
Чтобы добавить бота, вашей учетной записи необходимы права «Управление сервером».
Теперь, когда вы создали пользователя бота, мы начнем писать код Python для бота.
Как написать код простого бота Discord с помощью библиотеки discord.py
Мы будем использовать библиотеку Python discord.py, чтобы написать код для бота. discord.py — это оболочка API для Discord, которая упрощает создание бота Discord на Python.
Как создать реплику и установить discord.py
Вы можете разработать бота на локальном компьютере с помощью любого редактора кода. Однако в этом уроке мы будем использовать Repl.it, потому что это упростит любому следовать за ним.Repl.it — это онлайн-среда, которую вы можете использовать в своем веб-браузере.
Начните с перехода на Repl.it. Создайте новый Repl и выберите «Python» в качестве языка.
Чтобы использовать библиотеку discord.py, просто напишите import discord
в верхней части main.py
. Repl.it автоматически установит эту зависимость, когда вы нажмете кнопку «запустить».
Если вы предпочитаете кодировать бота локально, вы можете использовать эту команду в MacOS для установки discord.py:
python3 -m pip install -U discord.py
Возможно, вам придется использовать pip3
вместо pip
.
Если вы используете Windows, вместо этого вам следует использовать следующую строку:
py -3 -m pip install -U discord.py
Как настроить события Discord для вашего бота
discord.py revolves вокруг концепции событий. Событие — это то, что вы слушаете, а затем реагируете. Например, когда происходит сообщение, вы получаете событие об этом, на которое вы можете ответить.
Давайте создадим бота, который отвечает на конкретное сообщение. Этот простой код бота вместе с объяснением кода взят из документации discord.py. Позже мы добавим в бота дополнительные функции.
Добавьте этот код в main.py. (Вы можете назвать файл как-нибудь иначе, только не discord.py.) Я вскоре объясню, что делает весь этот код.
импортный рознь
импорт ОС
client = discord.Client ()
@ client.event
async def on_ready ():
print ('Мы вошли в систему как {0.пользователь} '. формат (клиент))
@ client.event
async def on_message (сообщение):
если message.author == client.user:
возвращение
если message.content.startswith ('$ hello'):
await message.channel.send ('Привет!')
client.run (os.getenv ('TOKEN'))
Создавая своего пользователя-бота в Discord, вы скопировали токен. Теперь мы собираемся создать файл .env
для хранения токена. Если вы запускаете свой код локально, вам не нужен файл .env
. Просто замените os.getenv ('TOKEN')
с токеном.
Файлы .env
используются для объявления переменных среды. На Repl.it большинство созданных вами файлов видны всем, но файлы .env
видны только вам. Другие люди, просматривающие общедоступный ответ, не смогут увидеть содержимое файла .env
.
Итак, если вы разрабатываете на Repl.it, включайте только личную информацию, такую как токены или ключи, в файл .env
.
Нажмите кнопку «Добавить файл» и создайте файл с именем .env
.
Внутри файла добавьте следующую строку, включая ваш фактический токен, который вы скопировали ранее:
TOKEN = [вставьте токен сюда]
Теперь давайте рассмотрим, что делает каждая строка кода в коде вашего бота Discord.
- Первая строка импортирует библиотеку discord.py.
- Вторая строка импортирует библиотеку ОС, но она используется только для получения переменной
TOKEN
из файла.env
. Если вы не используете.env
, эта строка вам не нужна. - Затем мы создаем экземпляр клиента
- Декоратор
@ client.event ()
используется для регистрации события. Это асинхронная библиотека, поэтому все делается с помощью обратных вызовов. Обратный вызов — это функция, которая вызывается, когда происходит что-то еще. В этом коде событиеon_ready ()
вызывается, когда бот готов к использованию. Затем, когда бот получает сообщение, вызывается событиеon_message ()
. - Событие
on_message ()
срабатывает каждый раз при получении сообщения, но мы не хотим, чтобы оно выполняло какие-либо действия, если сообщение пришло от нас. Поэтому, еслиMessage.author
совпадает сClient.user
, код просто возвращается. - Затем мы проверяем, начинается ли
Message.content
с'$ hello'
. Если да, то бот отвечает«Привет!»
на канал, в котором он использовался. - Теперь, когда бот настроен, последняя строка запускает бот с токеном входа.Он получает токен из файла
.env
.
У нас есть код для бота, теперь нам просто нужно его запустить.
Как запустить бота
Теперь нажмите кнопку «Выполнить» вверху, чтобы запустить своего бота в repl.it.
Если вы пишете бота локально, вы можете использовать эти команды в терминале для запуска бота:
В Windows:
py -3 main.py
В других системах:
python3 main. py
Теперь перейдите в свою комнату в Discord и введите «$ hello».Ваш бот должен ответить «Привет!».
Как улучшить бота
Теперь, когда у нас есть базовый бот, мы его улучшим. Не зря он называется «Поощрение бота».
Этот бот будет отвечать сообщением ободрения всякий раз, когда кто-то отправляет сообщение, содержащее грустное или удручающее слово.
Кто угодно сможет добавлять ободряющие сообщения для использования ботом, а отправленные пользователем сообщения будут храниться в базе данных Repl.it.
Бот также вернет случайную вдохновляющую цитату из API, когда кто-то наберет в чате сообщение «$ inspire».
Начнем с добавления функции «$ inspire».
Как добавить вдохновляющие цитаты к боту
Мы будем получать вдохновляющие цитаты из API под названием zenquotes.io. Нам нужно импортировать еще пару модулей Python, добавить функцию get_quote ()
и обновить код нашего бота для вызова функции.
Вот обновленный код. После кода я объясню новые части.
импортный рознь
импорт ОС
запросы на импорт
импортировать json
клиент = разлад.Клиент ()
def get_quote ():
response = requests.get ("https://zenquotes.io/api/random")
json_data = json.loads (response.text)
quote = json_data [0] ['q'] + "-" + json_data [0] ['a']
возврат (цитата)
@ client.event
async def on_ready ():
print ('Мы вошли в систему как {0.user}'. format (client))
@ client.event
async def on_message (сообщение):
если message.author == client.user:
возвращение
если message.content.startswith ('$ inspire'):
quote = get_quote ()
ждать message.channel.send (цитата)
клиент.run (os.getenv ('TOKEN'))
Теперь нам нужно импортировать модуль запросов
. Этот модуль позволяет нашему коду делать HTTP-запрос для получения данных из API. API возвращает JSON, поэтому модуль json
упрощает работу с возвращенными данными.
Функция get_quote ()
довольно проста. Во-первых, он использует модуль запросов для запроса данных из URL-адреса API. API возвращает случайную вдохновляющую цитату. Эту функцию можно легко переписать для получения котировок из другого API, если текущий перестанет работать.
Далее внутри функции мы используем json.loads ()
для преобразования ответа из API в JSON. Методом проб и ошибок я понял, как перевести цитату из JSON в нужный строковый формат. Цитата возвращается из функции в виде строки.
Ближе к концу обновляется последняя часть кода. Ранее он искал сообщение, которое начиналось с «$ hello». Теперь он ищет «$ inspire». Вместо того, чтобы возвращать «Hello!», Он получает цитату с quote = get_quote ()
и возвращает цитату.
На этом этапе вы можете запустить свой код и опробовать его.
Как добавить ободряющие сообщения к боту
Теперь мы реализуем функцию, при которой бот отвечает ободряющими сообщениями, когда пользователь отправляет сообщение с грустным словом.
Как добавить грустные слова к боту
Сначала нам нужно создать список Python, содержащий грустные слова, на которые будет отвечать бот.
Добавьте следующую строку после создания переменной клиента
:
sad_words = [«грустный», «депрессивный», «несчастный», «сердитый», «несчастный»]
Не стесняйтесь добавлять дополнительные слова к списку.
Как добавить ободряющие сообщения к боту
Теперь мы добавим список ободряющих сообщений, на которые бот ответит.
Добавьте следующий список после созданного вами списка sad_words
:
starter_encouragements = [
"Не унывать!",
"Повесить там.",
"Вы отличный человек / бот!"
]
Как и раньше, не стесняйтесь добавлять в список другие фразы по вашему выбору. Сейчас я использую только три элемента, потому что позже мы добавим возможность пользователям добавлять больше ободряющих фраз для использования ботом.
Как отвечать на сообщения
Теперь нам нужно обновить нашего бота, чтобы он использовал два созданных нами списка. Во-первых, импортируйте случайный модуль, потому что бот будет случайным образом выбирать поощрительные сообщения. Добавьте следующую строку в операторы импорта вверху кода: import random
.
Теперь мы обновим функцию on_message ()
, чтобы проверить все сообщения, чтобы увидеть, содержат ли они слово из списка sad_words
. Если будет найдено грустное слово, бот отправит случайное сообщение ободрения.
Вот обновленный код:
async def on_message (сообщение):
если message.author == client.user:
возвращение
msg = message.content
если msg.startswith ('$ inspire'):
quote = get_quote ()
ждать message.channel.send (цитата)
если есть (слово в сообщении для слова в sad_words):
await message.channel.send (random.choice (starter_encouragements))
Это хорошее время для тестирования бота. Теперь вы знаете достаточно, чтобы создать собственного бота. Но дальше вы узнаете, как реализовать более продвинутые функции и хранить данные с помощью Repl.это база данных.
Как включить сообщения, отправленные пользователями
Бот полностью работоспособен, но теперь давайте сделаем возможным обновление бота прямо из Discord. Пользователь должен иметь возможность добавлять больше обнадеживающих сообщений, которые бот будет использовать при обнаружении грустного слова.
Мы собираемся использовать встроенную базу данных Repl.it для хранения сообщений, отправленных пользователями. Эта база данных представляет собой хранилище ключей и значений, которое встроено в каждый ответ.
Вверху кода под другими операторами импорта добавьте из REPLIT import db
.Это позволит нам использовать базу данных Repl.it.
Пользователи смогут добавлять собственные поощрительные сообщения для использования ботом прямо из чата Discord. Прежде чем добавлять новые команды для бота, давайте создадим две вспомогательные функции, которые будут добавлять пользовательские сообщения в базу данных и удалять их.
Добавьте следующий код после функции get_quote ()
:
def update_encouragements (diverging_message):
если "поощрения" в db.keys ():
поощрения = db ["поощрения"]
поощрения.добавить (поощрение_сообщение)
db ["поощрения"] = поощрения
еще:
db ["поощрения"] = [поощрение_сообщение]
def delete_encouragment (индекс):
поощрения = db ["поощрения"]
если len (поощрения)> index:
дель поощрения [индекс]
db ["поощрения"] = поощрения
Функция update_encouragements ()
принимает в качестве аргумента сообщение ободрения.
Сначала он проверяет, является ли «поощрение» ключом в базе данных. Если это так, он получает список поощрений, уже имеющихся в базе данных, добавляет новый в список и сохраняет обновленный список обратно в базу данных под ключом «поощрения».
Если база данных еще не содержит «поощрений», создается новый ключ с этим именем, и новое ободряющее сообщение добавляется в качестве первого элемента в списке.
Функция delete_encouragement ()
принимает индекс в качестве аргумента.
Получает список поощрений из базы данных, хранящейся под ключом «поощрения». Если количество элементов в списке поощрений больше, чем в указателе, то элемент списка в этом указателе удаляется.
Наконец, обновленный список сохраняется в базе данных под ключом «поощрения».
Вот обновленный код для функции on_message ()
. После кода я объясню новые разделы.
async def on_message (сообщение):
если message.author == client.user:
возвращение
msg = message.content
если msg.startswith ("$ inspire"):
quote = get_quote ()
ждать message.channel.send (цитата)
options = starter_encouragements
если "поощрения" в дб.ключи ():
options = options + db ["поощрения"]
если есть (слово в сообщении для слова в sad_words):
ожидание message.channel.send (random.choice (параметры))
если msg.startswith ("$ new"):
поощрение_message = msg.split ("$ новый", 1) [1]
update_encouragements (поощрение_сообщение)
await message.channel.send («Добавлено новое обнадеживающее сообщение.»)
если msg.startswith ("$ del"):
поощрения = []
если "поощрения" в db.keys ():
index = int (msg.split ("$ del", 1) [1])
delete_encouragment (индекс)
поощрения = db ["поощрения"]
жду сообщения.channel.send (поощрения)
Первая новая строка кода сверху: options = starter_encouragements
. Мы делаем копию starter_encouragements
, потому что мы собираемся добавить сообщения, отправленные пользователем, в этот список, прежде чем выбирать случайное сообщение для отправки ботом.
Мы проверяем, есть ли уже «поощрения» в ключах базы данных (это означает, что пользователь отправил хотя бы одно настраиваемое сообщение). Если это так, мы добавляем сообщения пользователей к поощрениям для начинающих.
Затем, вместо отправки случайного сообщения из starter_encouragements
, бот теперь отправляет случайное сообщение из вариантов
.
Следующий новый раздел кода используется для добавления нового отправленного пользователем сообщения в базу данных. Если сообщение Discord начинается с «$ new», то текст после «$ new» будет использоваться как новое обнадеживающее сообщение.
Код msg.split ("$ new", 1) [1]
отделяет сообщение от команды «$ new» и сохраняет сообщение в переменной.Обратите внимание на пробел в строке "$ new"
. Мы хотим все после пробела.
Мы вызываем вспомогательную функцию update_encouragements
с новым сообщением, а затем бот отправляет сообщение в чат Discord, подтверждающее, что сообщение было добавлено.
Третий новый раздел (в конце приведенного выше кода) проверяет, начинается ли новое сообщение Discord с «$ del». Это команда для удаления элемента из списка «поощрений» в базе данных.
Сначала новая переменная с именем поощрений
инициализируется как пустой массив. Причина этого в том, что этот раздел кода отправит сообщение с пустым массивом, если база данных не включает ключ «поощрения».
Если ключ «поощрения» находится в базе данных, индекс будет отделен от сообщения Discord, начинающегося с «$ del». Затем вызывается функция delete_encouragement ()
, передающая индекс для удаления. Обновленный список поощрений загружается в переменную поощрений
, а затем бот отправляет сообщение в Discord с текущим списком.
Final Bot Features
Бот должен работать, поэтому сейчас самое время его протестировать. Теперь мы добавим несколько заключительных функций.
Мы добавим возможность получать список отправленных пользователями сообщений прямо из Discord, а также добавим возможность выключать и включать, реагирует ли бот на грустные слова.
Я дам вам полный окончательный код программы, а затем я расскажу об обновлениях под кодом.
импортный рознь
импорт ОС
запросы на импорт
импортировать json
случайный импорт
из реплита импорта базы данных
клиент = разлад.Клиент ()
sad_words = ["грустный", "подавленный", "несчастный", "сердитый", "несчастный"]
starter_encouragements = [
"Не унывать!",
"Повесить там.",
"Вы отличный человек / бот!"
]
если "отвечает" не в db.keys ():
db ["отвечающий"] = Верно
def get_quote ():
response = requests.get ("https://zenquotes.io/api/random")
json_data = json.loads (response.text)
quote = json_data [0] ["q"] + "-" + json_data [0] ["a"]
возврат (цитата)
def update_encouragements (поощрение_сообщение):
если "поощрения" в дб.ключи ():
поощрения = db ["поощрения"]
поощрения.аппенд (поощрение_сообщение)
db ["поощрения"] = поощрения
еще:
db ["поощрения"] = [поощрение_сообщение]
def delete_encouragment (индекс):
поощрения = db ["поощрения"]
если len (поощрения)> index:
дель поощрения [индекс]
db ["поощрения"] = поощрения
@ client.event
async def on_ready ():
print ("Мы вошли в систему как {0.user}". format (client))
@ client.event
async def on_message (сообщение):
если сообщение.автор == client.user:
возвращение
msg = message.content
если msg.startswith ("$ inspire"):
quote = get_quote ()
ждать message.channel.send (цитата)
если db ["отвечает"]:
options = starter_encouragements
если "поощрения" в db.keys ():
options = options + db ["поощрения"]
если есть (слово в сообщении для слова в sad_words):
ожидание message.channel.send (random.choice (параметры))
если msg.startswith ("$ new"):
поощрение_message = msg.split ("$ новый", 1) [1]
update_encouragements (поощрение_сообщение)
жду сообщения.channel.send ("Добавлено новое обнадеживающее сообщение.")
если msg.startswith ("$ del"):
поощрения = []
если "поощрения" в db.keys ():
index = int (msg.split ("$ del", 1) [1])
delete_encouragment (индекс)
поощрения = db ["поощрения"]
ждите message.channel.send (поощрения)
если msg.startswith ("$ list"):
поощрения = []
если "поощрения" в db.keys ():
поощрения = db ["поощрения"]
ждите message.channel.send (поощрения)
если сообщениеначинается с ("$ отвечает"):
значение = msg.split ("$ ответ", 1) [1]
если value.lower () == "истина":
db ["отвечающий"] = Верно
await message.channel.send ("Ответ включен.")
еще:
db ["отвечающий"] = Ложь
await message.channel.send ("Ответ отключен.")
client.run (os.getenv ("TOKEN"))
Первый раздел, добавленный в код, находится прямо под списком starter_encouragements
:
, если "ответ" отсутствует в db.keys ():
db ["отвечающий"] = True
Мы создаем новый ключ в базе данных с именем «отвечающий» и устанавливаем для него значение «True».Мы будем использовать это, чтобы определить, должен ли бот отвечать на грустные слова или нет. Поскольку база данных сохраняется даже после остановки работы программы, мы создаем новый ключ только в том случае, если он еще не существует.
Следующая новая часть кода заключается в том, что раздел, отвечающий на грустные слова, теперь находится внутри этого оператора if: if db ["отвечающий"]:
. Бот ответит только на грустные слова, если db ["отвечающий"] = True
. Возможность обновить это значение появится после этого следующего раздела.
Далее, после кода, заставляющего бота отвечать на команду «$ del», следует новый код для ответа на команду «$ list» при отправке в виде сообщения Discord.
Этот раздел начинается с создания пустого списка под названием поощрений
. Затем, если в базе данных уже есть поощрения, они заменяют только что созданный пустой список.
Наконец, бот отправляет список поощрений в виде сообщения Discord.
Дальше идет последний новый раздел.Этот код заставляет бота отвечать на команду «$ responseing». Эта команда принимает аргумент «истина» или «ложь». Вот пример использования: «$ ответ истина».
Код сначала извлекает аргумент со значением = msg.split ("$ Responding", 1) [1]
(как и раньше, обратите внимание на пробел в "$ Responding"
). Затем есть оператор if / else, который соответствующим образом устанавливает «отвечающий» ключ в базе данных и отправляет уведомление обратно в Discord. Если аргумент не равен «истина», код принимает «ложь».
Код для бота завершен! Теперь вы можете запустить бота и попробовать его. Но есть еще один важный шаг, который мы обсудим дальше.
Как настроить бота для непрерывной работы
Если вы запустите своего бота в repl.it, а затем закроете вкладку, на которой он работает, ваш бот перестанет работать.
Но есть два способа обеспечить непрерывную работу бота даже после закрытия веб-боузера.
Первый и самый простой способ — подписаться на платный план в Repl.Это. Их самый дешевый платный план называется Hacker Plan и включает в себя пять постоянных ответов.
Вы можете получить три месяца бесплатно, используя эту ссылку (только для первых 1000 человек): https://repl.it/claim?code=tryalwayson2103
После того, как вы подписались на этот план, откройте свой Repl и щелкните имя наверху. Затем выберите вариант «Всегда включен».
Есть еще один способ сохранить работу кода даже на уровне бесплатного пользования, но он немного сложнее. Repl.it продолжит работу веб-сервера даже после закрытия вкладки.Но даже веб-сервер будет работать без использования только до часа.
Вот что говорится в документации repl.it:
После развертывания сервер продолжит работу в фоновом режиме даже после закрытия вкладки браузера. Сервер будет бодрствовать и оставаться активным в течение часа после последнего запроса, после чего он перейдет в стадию сна. Спящие ответы будут активированы, как только получат другой запрос; нет необходимости повторно запускать ответ. Однако, если вы внесете изменения в свой сервер, вам нужно будет перезапустить ответ, чтобы увидеть эти изменения, отраженные в действующей версии.
Чтобы бот работал непрерывно, мы будем использовать другую бесплатную службу под названием Uptime Robot по адресу https://uptimerobot.com/.
Uptime Robot можно настроить на проверку связи с веб-сервером бота на repl.it каждые 5 минут. При постоянных пингах бот никогда не перейдет в стадию сна и просто продолжит работу.
Итак, нам нужно сделать еще две вещи, чтобы наш бот работал непрерывно:
- создать веб-сервер в repl.it и
- настроить Uptime Robot для непрерывной проверки связи с веб-сервером.
Как создать веб-сервер в repl.it
Создать веб-сервер проще, чем вы думаете.
Для этого создайте в своем проекте новый файл с именем keep_alive.py
.
Затем добавьте следующий код:
из флакона для импорта Flask
from threading import Thread
app = Flask ('')
@ app.route ('/')
def home ():
return "Здравствуйте. Я жив!"
def run ():
app.run (хост = '0.0.0.0', порт = 8080)
def keep_alive ():
t = поток (цель = запустить)
т.Начните()
В этом коде мы используем Flask для запуска веб-сервера. Сервер возвращает «Привет. Я жив». всем, кто его посещает. Сервер будет работать в отдельном потоке от нашего бота. Мы не будем здесь все обсуждать, потому что остальное не имеет отношения к нашему боту.
Теперь нам просто нужен бот для запуска этого веб-сервера.
Добавьте следующую строку в начало main.py
, чтобы импортировать сервер.
из keep_alive import keep_alive
Чтобы запустить веб-сервер, когда main.py
, добавьте следующую строку в качестве предпоследней строки прямо перед запуском бота.
keep_alive ()
Когда вы запустите бота на repl.it после добавления этого кода, откроется новое окно веб-сервера. Отображается URL-адрес веб-сервера. Скопируйте URL-адрес, чтобы использовать его в следующем разделе.
Как настроить Uptime Robot
Теперь нам нужно настроить Uptime Robot для проверки связи с веб-сервером каждые пять минут. Это заставит бота работать постоянно.
Создайте бесплатную учетную запись на https://uptimerobot.com/.
После входа в свою учетную запись нажмите «Добавить новый монитор».
Для нового монитора выберите «HTTP (s)» в качестве типа монитора и назовите его как хотите. Затем вставьте URL-адрес вашего веб-сервера из repl.it. Наконец, нажмите «Создать монитор».
Готово! Теперь бот будет работать непрерывно, поэтому люди всегда могут взаимодействовать с ним на Repl.it.
Заключение
Теперь вы знаете, как создать бота Discord с помощью Python и постоянно запускать его в облаке.
Библиотека discord.py может делать еще много всего. Поэтому, если вы хотите предоставить боту Discord еще больше возможностей, следующим шагом будет ознакомление с документацией по discord.py.
Написание интерактивных ботов (документация Zulip API)
Это руководство посвящено написанию и тестированию интерактивных ботов. Мы предполагаем знакомство с нашим руководством по запуску ботов.
На этой странице вы найдете:
- A шаг за шагом руководство о том, как настроить среду разработки для написания ботов со всеми нашего прекрасного инструментария, который упростит написание и тестирование вашей работы.
- Руководство по написанию бота.
- Руководство по добавлению бота в Zulip.
- Руководство по тестированию результатов работы бота.
- Документация по API бота.
- Распространенные проблемы при разработке / запуске ботов и их решения.
Установка разрабатываемой версии пакета ботов Zulip
git clone https://github.com/zulip/python-zulip-api.git
— клонировать репозиторий python-zulip-api.cd python-zulip-api
— перейдите в свой клонированный репозиторий.python3 ./tools/provision
— установите все требования в Python virtualenv.Вывод
Provision
завершится командой видаsource ... / activate
; запустите эту команду, чтобы войти в новый файл virtualenv.Завершено . Теперь вы должны увидеть имя вашего venv перед вашим запросом, например
(зулип-апи-пи3-венв)
.
Подсказка: положение
устанавливает zulip
, zulip_bots
и zulip_botserver
пакетов в режиме разработчика.Это позволяет вам
измените эти пакеты, а затем запустите измененный код без
необходимо сначала переустановить пакеты или повторно подготовить их.
Написание бота
В руководстве ниже объясняется структура бота
,
это единственный файл, который вам нужно создать для нового бота. Ты
можете использовать это как шаблонный код для разработки собственного бота.
Каждый бот построен на этой структуре:
класс MyBotHandler (объект):
'' '
Строка документации этого бота.'' '
def использование (self):
return '' 'Ваше описание бота' ''
def handle_message (self, message, bot_handler):
# добавьте сюда свой код
handler_class = MyBotHandler
Имя класса (в данном случае MyBotHandler ) может быть определено вами. и должно совпадать с именем вашего бота. Чтобы зарегистрировать класс вашего бота, отрегулируйте последнюю строку
handler_class = MyBotHandler
, чтобы она соответствовала вашему название класса.Каждому боту необходимо реализовать функции
-
использование (самостоятельно)
-
handle_message (self, message, bot_handler)
-
Эти функции описаны в следующем разделе.
Добавление бота в Zulip
Бот-система Zulip находится в репозитории python-zulip-api.
Структура экосистемы ботов выглядит следующим образом:
zulip_bots
└───zulip_bots
├───боты
│ ├───bot1
│ └───bot2
│ │
│ ├───bot2.py
│ ├───bot2.conf
│ ├───doc.md
│ ├───requirements.txt
│ ├───test_bot2.py
│ ├─── активы
│ │ │
│ │ └───pic.PNG
│ ├─── Крепления
│ │ │
│ │ └───test1.json
│ └─── библиотеки
│ │
│ └───lib1.py
├─── lib.py
├─── test_lib.py
├─── run.py
└─── Provision.py
Каждый подкаталог в ботов
содержит бота. При написании ботов старайтесь использовать изложенную структуру
выше как ориентация.
Тестирование работы бота
Если вы просто хотите посмотреть, как бот реагирует на сообщение, но не хотите настраивать его на сервере,
у нас есть небольшой инструмент, который может вам помочь: zulip-terminal
Примеры вызовов ниже:
> зулип-терминальный преобразователь
Введите ваше сообщение: «12 метровый двор»
Ответ: 12.0 метр = 13,12336 ярда
> zulip-terminal -b ~ / followup.conf продолжение
Введите ваше сообщение: «Задача выполнена»
Ответ: поток: продолжение темы: [email protected]
от [email protected]: Задача выполнена
Обратите внимание, что аргумент -b
(он же --bot-config-file
) предназначен для необязательной третьей стороны.
config (например, ~ / giphy.conf), который применяется только к определенным типам ботов.
Бот API
В этом разделе описаны функции, доступные боту, и структура файла конфигурации бота.
С помощью этого API вы можете
- перехватывать, просматривать и обрабатывать сообщения, отправленные пользователями Zulip.
- рассылает новые сообщения как ответы на обработанные сообщения.
С этим API вы не сможете
- изменить перехваченное сообщение (необходимо отправить новое сообщение).
- отправлять сообщения от имени или выдавать себя за других пользователей.
- перехватывать личные сообщения (кроме личных сообщений с ботом в качестве явный получатель).
использование
использование (собственное)
вызывается для получения информации о боте.
Аргументы
- self — экземпляр, для которого вызывается метод.
Возвращаемые значения
- Строка, описывающая функциональность бота
Пример реализации
использование def (самостоятельно):
возвращение '''
Этот плагин позволит пользователям отмечать сообщения.
в качестве последующих пунктов.Пользователи должны предисловие
сообщения с «@followup».
Перед запуском обязательно создайте поток
называется «продолжение», которое ваш пользователь API может отправить.
'' '
handle_message
handle_message (self, message, bot_handler)
обрабатывает сообщения пользователя.
Аргументы
self — экземпляр, на котором вызывается метод.
- Сообщение
— словарь, описывающий сообщение Zulip
bot_handler — используется для взаимодействия с сервером, например.грамм. для отправки сообщения
Возвращаемые значения
Нет.
Пример реализации
def handle_message (self, message, bot_handler):
original_content = сообщение ['содержание']
original_sender = сообщение ['sender_email']
new_content = original_content.replace ('@ followup',
'от% s:'% (original_sender,))
bot_handler.send_message (dict (
type = 'поток',
to = 'продолжение',
subject = сообщение ['sender_email'],
content = new_content,
))
bot_handler.send_message
bot_handler.send_message (сообщение)
отправит сообщение от имени пользователя-бота. Как правило, это меньше удобнее, чем send_reply , но предлагает дополнительную гибкость о том, куда отправлено сообщение.
Аргументы
- сообщение — словарь, описывающий сообщение, которое будет отправлено ботом
Пример реализации
bot_handler.send_message (dict (
type = 'stream', # может быть 'stream' или 'private'
to = stream_name, # либо имя потока, либо адрес электронной почты пользователя
subject = subject, # тема сообщения
content = message, # содержание отправленного сообщения
))
bot_handler.send_reply
bot_handler.send_reply (сообщение, ответ)
ответит на инициирующее сообщение в том же месте, что и оригинал. сообщение было отправлено с содержанием ответа ответ .
Аргументы
- сообщение — Словарь, содержащий информацию о сообщении, на которое нужно ответить
(предоставляется
handle_message
). - response — Ответное сообщение от бота (строка).
bot_handler.update_message
bot_handler.update_message (сообщение)
будет редактировать содержимое ранее отправленного сообщения.
Аргументы
- сообщение — словарь, определяющий, какое сообщение редактировать и новое содержание
Пример
Из zulip_bots / bots / incrementor / incrementor.py
:
bot_handler.update_message (dict (
message_id = self.message_id, # идентификатор сообщения для обновления
content = str (self.number), # строка, с помощью которой нужно обновить сообщение
))
bot_handler.storage
Распространенная проблема при написании интерактивного бота заключается в том, что вы хотите иметь возможность хранить немного постоянного состояния для бота (например, для RSVP бот, RSVP). Для достаточно сложного бота вам понадобится собственная база данных, но для более простых ботов мы предлагаем удобный способ код бота для постоянного хранения данных.
Интерфейс для этого — bot_handler.storage
.
Данные хранятся в базе данных Zulip Server. У каждого пользователя бота есть ему доступна независимая квота хранилища.
Соображения производительности
Поскольку каждый доступ к bot_handler.storage
будет включать двусторонний
к серверу мы рекомендуем писать ботов, чтобы они выполняли единичный bot_handler.storage.get
в начале handle_message
, а
single bot_handler.storage.put
в конце, чтобы отправить состояние в
сервер.Мы планируем предложить контекстного менеджера, который позаботится об этом
автоматически.
bot_handler.storage.put
bot_handler.storage.put (ключ, значение)
сохранит значение , значение
в записи , ключ
.
Аргументы
- ключ — строка UTF-8 Значение
- — строка UTF-8
Пример
bot_handler.storage.put ("foo", "bar") # установить запись "foo" на "bar"
bot_handler.storage.get
bot_handler.storage.get (ключ)
получит значение для записи , ключ
.
Аргументы
Пример
bot_handler.storage.put ("фу", "бар")
print (bot_handler.storage.get ("foo")) # print "bar"
bot_handler.storage.contains
bot_handler.storage.contains (ключ)
проверит, существует ли запись , ключ
.
Аргументы
Пример
bot_handler.storage.contains ("foo") # Ложь
bot_handler.storage.put ("фу", "бар")
bot_handler.storage.contains ("foo") # Верно
bot_handler.storage marshaling
По умолчанию bot_handler.storage
принимает любой объект в качестве ключей и
values, если он поддерживает JSON. Внутренне объект затем получает
преобразован в строку UTF-8. Вы можете указать настраиваемый маршалинг данных
установив функции bot_handler.storage.marshal
и bot_handler.storage.demarshal
.Эти функции анализируют ваши данные на
каждый звонок на помещает
и получает
соответственно.
Файл конфигурации
[api]
key =
email =
site =
ключ — API-ключ, который вы создали для бота; вот откуда Зулип знает запрос от авторизованного пользователя.
email — адрес электронной почты бота, например
[email protected]
site — URL вашей среды разработки; если вы работаете над среда разработки, размещенная на вашем компьютере, используйте
локальный: 9991
Написание тестов для ботов
Боты, как и большинство программ, с которыми вы хотите работать, должны иметь модульные тесты.В этой секции,
мы подробно описываем наш фреймворк для написания модульных тестов для ботов. Мы требуем, чтобы боты в основном python-zulip-api
репозиторий включает разумный набор модульных тестов, чтобы будущие разработчики могли легко
рефакторинг их.
Модульные тесты для ботов широко используют имитацию. Если вы хотите привыкнуть к насмешкам, стратегии насмешек и т. д., вам следует ознакомиться с нашим руководством по насмешкам.
Простой пример
Давайте посмотрим на простой набор тестов для helloworld
бот.
из zulip_bots.test_lib import StubBotTestCase
класс TestHelpBot (StubBotTestCase):
bot_name: str = "helloworld"
def test_bot (self) -> Нет:
dialog = [
('', 'бип-буп'),
('помощь', 'бип-буп'),
('фу', 'бип буп'),
]
self.verify_dialog (диалог)
Бот helloworld
отвечает звуковым сигналом на каждое @-упоминание этого сообщения. Мы
хотим, чтобы наш тест подтвердил, что бот на самом деле это делает .
Обратите внимание, что наш вспомогательный метод verify_dialog
имитирует диалог для нас, и
нам просто нужно создать список кортежей с ожидаемыми результатами.
Лучший способ узнать о тестах ботов — прочитать все существующие тесты в ботов
подкаталогов.
Тестирование вашего теста
После того, как вы написали набор тестов, вы хотите убедиться, что все работает должным образом.
Расширенное тестирование
В этом разделе показаны расширенные методы тестирования более сложных ботов, у которых файлы конфигурации или взаимодействовать со сторонними API. Код библиотеки тестирования ботов можно найти здесь.
Тестирование ботов с помощью файлов конфигурации
Некоторые боты, например Giphy, поддерживать или требовать параметры конфигурации пользователя для управления работой бота.
Для тестирования такого бота можно использовать следующий шаблон:
с self.mock_config_info (dict (api_key = 12345)):
# self.verify_reply (...)
mock_config_info ()
заменяет фактический шаг чтения конфигурации из файла
system и вместо этого выдает вашему тесту «фиктивные данные».
Тестирование ботов с доступом в Интернет
Некоторые боты, например Giphy, зависеть от стороннего сервиса, такого как веб-приложение Giphy, для своей работы. Потому что мы хотим, чтобы наш набор тестов был надежным и не увеличивал нагрузку на сторонние API, тесты для этих служб необходимо иметь «тестовые приборы»: образцы пар HTTP-запрос / ответ для использоваться в тестах. Вы можете указать, какой из них использовать в тестовом коде, используя следующий вспомогательный метод:
с self.mock_http_conversation ('test_fixture_name'):
# себя.assert_bot_response (...)
mock_http_conversation (fixture_name)
исправляет requests.get
и возвращает указанные данные
в файле fixtures / {fixture_name} .json
. Используйте следующий код JSON в качестве основы для нового
светильники:
{
"запрос": {
"api_url": "http://api.example.com/",
"params": {
}
},
"отклик": {
},
"response-headers": {
}
}
Например, посмотрите на giphy-бота.
Совет: вы можете использовать requestbin или аналогичный инструмент для сбора данных из службы, с которой взаимодействует ваш бот с участием.
Примеры
Ознакомьтесь с нашими ботами чтобы увидеть примеры тестов ботов.
Общие проблемы
Направление будущего
Долгосрочный план для этой бот-системы — позволить ExternalBotHandler Код
, который в конечном итоге можно будет использовать в нескольких контекстах:
- Запускать напрямую с помощью Zulip
call_on_each_message
API, который как работает приведенная выше реализация.Это отлично подходит для быстрого разработка с минимальной настройкой. - Запуск на простом сервере веб-сервера Python, обработка сообщений полученный от исходящей интеграции веб-перехватчиков Zulip.
- Для ботов, объединенных в основную кодовую базу Zulip, включенную через в веб-интерфейсе Zulip, без необходимости развертывания кода.
Как писать для бота. Трехэтапный путь к успеху от… | Пол Бутен
Их можно найти повсюду: бот для крутого человека или бренда, который вам нравится, — это совсем не то, чего вы ожидали.На другой стороне Интернета есть маркетолог, который запустил бота с большими надеждами, но с низкой отдачей.
Люди, разрабатывающие популярных ботов, скажут вам: дело не в том, что вы делаете что-то не так, а в том, что вам нужно активно делать правильные вещи, начиная с того, как ваш бот общается со своими поклонниками. Вот три шага, которые могут предпринять многие, многие создатели ботов, от людей, которые создают одних из самых популярных ботов в Интернете.
Пончо, погодный бот имеет не такое уж секретное оружие: три писателя с опытом создания диалогов и комедий, управляемых персонажами.Стефани Чан, главный редактор Poncho, подробно объяснила в электронном письме:
Личность Poncho всегда была для нас чрезвычайно важна. Это позволило нам наладить легкие отношения с пользователями, а также предоставить комплексные данные о погоде в удобной для восприятия форме. Наша философия контента заключается в том, что все, что говорит Пончо, должно исходить от друга. Это становится еще более важным при создании бота, поскольку пользователи приглашают вас в очень интимное пространство: чат один на один.
Наши сценаристы имеют разное происхождение, но большинство из них имеют опыт работы в комедии.Самое важное, что мы обнаружили, — это нанять писателей, которые понимают, как работать с четко определенным персонажем, передавая информацию в разговорной форме. Для развития этого вида письма на основе персонажей требуется много времени и навыков. Это похоже на телесериал, потому что есть определенные вещи, которые Пончо сказал бы и не стал бы говорить, и есть даже сюжетные линии, которые иногда растягиваются на несколько дней.
С точки зрения пользовательского опыта, наделение вашего бота персонажем помогает определить границы того, что бот может и что не может делать.Он также создает контент, который является родным для среды бота, поскольку вы общаетесь с ботом, как с другом.
Вы подключаетесь к боту рок-группы, и он пишет вам: «Следите за нами за эксклюзивным контентом!» Есть что-нибудь менее качающее? Или: бот знаменитости средних лет говорит карикатурно на миллениалов — awesomesauce !!
Хотя мы знаем, что бот — это не человек, мы хотим подключиться к нашему имиджу этого человека или, в случае популярного бренда, с тщательно продуманным голосом, который современные бренды используют в рекламе и упаковке.
Джош Боканегра, чья компания Persona Technologies создала собственных ботов для Селены Гомес и вымышленного персонажа Кристиана Грея, недавно сказал журналу Chatbots Magazine, что имитировать стиль известной личности — серьезная и детальная работа:
Бот Кристины Милиан пишет точно так же, как и Кристина, включая время набора.Вы должны действительно понять, почему фанаты любят этой конкретной знаменитости, прежде чем вы сможете создать действительно отличный опыт работы с ботом.
Каждое слово, используемое в боте, имеет значение. Каждая фотография, используемая в карусели, имеет значение. Для пользователя важно количество времени, которое бот тратит на набор текста.
Когда пользователь взаимодействует с разделом вопросов и ответов в боте Кристины Милиан, он получает подлинное представление о том, каково это на самом деле писать Кристине Милиан. Мы с Кристиной пишем каждый день. Так что я подражал ее стилю текстовых сообщений в боте.
«Фактически ваш клиент сделал вас другом. И теперь у вас есть доверие друга. Для меня, как подписчика, вы общаетесь со мной один на один, а не транслируете.”- Марк Фруэн, соучредитель и руководитель отдела продаж, Botworx
Копирование и вставка существующего текста и призывов к действию из Интернета, Facebook и Twitter кажется неуместным в боте. Неправильная формулировка, неправильный контекст, и ваш новый последователь может распознать свои входящие от вас сообщения как что-то, что они только что видели где-то в другом месте.
Вы создали персонажа, говорящего знакомым голосом. Теперь, как этот персонаж мог бы послать сообщение последователю лично, только им? Разумеется, используйте их имя и любую личную информацию, которой они поделились, которая помогает в сообщении.
Критики часто жалуются, что тот или иной бот выглядит так, будто его «передали стажеру». Это несправедливо по отношению к стажерам. Фактически, тот, кто настолько привязан к бренду, что работает бесплатно, может быть идеальным человеком, на которого можно потратить время и внимание: создать персонажа. Пишите сообщения знакомым голосом персонажа. И всегда говорите так, как будто это личный разговор. Потому что человек на другом конце не посещает веб-сайт и не проверяет приложение на наличие уведомлений. Они хотят поговорить с другом один на один.
Как написать успешный сценарий для вашего бота
Разработка чат-бота
Автор / разработчик личности бота должен быть человеком, который понимает конечного пользователя или клиента и их UX. Это может быть, но не всегда разработчик. Кому как разработчику следует это писать, если вы не пишете это самостоятельно? Если вы напишете это сами, вот несколько советов, как это лучше всего сделать.
5 февраля 2019 г.
Технология искусственного интеллекта значительно продвинулась вперед за последние несколько лет.Боты становятся более реалистичными, и пользователи привыкли ожидать аутентичного и разговорного взаимодействия. Это представляет собой уникальную задачу для тех, кто создает ботов. Вам нужно не только закодировать функции своего бота, но и создать сценарий для своего бота, что не менее важно.
Три способа создания чат-бота
Когда приходит в голову отличная идея бота, трудно не сразу не погрузиться в нее. Именно здесь разработчики ботов сталкиваются с проблемами. Без хорошо продуманного плана и должного предвидения сценарий для вашего бота может стать беспорядочным.Прежде чем начать, важно выбрать, как вы планируете создавать своего бота.
1. Кодируйте все с нуля
Преимущество написания кода самостоятельно заключается в том, что у вас есть полная свобода настраивать все функции вашего бота. Вы можете использовать открытые источники, такие как Apache OpenNLP или Stanford CoreNLP, чтобы помочь вам на этом пути. Однако вам потребуются предварительные знания в области программирования и опыт работы с такими языками, как Python.
2. Использование платформ NLP для извлечения намерений и сущностей
Хорошая платформа обработки естественного языка (NLP) может облегчить бремя проблем машинного обучения.Такие платформы, как Dialogflow, Wit.ai и IBM Watson, могут использоваться для вашего понимания естественного языка (NLU), сохраняя при этом достаточную степень настраиваемости. К сожалению, вам все равно нужно будет создать код для потока работы вашего бота.
3. Платформы «сделай сам»
Даже тем, кто разбирается в программировании, иногда нужен только простой бот для выполнения работы. Вместо того, чтобы работать над кодом, чтобы получить именно то, что вам нужно, вы можете использовать уже существующие шаблоны ботов. Платформы DIY позволяют перетаскивать функции в чат-бота.Этот процесс быстрый и простой, и он устраняет необходимость кодирования, но его настройка очень ограничена.
Продолжайте разговор
Теперь, когда вы определились с планом создания своего бота, пора буквально перейти к чертежной доске. Вытащите ручку и большой лист бумаги, и начните записывать вопросы, на которые ваш бот должен ответить. Возможно, вы не сможете записать каждый вопрос, который может задать пользователь, но постарайтесь быть внимательным и предугадать, что может быть задано вашему боту.
Ваш черновик может выглядеть примерно так:
Как написать успешный сценарий для вашего ботаАвтор / разработчик личности бота должен быть человеком, который понимает конечного пользователя или клиента и их UX. Это может быть, но не всегда разработчик. Кому как разработчику следует это писать, если вы не пишете это самостоятельно? Если вы напишете это сами, вот несколько советов, как это лучше всего сделать.
После того, как вы выписали свои вопросы пользователей, придумывает ответы для вашего бота. Этот процесс может показаться простым, но помните, что вы, по сути, пишете сценарий для одностороннего разговора, который создается с учетом потребностей ваших пользователей.
Важно привлечь внимание пользователей, чтобы они начали изучать возможности бота. На этом этапе вы можете контролировать ход разговора. Стремитесь направлять своих пользователей ответами, включая опросы, которые побуждают пользователя задать вопрос, на который готов ответить ваш бот. Наличие четко определенного потока разговора имеет первостепенное значение.Нет ничего более разочаровывающего для пользователя, чем ответ: «Я не понимаю, что вы имеете в виду».
Творческий и разговорный UX
Помимо написания сценария для вашего бота для взаимодействия с вашим пользователем, вы должны учитывать взаимодействие с пользователем. Создание бота, который просто информирует и собирает данные, не всегда удерживает внимание пользователей достаточно долго, чтобы достичь цели бота. Чтобы помочь пользователям подключиться к вашему боту, вот несколько рекомендаций по формированию вашего скрипта.
Приветствие
Прежде чем пользователь начнет взаимодействовать с вашим ботом, вам понадобится интригующее, привлекающее внимание сообщение.Лучший способ составить приветственное сообщение — сообщить читателю, на что именно запрограммирован бот, в чем он может помочь и каковы должны быть ожидания пользователя.
Разговорный
Даже если люди знают, что разговаривают с ботом, они хотят чувствовать себя так, как будто они болтают с человеком. Думайте об этом, как будто вы создаете сценарий фильма, но знаете только строки для одного персонажа. Вы хотите, чтобы работа бота была правдоподобной и интересной. Используйте короткие, случайные ответы.
Pacing
Чтобы ваш бот казался более человечным, подумайте о промежутке времени между вопросом пользователя и ответом бота. Если ваш бот делает паузу перед ответом пользователю, создается иллюзия, что ответ набирает человек.
CTA
По мере того, как бот взаимодействует с пользователем, делайте мягкие предложения, которые помогут человеку выполнить задачу. Ваш бот создан, чтобы помочь вам и вашему бизнесу в достижении цели. Простой призыв к действию в нужное время поможет вашему боту усерднее работать на вас.
Справка
Написание сценария не для всех. На это уходит много времени, и вам нужно придумать хитроумные способы заставить бота казаться человеком. К счастью, есть творческие авторы контента, которые пишут сценарии специально для чат-ботов. Итак, если у вас возникли проблемы со сценарием или если сценарий настолько велик, что вам нужна рука помощи, авторы контента, имеющие опыт написания диалогов, хорошо подготовятся, чтобы завершить сценарий за вас.
Скрипт делает бота
Бот-скриптинг — это отдельный набор навыков.Сценарии все еще находятся на ранних стадиях исследований и разработок, и регулярно разрабатываются новые интересные способы улучшения ботов. Ключ к успеху — это заранее планировать, проявлять творческий подход и вовлекать пользователей.
10 ключей к написанию разговоров со звездными ботами
В чистом виде дизайн продукта — это диалог между дизайнером и пользователем. С чат-ботами эта концепция становится все более буквальной. В мире ботов разговор буквально становится пользовательским интерфейсом.Таким образом, качество разговоров, а не пиксели, становится нашим показателем одержимости. И хотя мы все еще находимся на заре этой революции дизайна, ясно, что писатели станут ее пионерами. Если вы сегодня писатель, у вас есть ключи к созданию приятного потребительского опыта. Если вы инженер, возможно, вам стоит подумать о сотрудничестве с писателем, чтобы придать дизайну бота больше индивидуальности и мастерства.
Поскольку диалог находится в центре дизайна продукта, очень важно, чтобы мы разрабатывали рамки и стандарты качества, которые гарантируют, что мы, как отрасль, начнем создавать ботов, которые плавно сочетают текст и код, а не делать быстрых «пердящих ботов», предназначенных для привлечения пользователей.
В качестве моего личного вклада в растущую сферу дизайна разговоров, вот 10 заповедей письма, по которым я живу (полное раскрытие: на самом деле это 10 принципов письма, которыми мы делимся с нашими новыми сотрудниками в Heyday). Не стесняйтесь использовать их, смешивать их и выводить на новый уровень.
- Краткость
Пользователи чат-бота не хотят читать романы. Они хотят быстро добраться до самого необходимого и добиться своей цели. Так что считайте каждое слово.Коротко и мило. Шустрый и запоминающийся. Используйте лаконичный язык и придерживайтесь сообщения. Простота — это искусство. Стремитесь быть Пикассо в обмене сообщениями.
- Четкость
Одно сообщение означает одно намерение и одно желаемое действие. Не перегружайте пользователей сразу несколькими сообщениями и призывами к действию. Сделайте разговор подробным, прогрессивным и естественным. Чисто и ясно. О, и не бойтесь использовать кнопки для управления пользовательским опытом. Пишите для обычного Джо, а не для доктора наук по неврологии.
- Специфичность
Мы не можем переоценить это. Специфика — ясность на стероидах. Избегайте открытых вопросов или утверждений. Люди обычно непредсказуемы, а боты плохо справляются с непредсказуемостью (по крайней мере, пока). Поэтому избегайте двусмысленности любой ценой. Не открывайте дверь для неправильного толкования, иначе разговор, скорее всего, выйдет за рамки темы и приведет к разочарованию в чате. Будьте очень конкретны в том, чего вы ожидаете от пользователей и чего они могут ожидать от вас.
- Личность
Если говорить кратко и мило, это не значит, что нельзя привить здоровую дозу индивидуальности и юмора. Это на самом деле жизненно важно, если вы хотите, чтобы пользователи вовлекались в работу с течением времени. Это особенно верно, если вы создаете ботов для брендов. Не впадайте в режим жесткой продажи и убедитесь, что вы изучаете тон и манеру бренда. Бот — это продолжение личности бренда, поэтому очень важно, чтобы он отражал его дух и ценности. Личность оживит вашего бота и заставит пользователей возвращаться к нему снова и снова.
- Интерактивность и изображения
Как писателю заманчиво полагаться только на слова. Но иногда картинка действительно стоит тысячи слов. Сделайте беседу наглядной и интерактивной. Люди склонны больше интересоваться, когда вы соблюдаете правильный баланс между текстом и изображениями. Не бойтесь использовать изображения, чтобы убедительно продемонстрировать различные варианты. Скорее всего, вы увидите, что уровень вовлеченности вырастет.
- Человечество
Вы же не хотите, чтобы у людей было ощущение, будто они разговаривают с машиной.Вы хотите, чтобы они чувствовали себя так, будто болтают с другом. Естественный язык, выражения и смайлики — хорошие способы сделать разговор более разговорчивым. Бежевый и мягкий — ваши злейшие враги. Сделайте взаимодействие человечным, даже если вы честно говорите о том, что это бот.
- Целостность
Будьте откровенны обо всем. Не заставляйте пользователей думать, что бот — реальный человек; управляйте ожиданиями в самых первых взаимодействиях.Если вы честно скажете о возможностях и ограничениях бота, пользователи, скорее всего, будут действовать честно и следовать правилам. Если вы попытаетесь быть слишком умным, они попытаются перехитрить вас и выставят вас дураком. И они, скорее всего, добьются успеха.
- Коммунальное хозяйство
Правило №1: Будьте полезны. Правило №2: См. Правило №1. Чат-боты — идеальный канал для построения отношений, основанных на ценности. И лучший способ создать ценность для людей — быть надежным другом, к которому они могут обратиться, когда у них возникнет вопрос или что-то понадобится.Всегда будьте на службе у пользователя, будь то удовольствие или функциональность. Если вы сделаете это, они вознаградят вас своим вниманием и, в конечном итоге, своими деньгами (или любой другой конечной целью, которую вы пытаетесь достичь).
- Оригинальность
Боты интересны, потому что они предлагают бесконечный спектр возможностей. Будьте оригинальны в своем подходе, даже если вы создаете простые функции. Создаете бота для часто задаваемых вопросов? Ответом бота может быть текстовое сообщение, галерея изображений, видео, цитата другого пользователя или что-то еще.Старайтесь время от времени смешивать форматы, чтобы пользователи всегда были вовлечены. На первый взгляд боты могут показаться жесткими рамками, но на самом деле они больше похожи на площадку для творчества, чем многие могут себе представить.
- Возможность адаптации
И последнее, но не менее важное: отличный дизайнер бесед может предсказать сценарии и подготовиться к неожиданностям. Убедитесь, что ваш бот может адаптироваться к непредсказуемым поворотам в разговоре и разумно реагировать. Наличие резервных сценариев, которые устанавливают границы, — это разумный способ сохранить разговор в нужном русле.Пасхальные яйца — тоже большой плюс. Проявление своей находчивости всегда оставляет у пользователей положительное впечатление.
VentureBeat
Миссия VentureBeat — стать цифровой городской площадью, где лица, принимающие технические решения, могут получить знания о преобразующих технологиях и транзакциях. На нашем сайте представлена важная информация о технологиях и стратегиях обработки данных, которая поможет вам руководить своей организацией. Мы приглашаем вас стать участником нашего сообщества, чтобы получить доступ:- актуальная информация по интересующим вас вопросам
- наши информационные бюллетени
- закрытого информационного лидера и доступ со скидкой к нашим призовым мероприятиям, таким как Transform 2021 : Подробнее
- сетевых функций и многое другое
Могут ли боты писать статьи?
Да, теперь боты могут писать статьи.Все, кто пользуется Интернетом, взаимодействовали с ботами. Боты общаются с нами в приложениях, оставляют комментарии к статьям и видео, а также пишут сообщения в социальных сетях. Мы знаем, что боты могут связно складывать слова.
Боты уже пишут статьи
Возможно, вы уже читали новостную статью, написанную ботом, даже не осознавая этого. В 2014 году Associated Press внедрила автоматизированную систему, которая может самостоятельно писать статьи. AP назначила своего бота для покрытия квартальной прибыли компаний.
Ежеквартальный доход компании— это идеальное задание для компьютера, потому что оно обычно простое и не требует творческого синтаксиса, но требует точности. Раньше AP публиковало квартальную прибыль только для 300 компаний. Поскольку они использовали бота для выполнения своей работы, количество компаний, о которых они сообщают, увеличилось до 3000.
Но запись — это не данные. Это средство выражения, которое подразумевает, что вам есть что выразить.Неразумной компьютерной программе нечего выразить, не считая того факта, что у нее нет опыта окружающего мира, который мог бы сказать ей, что под водой не бывает пожаров. — Стивен Пул, Хранитель
AP — не единственное журналистское агентство, использующее программу создания естественного языка. В Los Angeles Times есть бот, который пишет последние новости о землетрясениях. Wired даже опубликовал некролог Марвину Мински, пионеру искусственного интеллекта, который написал бот.
Шведский мужчина по имени Сверкер Йоханссон создал компьютерную программу для написания статей в Википедии. Всего бот написал 2,7 миллиона статей. Это около 8,5% всех статей в Википедии — больше, чем когда-либо писал кто-либо.
С тех пор в игру вступил и Илон Маск.
Боты заменят журналистов?
Итак, учитывая, что все эти боты уже пишут статьи, вы, вероятно, задаетесь вопросом, заменят ли журналистов компьютерами.На данный момент ответ — нет.
Во-первых, боты еще не умеют создавать сложные новостные сюжеты. Есть десять компаний, для которых бот AP не может писать квартальные отчеты о доходах, потому что отчеты слишком подробны для компьютера. Эти компании включают CitiGroup и Wells Fargo.
The Atlantic опубликовала статью с заголовком «Компьютер попытался (и потерпел неудачу) написать эту статью». Подробная статья о потенциале искусственного интеллекта в журналистике была слишком сложной для машины, а предложения, которые она выдавала, были непонятными.
Так что боты должны придерживаться основ, по крайней мере, на данный момент. И это полезно, а не во вред журналистам-людям. Если газета поручает боту писать простые, несколько скучные истории, такие как квартальный доход, статистические отчеты и прогнозы погоды, люди-журналисты могут тратить свое время на более интересные, творческие и подробные истории.
Например, в то время как бот AP писал основную статью о квартальных доходах Apple, репортер Брэндон Бейли мог написать более сложную историю, в которой доходы компании рассматривались в контексте и включались цитаты руководителей Apple.
Текущие ограничения ботов не исключают возможности их замены в будущем журналистами-людьми. Искусственный интеллект постоянно совершенствуется. Когда бот AP только начинал писать статьи, каждую статью проверял редактор, который исправлял и записывал ошибки, чтобы улучшить программу. Три месяца спустя AP начало публиковать истории бота без вмешательства человека. Компьютеры учатся быстро.
Можно ли использовать ботов для ведения блогов?
Итак, что боты могут предложить блогосфере? Можете ли вы (и должны ли) использовать ботов для написания статей в блог?
Уже существует несколько платформ для письма с искусственным интеллектом, которые могут использовать каждый.Компания Automated Insights, с которой работает AP, теперь предлагает всем желающим бесплатные пробные версии своего программного обеспечения. Другой подобный вариант — это Нарративная наука.
В зависимости от типа создаваемого вами контента боты могут работать или не работать для вашего блога. Боты могут избавить вас от кропотливой работы, но у них еще нет творческих способностей, которые есть у людей, а ведение блогов обычно требует творчества и чутья. Так что в большинстве случаев боты не лучший вариант для тех, кто начинает вести блог. Но если у вас много данных, таких как спортивные результаты, погода, данные компании и т. Д.тогда машинное обучение и искусственный интеллект могут быть благом, потому что они могут создавать масштабные отчеты, подобные человеку.
Опять же, при правильном участии человека компьютеры способны производить почти все. Японские исследователи недавно создали небольшой роман, почти полностью написанный на компьютере. Исследователи дали компьютеру базовую структуру рассказа, а также образцы слов и фраз, которые они хотели использовать. Затем программа написала текст.Сообщается, что Google использовал любовные романы для обучения своего ИИ.
Только время покажет, улучшатся ли компьютеры в достаточной степени, чтобы воспроизвести творческий потенциал и искренность человеческих блоггеров. Насколько мне известно, бот еще не создал успешного блога.
Эта статья была, к сведению, написана человеком, а не ботом (… или это было так?).
Часто задаваемые вопросы
Могут ли боты писать статьи?
Да, теперь боты могут писать статьи. Боты общаются с нами в приложениях, оставляют комментарии к статьям и видео, а также пишут сообщения в социальных сетях.
Боты заменят журналистов?
Ответ пока отрицательный. Во-первых, боты еще не умеют создавать сложные новостные сюжеты.
Можно ли использовать ботов для написания блогов?
Ботов можно использовать для написания статей в блогах, но качество будет не таким, как при использовании для этого настоящего человека. Боты могут избавить вас от кропотливой работы, но у них еще нет творческих способностей, которые есть у людей, а ведение блогов обычно требует творчества и чутья.
пошаговых сценариев написания чат-бота — MindK Blog
С той скоростью, с которой сегодня развиваются технологии искусственного интеллекта, традиционный интерфейс может вскоре стать пережитком прошлого. Будущее, похоже, будет принадлежать новому типу пользовательского интерфейса, основанному на продвинутых скриптах чат-бота.
В этой серии из трех частей раскрываются основные принципы, лежащие в основе диалоговых интерфейсов.
Итак, очистите пишущую машинку от пыли, сварите ведро черного как смоль кофе и наденьте шляпу писателя.
# 1 Записать фрагменты диалога и сопоставить их с потоками разговоров
Узнайте как можно больше о потенциальных пользователях. Какие ответы они могут искать, разговаривая с вашим ботом? Как это может улучшить их опыт? Действительно ли чат-бот — лучший способ решить свои проблемы?
Теперь, когда вы рассмотрели свои цели, вы можете приступить к разработке чат-бота.
Прежде чем вы начнете писать, выберите инструменты, которые позволят вам организовать ветвящиеся диалоговые деревья.Вы можете попробовать BotMock, ArcTouch, Lucidchart, Twine, Chat Mapper, Draw.io, inklewriter или Xmind. Или вы можете сделать это по старинке с большим количеством бумаги.
Подходите к этому так, как будто вы пишете пьесу или, что еще лучше, историю, которую вы выбираете сами.
Ключевое отличие здесь в том, что игра — это сплоченная работа, в то время как скрипты чат-бота можно разделить на относительно небольшие независимые фрагменты:
У вас есть только один шанс произвести первое впечатление, поэтому сделайте свое приветствие как можно более привлекательным.И не забывайте побуждать пользователей отвечать вам.
«Привет, человек! Я Shopbot 2000, ваш потрясающий проводник в мир электронной коммерции ».
«Введите / shop, чтобы увидеть категории, или просто скажите мне, что вы хотите».
На этом этапе может быть хорошей идеей использовать кнопки, быстрые ответы и карусели, чтобы проиллюстрировать различные варианты взаимодействия пользователей с вашим чат-ботом.
Они отлично подходят для имитации реальных разговоров. Просто сведите к минимуму болтовню для утилитарных ботов.
«Как дела?» Вот гифка с котиком, чтобы подбодрить вас «.
- Объективные фрагменты
Взаимодействие с чат-ботом обычно включает ряд вопросов, которые помогут вам определить потенциального клиента и совершить конверсию.
«Вы выбрали категорию кроссовок. Пожалуйста, выберите понравившийся товар ».
«Отличный выбор, теперь выберите свой размер».
«Ваш размер 9.5, понял. Какого цвета ты хочешь? У нас есть розовое, черное и белое ».
Все, что вам нужно сделать после того, как пользователь совершит конверсию, — это поблагодарить его за внимание и напомнить вернуться, если ему когда-нибудь что-то понадобится.
«Всегда рад помочь тебе, Джон! Напишите ответ, если вам что-то понадобится ».
Ваше последнее сообщение чрезвычайно важно, так как это первое, что увидят пользователи, открыв мессенджер. Вы можете быть конкретным, креативным или подстрекательским, но никогда не скучным!
Бонусный совет: добавьте имя пользователя к заключительному слову для индивидуального подхода.
Запишите каждый фрагмент отдельно, а затем сопоставьте их с потоками беседы.
Связанные вместе они образуют бесчисленное множество диалогов.
Помните, что пользователи могут путешествовать только по одному пути за раз. Поэтому убедитесь, что каждый отдельный разговор идет в хорошем русле и имеет смысл сам по себе.
А теперь познакомимся с нашими персонажами.
# 2 Научите своего бота реагировать на ввод пользователя
Пользователь — главный герой вашей пьесы.
Хотя вы не можете контролировать, что он скажет в каждой ситуации, вы можете это предсказать. Без способного искусственного интеллекта, стоящего за вашим ботом, вам придется научить его множеству альтернативных фраз.
Начните с уровня предложения. Обсудите различные конструкции, которые ваши клиенты могут использовать в той или иной ситуации. Тогда приступим к словам.
Найдите как можно больше синонимов, включая сленг и диалектные слова.
Последний уровень — обучение вашего разговорного чат-бота обычным орфографическим ошибкам.
Примечание. Библиотеку нормализатора можно использовать для преобразования британской и канадской орфографии в ее американский вариант, расшифровки популярных сокращений и исправления более 4000 слов с ошибками.
Второй персонаж в спектакле — ваш бот.
Помните, диалог в хорошей пьесе не только продвигает сюжет, но и дает нам представление о характерах персонажей. Точно так же диалог бота должен как двигать пользователей к их целям, так и рассказывать им о вашем бренде.
Вот как этого добиться.
При написании скрипта чат-бота вы всегда должны помнить о целях вашего диалогового интерфейса.
Всегда старайтесь вернуть своих пользователей к теме. Блуждание в темном и страшном лесу замысловатых диалоговых деревьев быстро превратит их в больших грустных троллей.
Итак, уважайте своих пользователей и их время!
Номер:
Да:
Оставаться в теме как чемпион
Говорите как настоящий человек, но никогда не притворяйтесь им!
Эта ошибка часто встречается среди чат-ботов службы поддержки клиентов.
Большинство пользователей предпочитают веселый стиль общения, напоминающий разговор со старым другом. Поэтому, если ваш персонаж-бот не шикарный джентльмен, используйте простую грамматику и избегайте замысловатых формулировок. Обращайтесь к своим пользователям напрямую и, если возможно, используйте их имена.
Номер:
Да:
К настоящему времени вы должны создать подробное руководство для своего бота. Документ должен включать информацию о персонаже, такую как возраст, пол (даже у Roomba есть), род занятий, интересы, личность и т. Д.
После того, как вы создали привлекательную личность для своего бота, вы должны оставаться в его характере. Так что не забывайте придерживаться своего стиля, словарного запаса и тона, поскольку никому не нравится болтать с ботом, который, кажется, имеет раздвоение личности.
Странный, но согласованный бот Кэти Перри
Краткость — лучший друг писателя.
Сообщение бота не должно быть длиннее трех строк текста на мобильных устройствах (от 60 до 90 символов).
Но если вам абсолютно необходимо представить пользователям стену текста, разделите ее на несколько речевых пузырей, чтобы выделить негативное пространство.
То же, что и с абзацами.
Также помните, что поток предложений из одного слова сделает вашего чат-бота ненужным роботом. Так что смешайте их. Окружение коротких замечаний более длинными предложениями подчеркнет их. Сделайте их сильнее. Поразительнее.
Говорите коротко. Каждый вопрос является препятствием для конверсии, поэтому убедитесь, что пользователи могут удовлетворить свои потребности за минимальное количество шагов.
Номер:
Это может работать для чат-ботов на веб-сайтах, но слишком долго для мессенджеров.
Да:
Достаточно, чтобы объяснить цель бота и дать представление о том, что его ждет в будущем.
Когда мы запустили нашего первого бота для HipChat (теперь Slack), мы обнаружили, что большинство пользователей хотели свести его с ума.
Они перепробовали все, от шутливых шуток и случайных вопросов до оскорблений и тарабарщины.
В конце концов, MindkOfficeBot (творческое название, верно?) Просто сдался. В последний раз, когда мы слышали о нем, он основал собственную рок-группу
.Урок? Люди всегда будут пытаться обмануть вашего бота, и постоянный поток «, я не знаю, » очень быстро устареет.
Номер:
Снова и снова отправка пользователей в Википедию с помощью кнопки «Подробнее» действительно разочаровывает
Да:
Так что подготовьте несколько умных ответов на случай, когда пользователи поднимут неподдерживаемые темы, и верните их к основным функциям бота.
Просто не забывайте проявлять сочувствие и никогда не оскорблять пользователей.
Лингвисты часто используют термин дискурс для описания разговора со всем контекстом, включая возраст собеседников, пол, профессию, их социальное положение, тему разговора, место, где он происходит, отношение общества к обсуждаемым вопросам и т. Д. .
Разговор между профессором и его учеником будет отличаться от разговора между двумя сверстниками.
Хотя здесь меньше переменных, чем в реальном разговоре, контекстная осведомленность чат-ботов — одна из самых сложных вещей в диалоговом пользовательском интерфейсе с технической точки зрения.
Как писатели и дизайнеры, мы можем создавать потоки, которые используют ранее полученную информацию. Мы можем написать скрипт чат-бота, который учитывает все доступные данные о наших пользователях, а также обстоятельства разговора (где? Когда? Почему?)
Старый совет по копирайтингу гласит, что вы должны писать для конкретного человека (даже если Мэри-Джейн Шлзрвич существует только в вашей голове), а не для неопределенной целевой аудитории.
Подумайте о настроении ваших клиентов. Если им понадобится техническая поддержка, они, скорее всего, будут расстроены или разочарованы. Это не лучшее время для того, чтобы сделать вашего бота забавным или умным, поэтому сделайте это профессионально.
Теперь, в более счастливом контексте (например, при заказе путевки), ваш бот может проявить немного индивидуальности.
В предыдущей статье о чат-ботах я говорил о важности исследования пользователей. Существует ряд шаблонов, которые можно использовать для создания подробных образов пользователей и корректировки текста, чтобы они лучше им подходили.
Отслеживайте точку входа пользователя, чтобы угадать его цели и ожидания. Узнайте, посещали ли они вашего бота раньше, и поприветствуйте вернувшихся посетителей.
Просто убедитесь, что у вашего бота больше внимания, чем у золотой рыбки!
Отслеживайте точку входа пользователя, чтобы угадать его цели и ожидания. Узнайте, посещали ли они вашего бота раньше, и поприветствуйте вернувшихся посетителей.
Просто убедитесь, что у вашего бота больше внимания, чем у золотой рыбки!
Источник: Techcrunch
Добавьте альтернативные ответы к лексикону вашего бота.Помните, ничто не разрушает иллюзию разговора с человеком больше, чем получение ряда идентичных ответов.
Одно дело, когда ваш интерфейс приветствует пользователей фразой « Hello! », это совсем другое, если он также может сказать« Как поживаете! »,« Привет, [имя]! »и« Доброе утро / Добрый вечер »(в зависимости от времени суток).
Чем больше ответов вы придумаете для одного ввода, тем более человечным будет выглядеть ваш бот.
Помните, что вы можете использовать кнопки, быстрые ответы, меню, эмодзи, изображения, GIF-файлы и другие мультимедийные элементы, чтобы сделать своего бота более привлекательным.
Номер:
Да:
Тот момент, когда кот лучше тебя орфографирует.
Независимо от того, сколько альтернативных ответов у вас есть, ваш бот в какой-то момент повторится. Вы можете использовать такие моменты в своих интересах.
Когда пользователи жалуются на одинаковые строки, скажите что-нибудь умное:
«Повторяете мои строки? Нет, просто проверяю, обращаете ли вы внимание.”
- Добавьте последние штрихи
После завершения разговора не упускайте шанс повторно привлечь пользователя.
Как и в случае с push-уведомлениями, самые важные сообщения — это те, которые ваши клиенты выбрали для себя.
Так что предложите возможность подписаться на своего бота и получать полезные сообщения. Просто не забудьте, что пользователи могут отказаться от подписки в любой момент.
Skyscanner находит дешевые авиабилеты и отправляет их по подписке
И не забудьте, что прочитает вслух части бота после того, как вы закончите скрипт, чтобы увидеть, звучит ли разговор чат-бота естественно (это особенно важно для голосовых приложений)!
Теперь писать сценарии чат-бота намного проще, если за вашим ботом стоит настоящий ИИ.