Русский
Русский
English
Статистика
Реклама

Боты

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

23.02.2021 18:07:11 | Автор: admin


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

Я студент Новосибирского Государственного Технического Университета, не так давно мы с парочкой моих друзей реализовали во всех возможных областях научной деятельности. Мы помогаем сводить заинтересованных преподавателей и студентов всех ВУЗов Сибири, чтобы проектная научная деятельность развивалась по территории Сибири и РФ.

Студенты и преподаватели часто обращались ко мне с вопросами и я решил автоматизировать этот процесс, написав ботов для ВК и Телеграм.

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

Я использовать Python версии 3.6 просто потому, что он самый простой для меня. Кодил в PyCharm Community Edition. Весь код опубликован на. Удачи!

1. Предварительные приготовления для телеграм-бота


1.1 Получение токена от Bot Father в телеграмме


Первым делом, нам нужно зарегистрировать нашего бота в Telegram.

Для этого, в поисковике телеги ищем BotFather

далее, делаем всё также, как показано на скриншотах:



После нажимаем на команду /newbot или же прописываем вручную.



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



1.2 Переходим в любой редактор кода и создаем файл


Перед созданием данного файла, нам нужно выбрать директорию, в котором будет реализован весь функционал бота. Если вы используете PyCharm Community/Professional Edition, то предлагаю просто создать новый проект, и писать там весь функционал бота.

Если Вы используете любой другой редактор, такой как Sublime Text 3, например, то Вам самостоятельно придётся создать директорию, создать виртуальное окружение, и работать из консоли со всеми предварительными тестами. Во избежание трудностей, предлагаю скачать продукт PyCharm Community Edition от компании JetBrains, с помощью данного продукта можно обойти действия, описанные в предыдущем абзаце, так как данный продукт сделает их самостоятельно, от Вас потребуется только указать путь до интерпритатора Python в конфигурациях PyCharm, с помощью которого и будет работать Ваш бот.

В данном файле () будет храниться только токен, который нам дал BotFather, поэтому пишем:

token = "Здесь хранится Ваш токен".

1.3 Cоздаём главный файл


Делаем cледующие импорты и для соответствующих библиотек, в консоли прописываем закоментированные строчки:

import configimport telebot # pip install telebotfrom 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, для форматирования текста.

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

# RUNif __name__ == "__main__":try:bot.polling(none_stop=True)except ConnectionError as e:print('Ошибка соединения: ', e)except Exception as r:print("Непридвиденная ошибка: ", r)finally:print("Здесь всё закончилось")

Сделаем первый запуск! Для этого, в PyCharm-е нажмём зеленую кнопку старт в правом верхнем углу или же, можно запустить из консоли командой: python



Результат первого запуска:



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 элементов, которые также можно будет обработать по установленной callback_data. Элементы данной клавиатуры будут расположены друг под другом, так как в строке 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()

Здесь происходит следующее:

  1. Отправляется прощальный стикер.

  2. Закрывается встроенная клавиатура (строка 44).

  3. Отправляется прощальное сообщение.


Так как мы используем bot.polling, с параметром none_stop = True, то пользователь может снова вознообновить общение с ботом при помощи команды /start или /go, обработка которых показано в пункте выше.

Результат:



ВК БОТ

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

1. Предварительные подготавления


Установим следующие библиотеки по тем же технологиям:

import vk_api # pip install vk-apiimport json  # pip install jsonfrom vk_api.longpoll import VkLongPoll, VkEventType

1.1 Получение токена для сообщества Вконтакте.


  1. На главной странице сообщества найти раздел Управление
  2. Работа с API
  3. Создать ключ. Выбираете нужные для вас пункты, которые будут доступны боту.

В итоге должно получиться примерно следующее:

Берем ключ и переходим в среду разработки и делаем следующее:

vk = vk_api.VkApi(token="Ваш_токен")

Далее следующее:

longpoll = VkLongPoll(vk)

На этом, закончим подготавления.

2. Разворачиваем функционал


Первым делом создадим файл

Cоздадим прототип встроенной клавиатуры ( всё с помощью документации 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_idself._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 это особый словарь, у которого значения ключей это текст из файла, где я расположил текст в виде строк, поэтому, чтобы не загромождать код я и вынес основной текст в другой файл.

(Пример кода из файла)

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 valuereturn "Не понимаю тебя "

3. Возвращаемся в и дописываем функционал


Теперь в первых строках нам необходимо проимпортить файл vk_bot. А также нам потребуется библиотека random.

import random # pip install randomfrom 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:


Подробнее..

Странные управленческие решения внутри хостинга

15.06.2021 14:10:21 | Автор: admin
Звонит как-то вендор и говорит, что в возврате бракованного железа не их жёсткий диск.


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

Гарантийный отдел ковыряется с диском, а потом звонят:

А зачем вы подменили диск?

Мы такие:

В смысле подменили?

Мы вам продавали другой. А тут корпус тот, а внутри другой. Какие-то следы от отвёртки.

Дичь полнейшая! Мы начали было ругаться, но потом стали разбираться. Начали смотреть на камеры и увидели, что наш сотрудник очень подозрительно себя вёл, когда работал с этим диском в стойке. Как в плохих комедиях про жуликов: постоянно осматривался по сторонам, отходил в сторону, возвращался. Оказалось, что он подменил диск. Честно, я не знаю зачем. Его финансовая выгода минимальная, скорее всего, даже не окупает время работы по замене корпуса.

У нас было ещё несколько странных ситуаций, и сейчас я о них расскажу.

Форекс-трейдер


VDS часто покупаются для торговли на биржах. Ну, на нормальных биржах: я имею в виду тех, где важно географическое расположение сервера для минимизации задержек. Но есть и биржи уровня Форекса. Вернее их даже биржами назвать нельзя. Это на сленге трейдеров кухня. Напомню, что многие из них попали в список компаний с признаками нелегальной деятельности, который завёл ЦБ. У меня есть глубокое личное убеждение, основанное на здравом смысле и математике, что система работает как качели для вытаскивания денег из не самых разбирающихся в вопросе клиентов. Возможно, это не так, но свою точку зрения я могу аргументировать и обосновать при необходимости. Но в истории важно другое. Звонит мой знакомый, который взял у нас сервер в Швейцарии. И вот он начинает в открытую меня и всех наших сотрудников обвинять в том, что мы залезаем к нему на сервер в процессе торгов и вмешиваемся в его форекс-сделки.

По его словам, он придумал великую стратегию, а убыточные сделки берутся рынком, плюсовые же вовремя не берутся, игнорируются. И в этом виноваты мы. Точнее, сначала он обратился с задачей, что его не устраивает производительность сервера. С его слов, она радикально падала в момент выхода новостей. В 16:30, когда выходит мировая статистика. В этот момент времени все трейдеры, кто работает с помощью автоматических торговых систем, начинают многократно усиливать свою активность. Если, грубо говоря, внутри дня он делает десять сделок, то в эти 16:30 и одну минуту он может сделать сто сделок. Естественно, это создаёт пик нагрузки, причём не локально, а на принимающем сервере. Но трейдер этого не понимает, он думает, что у нас сервер именно в 16:30, когда ему надо выставить заявку или закрыть заявку, тормозит. А это совпадает с самым нужным временем. И не верится, что это просто совпадение.

Поскольку это был мой знакомый, сначала я потратил неделю на то, чтобы провести ему курс ликбеза про то, как работают серверы и как работают биржи. Потом выделил админа, чтобы он проверил лично его сервер. Потом началось: Ты меня привёл сюда, ты там лазишь, воруешь мою торговую стратегию, ты вор, ублюдок Ты мне врёшь. Вы залезаете ко мне, ты знаешь, что у меня там классный торговый робот, ты хочешь его своровать. Ты залезаешь ко мне на сервер, ты мне гадишь статистику. Это ты подкручиваешь настройки, чтобы у меня ничего не работало. Перешёл на другой хостинг. Потом вроде ещё и ещё. И только через два года мы начали общаться снова, он признал, что я был прав. Но к этому моменту он уже влез в долги.

Здесь главная проблема работа со знакомым. Если бы это был просто клиент, то мы бы провели диагностику и не получали оскорблений.

Игровые серверы школьников


Школьники довольно часто размещают у нас игровые серверы. Это, скажем так, сложные клиенты, потому что они выбирают третий по цене тарифный план. Первый это промо за 30 рублей в месяц (по цене IP), второй урезанная версия стандартных конфигураций за 130 рублей и третий уже полноценный сервер от 300 рублей в месяц.

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

Поддержка вежливо объясняет суть проблемы и предлагает подключить защиту от DDOS-атак за 400 рублей (причём первый месяц бесплатно). По нашей практике, потом можно будет играть совершенно спокойно. На что клиент начинает нас обвинять в том, что это мы специально дидосим его, чтобы он нам заплатил ещё. Далее закономерно встаёт вопрос о возврате средств, и обычно мы средства возвращаем и с лёгкостью расстаёмся с таким клиентом.

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

Клиент пишет заявку на возврат средств, мы отправляем её в платёжный шлюз. И вдруг владелец удаляет сервер, начинаются тот самый мат и дикие крики про то, что вернуть надо на его счёт, а не на счета плательщиков. То есть условно у них было порядка сорока оплат по 100 рублей, и все их платёжный шлюз собирался распихать обратно по тем самым карточкам, с которых они платили. Но главному герою нужен был возврат на один свой счёт. В общем, в ходе диалога с поддержкой он уже прямо признался, что хотел получить чужие деньги. Через пару месяцев эта же история повторилась с минимальными вариациями с другим школьником.

Самый короткий детектив


Бывает, наши серверы берутся для обхода блокировок. Люди разворачивают VPN и просто ходят через наш сервер в большой интернет, если на работе он заблокирован. Ну или просто берут сервер в другой юрисдикции типа Швейцарии и ходят через него. Почему это важно, есть вот тут про маски-шоу.

И вот пишет клиент, что наш сервер не отвечает.

Мы просим трассировку. Клиент делает, присылает. Мы сообщаем, что RDP блокирует его отель, и желаем приятного отпуска в Таиланде. Клиент немного в панике, но мы поясняем, что его Wi-Fi-точка названа именно по отелю. И даём ссылку на то, как это обойти. В тот раз помогло.

Регистрации под ботами


Очень странная ситуация была с тестовыми периодами на наших 32-ядерных машинах. Кто-то научился брать американские номера, парсить голос, русский текст и цифры. Как только криптовалюты совершали очередной прыжок, начинались авторегистрации, а дальше серверы использовались (судя по характеру нагрузки) для майнинга криптовалют. Не знаю, что это было, но майнить биткоин на VDS без видеокарты идея откровенно так себе. Процессор уходит в потолок, три дня они пытаются что-то там сделать, потом период заканчивается. Мы обновили капчи, но на следующей волне скачка курса биткоина снова начались авторегистрации. Я откровенно не понимаю, какой в этом смысл, ведь аренда американского номера стоит дороже, чем возможный профит с майнинга на процессоре три дня. Сейчас эти волны мы наконец-то победили.

Блокировки по IP


Мы выдаём один статический IP клиенту при аренде сервера. Это не карусель динамических адресов, не замены раз в месяц, а конкретный IP, привязанный к клиенту. Сначала мы проверяем его чистоту и отсутствие во всяких чёрных списках, а потом даём клиенту.

Дальше клиент может испортить этот айпишник. Например, инста-блогерки и инста-блогеры часто разворачивают у нас средства накрутки Инстаграма. Инстаграм их ожидаемо банит через некоторое время. Дальше в поддержку начинаются обращения: Почему меня забанил Инстаграм?! с кучей смайликов. Или: Почему меня забанило Авито, смените мне IP-адрес, но про Авито смайликов почти нет.

Ещё накручивают отзывы и просмотры на Амазоне. Потом в поддержке: Ребята, это мой не первый аккаунт, можете, пожалуйста, сменить мне IP-адрес, потому что меня забанило?

Бывает так, что админ настраивает клиенту работу на сервере, но забывает уточнить вопрос про лицензии. Звонит генеральный директор, у которого 25 сотрудников, и они все сидят на удалённом рабочем столе, у нас размещали соответственно. Весь замес в том, что системный администратор, который это настраивал, был на аутсорсе. Он настроил кучу виртуальных рабочих мест. Человек платил около 35 тысяч. У него там размещалось 25 сотрудников, и 120 дней человек вообще не знал никакой проблемы с подключением к удалённому рабочему столу. А цимес в том, что Майкрософт даёт триалку на размещение этого удалённого сервера рабочих столов 120 дней ровно. Человек четыре месяца, получается, пользуется, и тут внезапно посреди пятого месяца обнаруживает, что у него ни один сотрудник не может зайти. Диктует нам ошибку, мы всё прекрасно понимаем, что у него там происходит. И предлагаем ему два варианта:

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

В общем, ребят, я не буду платить тройную цену от сервака.

Неудивительно, потому что лицензия стоит 91 тысячу рублей, а у него сервак стоит 36 тысяч.

Ребята, надо, короче, решать. Давайте так: мне по-любому нужно это бесплатно. Что если мы оформим договор на другое лицо, и таким образом у меня будет ещё 120 дней? А что если вы измените человека, у меня сейчас есть знакомый, он зарегистрируется?

А вы точно понимаете, что сейчас у официального партнёра MS спрашиваете, как их же обмануть?

Да! Ребята, какие ещё варианты есть?

Неожиданный уход коллеги


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

И вот одна из ситуаций. Сотрудник взял и не пришёл на работу. Работал-работал и потом пропал. Выходного интервью нет. Начали разбираться, что же случилось, может быть, обиделся на что-то. Никаких внутренних предпосылок. Уже потом начали общаться с ним удалённо, он прислал ссылку на статью на Хабре про профессиональное выгорание.

Это ничего не объясняло, но дальше удалось поговорить. Сотрудник сказал, что внимательно всё прочитал и не хочет, чтобы это случилось с ним. Поэтому увольняется.

Никаких выводов и действий. Просто, возможно, он счастлив где-то ещё.

Дебош


На корпоративе сотрудник устроил жутчайший дебош. Страшнее представить сложно! Сначала дрался с коллегами, потом начал нападать на случайных людей вокруг. Кое-как скрутили и прижали к полу. Подошёл мужик, начал кричать, что мы ограничиваем свободу человеку, столкнул с него двух человек. Наш герой встал и дал правозащитнику мощного леща, после чего уже и он помогал его держать. Приехали на это все: скорая, полиция, охрана местная. При запаковке в наручники он умудрился вырваться и разбить нос полицейскому.

В итоге уголовку он не получил, полицейские оказались добрыми. Оставили всего до утра к КПЗ и отпустили домой к жене и детям. Как бы конец истории, но непонятно, что делать дальше, потому что в беседе он пояснил, что нет гарантии того, что ровно такое же не повторится. Например, в офисе. Или в серверной. Или на переговорах с клиентом или ЦОДом.

Долго думали, что делать. Увольнять вроде неправильно. По работе претензий нет, всё хорошо.
Но вроде, если человек облажался в соцсетях и кого-то оскорбил, в крупных компаниях увольняют. Тут похожая ситуация. Непонятно. В общем, в итоге перевели на полную удалёнку ещё до того, как это стало мейнстримом.

Уничтоженный сервер 1С


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

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

Письмо приходит, в нём просьба поменять основную почту доступа.

Мы соответственно меняем почту.

Потом нам пишет генеральный директор и сообщает, что бухгалтерша удалила его сервер 1С с базой. И слёзно просит нас его восстановить. Сотрудницу к этому моменту он уже уволил.

Это трагедия в чистом виде, потому что всё юридически правильно, но понятийно нет. Мы долго думали, что можно было сделать в этой ситуации, и решили, что у нас будет отдельная роль внутри аккаунта для биллинга (закрывающих документов и оплат). Сейчас это в планах релизов.

Общие выводы и чем закончилась история с жёстким диском


Мы стараемся разобраться и понять, что можно сделать, чтобы риск не повторялся.
В случае с заменённым жёстким диском сотрудник написал по собственному и уволился тем же днём. Мы не предъявляли ему претензий, поскольку понимали, что будет крайне тяжело это доказать. И, несмотря на всю иррациональность ситуации, у нас есть правило: если ты знаешь риск, то надо постараться его минимизировать на будущее. В этой истории было не очень понятно, что делать. В итоге посовещались и выделили отдельную комнату в офисе для сборок оборудования, над столом там поставили камеру. В этом случае мы, наверное, больше параноики, чем оптимизаторы, но таков принцип. Возможно, это потому, что мы из финансовой сферы, и с этим очень серьёзно. Здесь мы страхуемся не только от хищения, но и от того, чтобы ложно не обвинить своего сотрудника, если будет какая-то путаница от вендора или что-то подобное, потому что оборудование довольно дорогое.


Подробнее..

DDoS идет в оффлайн

08.07.2020 12:13:32 | Автор: admin
Пару лет назад исследовательские агентства и провайдеры услуг информационной безопасности уже начали было докладывать о снижении количества DDoS-атак. Но уже к 1-му кварталу 2019 года те же исследователи сообщили об их ошеломляющем росте на 84%. А дальше все пошло по нарастающей. Даже пандемия не поспособствовала атмосфере мира напротив, киберпреступники и спамеры посчитали это прекрасным сигналом к атаке, и объем DDoS вырос вдвое.

image

Мы уверены, что время простых и легко обнаруживаемых DDoS-атак (и несложных инструментов, которые могут их предотвратить) уже кончилось. Киберпреступники научились лучше скрывать эти атаки и проводить их все более изощренно. Темная индустрия перешла от brute force к атакам на уровне приложений. Она получает серьезные заказы на разрушение бизнес-процессов, включая вполне себе оффлайновые.

Врываясь в реальность


В 2017 году серия DDoS-атак, направленных на транспортные услуги Швеции, привела к длительным задержкам поездов. В 2019 году у национального железнодорожного оператора Дании Danske Statsbaner отключились системы продаж. В результате на станциях не работали автоматы по продаже билетов и автоматические ворота, и более 15 тысяч пассажиров не смогли никуда уехать. В том же 2019-ом мощная кибератака вызвала отключение электроснабжения в Венесуэле.

Последствия DDoS-атак теперь испытывают не только онлайн-пользователи, но и люди, как говорится, IRL (in real life). Хотя исторически атакующие целились только на онлайн-сервисы, теперь часто их задача нарушить любые бизнес-операции. По нашим оценкам, сегодня у более чем 60% атак есть такая цель для вымогательства или нечистоплотной конкурентной борьбы. Особенно уязвимы при этом транзакции и логистика.

Умнее и дороже


DDoS продолжает считаться одним из самых распространенных и быстрорастущих видов киберпреступности. По прогнозам экспертов, с 2020 года их количество будет только расти. Это связывают с разными причинами и с еще большим переходом бизнеса в онлайн из-за пандемии, и с развитием самой теневой отрасли киберпреступлений, и даже с распространением 5G.

Популярными DDoS-атаки стали в свое время из-за простоты развертывания и низкой стоимости: еще пару лет назад их можно было инициировать за $50 в день. Сегодня как цели, так и методы атаки изменились, что привело к увеличению их сложности и, как следствие, стоимости. Нет, цены от $5 в час по-прежнему есть в прайсах (да, у киберпреступников есть прайсы и тарифные сетки), но за сайт с защитой уже требуют от $400 в сутки, а стоимость индивидуальных заказов на крупные компании доходит до нескольких тысяч долларов.

Сейчас существует два основных типа DDoS-атак. У первого цель сделать онлайн-ресурс недоступным в течение определенного периода времени. Оплату за них злоумышленники берут за время самой атаки. В этом случае DDoS-оператор не заботится о каком-либо конкретном результате, а клиент фактически делает предоплату за начало атаки. Такие методы достаточно дешевы.

Второй тип атаки, которые оплачиваются только при достижении определенного результата. С ними уже интереснее. Они намного сложнее в исполнении и поэтому значительно дороже, поскольку атакующим приходится выбирать наиболее эффективные методы для достижения целей. В Variti мы иногда проводим целые шахматные партии с киберпреступниками, в которых они мгновенно меняют тактику и инструменты и пробуют разом прорваться в несколько уязвимостей на нескольких уровнях. Это явно командные атаки, в которых хакеры прекрасно знают, как реагировать и противодействовать действиям защитников. Бороться с ними не только непросто, но и еще и очень затратно для компаний. Например, один из наших клиентов, крупный сетевой ритейлер, почти три года держал у себя команду из 30 человек, чьей задачей было бороться с DDoS-атаками.

По данным Variti, простые DDoS-атаки, совершаемые исключительно из-за скуки, троллинга или недовольства определенной компанией, в настоящее время составляют менее 10% всех DDoS-атак (разумеется, у незащищенных ресурсов может быть другая статистика, мы смотрим на данные наших клиентов). Все остальное это работа профессиональных команд. При этом три четверти всех плохих ботов это сложные боты, которые трудно обнаружить с помощью большинства современных рыночных решений. Они имитируют поведение реальных пользователей или браузеров и внедряют паттерны, которые усложняют различия между хорошими и плохими запросам. Это делает атаки менее заметными и, следовательно, более эффективными.

image
Данные от GlobalDots

Новые цели DDoS


Отчет Bad Bot Report от аналитиков из GlobalDots говорит о том, что боты сейчас генерируют 50% всего веб-трафика, причем 17,5% из них это именно вредоносные боты.

Боты умеют по-разному портить жизнь компаниям: плюс к тому, что они кладут сайты, они теперь занимаются и тем, что увеличивают расходы на рекламу, скликивания рекламные объявления, парсят цены, чтобы сделать их на копейку меньше и переманить покупателей, и крадут контент с разными нехорошими целями (например, мы недавно писали о сайтах с ворованным контентом, которые заставляют пользователей решать чужие капчи). Боты сильно искажают различную бизнес-статистику, а в итоге решения принимаются на основе неверных данных. DDoS-атака часто бывает дымовой завесой для еще более серьезных преступлений типа взлома и кражи данных. А теперь мы видим, что добавился целый новый класс киберугроз это нарушение работы определенных бизнес-процессов компании, часто оффлайновых (так как в наше время ничего не может быть совершенно вне сети). Особенно часто мы видим, что ломают логистические процессы и коммуникации с клиентами.

Не доставлено


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

Нет в наличии

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

Sneakers bots

Следующий популярный сценарий: боты мгновенно покупают всю линейку продуктов, а их владельцы продают их позже по завышенной цене (в среднем наценка составляет 200%). Таких ботов называют sneakers bots, потому что с этой проблемой хорошо знакомы в индустрии модных кроссовок, в особенности лимитированных коллекций. Боты практически за минуты скупали только что появившиеся новые линейки, при этом блокируя ресурс так, чтобы туда не смогли прорваться реальные пользователи. Это редкий случай, когда про ботов писали в модных глянцевых журналах. Хотя в общем-то, перепродавцы билетов на крутые мероприятия типа футбольных матчей пользуются тем же сценарием.

Другие сценарии

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

Что еще? Боты оставляют массовые фейковые плохие отзывы о товарах, забивают функцию возврат платежа, блокируя транзакции, крадут данные клиентов, спамят реальным покупателям вариантов множество. Хороший пример недавняя атака на DHL, Hermes, AldiTalk, Freenet, Snipes.com. Хакеры притворились, что они тестируют системы защиты от DDoS, а в итоге положили портал бизнес-клиентов компании и все API. В итоге случились большие перебои в доставке товаров покупателям.

Позвоните завтра


В прошлом году Федеральная торговая комиссия (FTC) сообщила о двойном росте жалоб от предприятий и пользователей на спамерские и мошеннические телефонные бот-звонки. По некоторым оценкам, они составляют почти 50% всех звонков.

Как и в случаях с DDoS, цели TDoS массовых атак ботов на телефоны варьируются от розыгрышей до нечистоплотной конкурентной борьбы. Боты способны перегрузить контакт-центры и не пропустить реальных клиентов. Этот метод эффективен не только для колл-центров с живыми операторами, но и там, где используются системы AVR. Боты также могут массово нападать на другие каналы коммуникации с клиентами (чаты, emails), нарушать работу CRM-систем и даже в некоторой степени негативно влиять на управление персоналом, ведь операторы перегружены, пытаясь справиться с кризисом. Атаки также могут быть синхронизированы с традиционной DDoS-атакой на онлайн-ресурсы жертвы.

Недавно подобная атака нарушила работу службы спасения 911 в США обычные люди, остро нуждающиеся в помощи, просто не могли дозвониться. Примерно в то же время Дублинский зоопарк постигла та же участь: по меньшей мере 5000 человек получили спам в виде текстовых SMS-сообщений, побуждающих их срочно позвонить по номеру телефона зоопарка и попросить вымышленного человека.

Wi-Fi не будет


Киберпреступники также могут легко заблокировать всю корпоративную сеть. Часто блокировка IP используется в качестве борьбы с DDoS-атаками. Но это не только неэффективная, но и очень опасная практика. IP-адрес легко найти (например, с помощью мониторинга ресурсов) и легко заменить (или подделать). У наших клиентов до прихода в Variti были случаи, когда это привело к тому, что блокировка определенного IP попросту отключила Wi-Fi в их собственных офисах. Был случай, когда клиенту подсунули нужный IP, и он заблокировал доступ к своему ресурсу пользователям из целого региона, причем долго этого не замечал, потому что в остальном весь ресурс прекрасно функционировал.

Что нового?


Новые угрозы требуют новых решений для защиты. Однако эта новая ниша на рынке только начинает формироваться. Решений для эффективного отражения простых атак ботов множество, а вот со сложными все не так просто. Многие решения по-прежнему практикуют методы блокировки IP. Другим нужно время, чтобы собрать первичные данные для начала работы, и эти 10-15 минут могут стать уязвимостью. Есть решения, основанные на машинном обучении, которые позволяют определять бота по его поведению. И одновременно команды с той стороны хвастаются, что у них уже есть боты, которые могут имитировать реальные, неотличимые от человеческих паттерны. Кто кого пока непонятно.

Что делать, если приходится бороться с профессиональными командами ботоводов и сложными, многоэтапными атаками сразу на нескольких уровнях?

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

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

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

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

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

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

Что думаете вы как будет развиваться отрасль защиты от ботов и какие решения необходимы на рынке уже сейчас?
Подробнее..

DDoS на удаленке RDP-атаки

08.09.2020 16:22:26 | Автор: admin

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

До недавнего времени корпоративный поток данных в подавляющем большинстве случаев циркулировал в контролируемой инфраструктуре. Но пандемия вынудила людей в спешке организовывать весь доступ к корпоративной среде в домашних условиях и незащищенных сетях Wi-Fi. Ну а уж любовь пользователей к простым паролям и нелюбовь к двухфакторной авторизации всегда были головной болью безопасников.

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

Статистика

По данным Лаборатории Касперского, с начала марта 2020 года количество атак на RDP скачкообразно увеличилось. ESET в своем отчете говорит о более чем 100 тысячах новых RDP-атак в день - рост более чем в два раза по сравнению с первым кварталом.

Причина, в том числе, не только в переходе на удаленку, но и в спешке - для компаний при переезде в карантин главным было добиться работоспособности инфраструктуры, а ее безопасность стояла только второй задачей. Например, опрос специалистов по информационной безопасности, который провели в Positive Technologies, показал, что в связи с пандемией удаленный доступ им пришлось либо экстренно организовывать с нуля (11%), либо срочно масштабировать (41%).

Что такое RDP-атаки

Протокол RDP (Remote Desktop Protocol) - это один из наиболее популярных протоколов для подключения к удаленным рабочим столам, доступный во всех версиях Windows, начиная с XP. Помимо взаимодействия с удаленным компьютером он позволяет подключить к удаленной машине локальные диски, порты и другие устройства. Используется большинством админов Windows-сред для администрирования рабочих мест пользователей и серверов, экономя им много времени.

В протоколе постоянно находили уязвимости, причем так часто, что в 2018 году даже ФБР выпустило специальное предупреждение. В мае 2019 года в старых версиях протокола была обнаружена критическая уязвимость под названием BlueKeep. Всего через месяц после ее появления началась активная волна атак, использующих BlueKeep. Затем в августе того же года в протоколе нашли еще четыре новые уязвимости. Они были связаны не с протоколом RDP, а с сервисом удаленных рабочих столов RDS и позволяли с помощью специального запроса, отправленного через RDP, получить доступ к уязвимой системе, не проходя при этом процедуру проверки подлинности.

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

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

А затем начинается собственно атака изнутри системы. Решения безопасности отключаются или удаляются, а затем либо начинается DDoS-атака, либо запускается программа-вымогатель, которая устанавливает пароль на доступ к базам данных с важной для компании информацией. Либо уводятся реальные персональные данные для credential stuffing и фишинга. Также можно использовать плохо защищенный RDP для установки программ для майнинга криптовалют или создания бэкдора (на случай, если несанкционированный доступ к RDP будет обнаружен и закрыт), для установки рекламного или шпионского ПО, SMS-троянов, и так далее. Этим можно полностью заразить все доступные в сети машины.

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

Почему они опасны?

Плохо защищенное RDP-соединение может обеспечить преступникам доступ ко всей корпоративной системе. Например, зашифровка серверов компании программами-вымогателями, которые потом требуют выкуп, может быть крайне разрушительной для бизнеса. Тут показательна недавняя история очень крупного GPS-вендора Garmin, который был вынужден заплатить вымогателям $10 миллионов - по-другому их специалистам по безопасности решить проблему не удалось.

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

Во-вторых, время простых атак уже прошло. Преступники используют сложные схемы и комбинируют методы. Так, в трояне TrickBot появился новый модуль rdpScanDll, который используется для проведения атак brute force на RDP-соединения. Этот модуль уже отметился в ряде атак на крупные компании, в том числе связанными с образованием и финансами.

В-третьих, персональные данные и инструменты для взлома, к сожалению, становятся все более доступными. Например, недавно исходный код Dharma, ransomware-as-a-service ПО, также нацеленного на RDP, выложили для продажи онлайн (извините, ссылку давать не будем). Растет количество утечек баз с паролями и словарей для перебора паролей, упоминавшиеся выше скрипты для взлома можно найти в открытом доступе, и там же есть готовые списки серверов, у которых открыт RDP порт. На рынке есть огромное количество ботов, которые постоянно сканируют все доступные точки подключения и пытаются подобрать пароль.

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

Как понять, что RDP-атака началась

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

  • Серверы не принимают соединения со службой удалённого доступа, пользователи не могут зайти на свои рабочие столы. При этом ситуация может то временно улучшаться, то ухудшаться. В целом серверы могут быть доступны и даже отвечать на ping.

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

Способы от них избавиться

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

Правильная система паролей

Недавнее исследование Verizon показало, что более 80% взломов связано не с уязвимостями протокола RDP, а именно с ненадежными паролями. Поэтому в компаниях должна быть принята и закреплена в инфраструктуре политика использования сложных для подбора паролей и обязательной двухфакторной аутентификации. Пароли пользователям желательно хранить в специальных защищенных менеджерах паролей. Решения по безопасности также должны быть дополнительно защищены паролем, чтобы нельзя было их отключить изнутри при успешной атаке.

Система мониторинга всех запросов

Эффективный способ - мониторить весь входящий трафик и отслеживать все несанкционированные подключения и запросы. К системам мониторинга удаленных подключений можно добавить какие-то дополнительные системы отслеживания, которые помогут увидеть более полную картину происходящего. Например, можно включить решение Variti - Active Bot Protection, которое не только позволяет размечать все входящие запросы на предмет бот - не бот, начиная с самого первого, в режиме реального времени, но и вычислять и блокировать источники атаки. Подобное отслеживание может вестись на всех системных уровнях, включая транспортный уровень и уровень приложений. Это позволит, например, увидеть подозрительную ботовую активность, которая может быть признаком начала атаки.

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

Network Level Authentication

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

Ряд других полезных практик:

  • Используйте нестандартные ключи, например, PKI (Public Key Infrastructure), а соединения RDP стройте с помощью TLS (Transport Layer Security).

  • Если RDP не используется, то выключите его и отключите на брандмауэре сети внешние соединения с локальными машинами на порту 3389 (TCP/UDP) или любом другом порту RDP.

  • Постоянно обновляйте все ПО на устройствах сотрудников до актуальных версий. Помните, что 80-90% эксплойтов создано после выхода патча на уязвимость. Узнав, что была уязвимость, атакующие ищут ее именно в старых версиях софта. Конечно, это непростая задача в условиях удаленки, но это должно быть частью корпоративной ИТ-политики. Кроме того, любые незащищенные или устаревшие компьютеры нужно изолировать.

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

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

  • Установите на все устройства сотрудников защитные решения и решения, позволяющие отследить технику в случае ее утери.

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

Организовать доступ через VPN

Помимо очевидных преимуществ, у этого варианта есть несколько сложностей.

  • Даже у тех, кто использует Virtual Private Network, иногда разрешена авторизация пользователя без пароля.

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

  • Если вы раньше не пользовались VPN, что поднимать в спешке IPSec-соединения - не самая простая задача.

  • В условиях полного домашнего зоопарка устройств и подключений к сети (как насчет выхода в интернет через сотовый модем?) на удаленке довольно тяжело объяснять и настраивать каждому из нескольких сотен пользователей, чтобы у пользователя все стабильно работало и не пропадало подключение к сети.

  • VPN-серверы тоже могут падать, причем в отличие от временного падения какого-то из сервисов, это может грозить серьезными последствиями. Получается, что VPN серверы становятся единой точкой отказа со всеми вытекающими последствиями.

  • VPN это двойное шифрование (помимо стандартного RDP шифрования дополнительно выполняется ещё и VPN шифрование), что означает дополнительную нагрузку и более медленное подключение, что не очень хорошо в условиях нестабильного или не особо быстрого канала связи.

  • При взломе VPN (а это может быть при взломе роутера), если он настроен по умолчанию (или недостаточно компетентно), хакер получает сразу доступ ко всей внутренней сети, в отличии от доступа к одиночному ПК в случае взлома RDP (хотя и через него тоже потом можно получить доступ ко внутренней сети).

Использовать другие средства удаленного доступа

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

Изменить настройки всех пользователей на другой порт

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

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

  • Кроме того, это временное решение, потому что современные боты с интеллектуальной программой сканирования портов быстро найдут новый нестандартный порт. Из нашей анти-бот практики: боты ловят нестандартный порт от пары часов до пары дней. В общем, к вам все равно придут, хоть и позже. Возможно, переименование учетных записей типа Администратор, admin, user, user1 на более несловарные будет здесь даже более эффективно.

Ввести различные ограничения на подключения

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

Блокировка IP

Эффективный для поколения кулхацкеров метод - блокирование IP - в случае серьезных противников может быть бесполезным, а то и опасным. Во всяком случае, адреса, с которых идут атаки, меняются в очень широком диапазоне (атака на перебор часто идет с группы адресов и даже с разных подсетей), так что сама идея блокировки по адресам это лечение последствий, а не болезни. IP адрес слишком легко подделать, атакующие могут применять сотни и с легкостью менять их. И есть большая вероятность, что они подставят его так, что будет заблокирован ваш собственный адрес или IP ваших клиентов.

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

Кстати, если вы делаете это с помощью Windows Firewall, то через какое-то времяWindows начинает сильно тормозить из-за переполненного правила Windows Firewall.

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

О дивный новый мир

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

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

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

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

Подробнее..

Белые начинают так ли уж хороши хорошие боты?

10.11.2020 16:08:31 | Автор: admin

Белые начинают: так ли уж хороши хорошие боты?

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

Немного статистики

Согласно исследованию GlobalDots 2019 Bad Bot Report, сегодня почти 39% всего онлайн-трафика составляют не люди, а боты. Из них 20,4% трафика генерируют плохие боты, а 17.5% - хорошие. Доля ботов в трафике при этом активно растет, причем по итогам 2019 года трафик плохих ботов вырос больше, а доля хороших ботов сократилась. Видно, что и те и другие активно делят рынок, и во время киберпандемии, скорее всего, разрыв станет еще большим.

Не нужно считать, что если у вас небольшая страничка в интернете, то вы никому не интересны и поэтому вас никто не тронет. Напротив, как показывает статистика, на маленьких сайтах самая большая доля плохих ботов - 22.9%, а на крупных онлайн-ресурсах их меньше - 17.9%.

Белые и черные

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

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

Поисковые (crawlers)

Они разработаны поисковыми системами для индексирования страниц и релевантной выдачи веб-сайтов при запросе пользователя, а также сканируют сайты и заносят их в особую базу данных, в которой анализируются многие факторы, такие как уникальность текста, изображений, нарушение или соблюдение авторских прав и т.д. Боты поисковых систем генерируют около 30% мирового интернет-трафика. Примеры: Googlebot, YandexBot, а также ematchers для картинок это поиск по картинкам, например, YandexImages.

Боты данных или медиа-боты

Позволяют быстро сохранять и получать доступ к важной информации, например, к новостям, прогнозу погоды, курсам валют. Примеры: Amazon Echo, Google Home, Siri, Алиса. Сюда же можно отнести ботов новостных агентств.

Боты проверки авторского права

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

Торговые боты

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

Боты также применяются, когда требуется лучшая реакция по сравнению с возможностями человека (например, игровые боты, боты для интернет-аукционов и тому подобное).

Помимо перечисленных, в whitelist Variti попадают боты различных банков и платежных систем, которые помогают автоматизировать процедуру оплаты, боты, которые делают preview в социальных сетях и мессенджерах - заранее собирают информацию, сканируют онлайн-страницу и превращают ее в картинку для превью. Также там есть универсальные мониторинги, которые проверяют состояние серверов, доступность сервисов из интернета и т.д, боты по поиску нецензурных слов на странице и AdSense-боты, которые сканируют страницы в интернете и таким образом понимают, на какой странице какая тематика и какую рекламу показывать.

Пропускаем хороших вперед

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

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

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

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

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

Можно добавлять либо всю сеть, которая выделена разработчику, либо один IP адрес, под которым он работает. Если это компания и ей выделена сеть со множеством IP адресов, то ее можно добавить в CIDR-нотации, и она не будет подвергаться проверкам.

Однако обелять можно не только по IP адресам, хорошие боты могут делать это и по заголовкам. Например, клиент использует бота, которому нужно иметь беспрепятственный доступ на сайт, но у него плавающий/динамический IP адрес. В этом случае клиенту будет непросто постоянно вносить его в локальный белый список. Тогда, например, мы можем выделить этому боту или сервису особый token в заголовке. Он служит своеобразным паролем и заранее записывается. Тогда все запросы с содержанием этого токена с любых IP адресов не будут подвергаться проверкам. В случае использования внешних автоматизированных сервисов, с которыми нет возможности какой-либо интеграции со стороны защищаемого сервиса, есть вариант обеления по уникальному заголовку user agent с определенным допустимым рейт-лимитом. При превышении заданного порога такие запросы будут подвергаться проверкам на ботовость и не получат доступ к сайту.

Также можно обелять по конкретным локациям или по разделам на сайте. Например, у клиента есть сайт и мобильное приложение, которое ходит в определенную локацию типа website.com/api. У нас есть отдельная услуга по защите мобильных API, но если клиент по какой-то причине не хочет ею пользоваться, то они могут попросить обелить все запросы в область API с любых IP адресов с любых устройств. Но мы очень не рекомендуем действовать таким образом, так как мобильные API сами по себе очень часто становятся целью автоматизированных атак.

Глобальные и локальные whitelists, включая обеление отдельных IP адресов, клиенты могут самостоятельно подключить в своем личном кабинете, а по заголовкам и локациям через техподдержку Variti, например, в Telegram-чате Variti при подключении.

Как хорошие боты могут положить ресурс

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

Поисковые боты также могут положить сайт, как и плохие, если выставить неправильные настройки. Например, можно разрешить Яндексу индексировать сайт со скоростью не 10 страниц в секунду, а 1000. У большинства сайтов в корне есть файл robots.txt, описывающий правила и параметры его индексации, в котором в том числе можно задать скорость индексирования для поисковых систем. Например, если у сайта сильно ограничены ресурсы на одновременное количество обслуживаемых посетителей, то можно эту скорость уменьшить. Если выставить неправильные настройки, то белый бот-поисковик может начать агрессивно сканировать сайт, и он не выдержит нагрузки.

Приведем еще пример возможных проблем от белых ботов - массовая рассылка почтовых писем с содержанием изображений. В целях безопасности почтовые сервисы часто заранее обрабатывают изображения из писем через свои прокси-серверы и транскодируют их перед доставкой, тем самым защищая пользователя от возможности отслеживания по IP-адресу, устройству, геолокации и т.п. Шквал таких запросов на статический контент при почтовых рассылках владелец ресурса может расценить как DDoS-атаку. Тут также требуется знать специфику сервиса и предусмотреть возможность таких массовых рассылок, заранее получив рекомендации от службы поддержки.

Притвориться мертвым белым

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

В исследовании GlobalDots 2019 Bad Bot Report насчитали аж 523 различных типов маскировок ботов. Больше всего плохих ботов (55,4%) притворяется браузером Google Chrome. На втором месте Firefox, на третьем - мобильный браузер Android. В списке также Safari, Internet Explorer, мобильные браузеры Safari Mobile, Opera, поисковые боты Googlebot и Bingbot и многие другие.

Интересно, что боты, которые притворяются браузерами, начали выпускаться еще 20 лет назад, и некоторые из них до сих пор циркулируют в сети - например, боты, притворяющиеся Internet Explorer 5, которых сделали в 1999-ом. А 0.8% плохих ботов используют личину Internet Explorer 7. Некоторые из них даже находят свои цели на немногочисленных сайтах, на которые можно зайти только с особых версий браузеров. Очевидно, что таких онлайн-ресурсов исчезающе мало, и можно просто блокировать ботов с устаревших версий как плохих.

Процесс выявления и сегрегации ботов усложняет еще и то, что почти 74% плохих ботов - это advanced persistent bots (APB), сложные боты, которые используют микс технологий и методов. Их сложнее всего обнаружить, поскольку они заходят с разных подсетей, рандомно меняют IP-адреса, используют анонимные прокси-серверы, Java-скрипты и peer-to-peer сети, умеют автоматически искать необходимую информацию в интернете и часто удачно копируют человеческое поведение.

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

Мы в Variti не опираемся на user agent, а сопоставляем данные с другой информацией, включая IP адрес, статистику, технические метрики, особенности поведения и множество других факторов. Например, обращаем внимание на особенности выполнения кода и различных браузерных расширений, которые в случае ботов (даже для Chrome, запущенного в режиме headless) работают не совсем так, как в реальных браузерах.

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

Как узнать, что вас заполонили роботы

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

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

Нужно следить за заходами при помощи устаревших версий браузеров Firefox, Chrome, Internet Explorer и Safari и трафику, идущему через прокси-серверы либо другие пункты доступа, которые анонимизируют источник трафика. Можно отслеживать неудачные попытки авторизации на сайтах или в связанных с ними приложениях.

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

Белые начинают

Хорошие боты были созданы первыми и, как часто это бывает, этими наработками немедленно воспользовались в некрасивых целях. Вполне возможно, что при высоком темпе усложнения ботов нас ждет что-то еще более хитрое и деструктивное - например, переконфигурация хороших ботов для нехороших целей (извините, если мы подали кому-то идею), более усовершенствованная маскировка плохих под хороших или даже stealth-режим, который позволяет ботам обходить и средства защиты, и ловушки. Что думаете вы - как будут развиваться хорошие и как это будут использовать плохие боты?

Подробнее..

Перевод Как Runescape ловит ботоводов, и почему она не поймала меня

05.04.2021 12:20:40 | Автор: admin

Автоматизация действий игрока всегда была серьёзной проблемой таких MMORPG, как World of Warcraft и Runescape. Подобный взлом игр сильно отличается от традиционных читов, например, в шутерах.

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

Ботоводство


Последние несколько месяцев аккаунт sch0u круглосуточно играл на сервере world 67, выполняя такие монотонные задачи, как убийство мобов и сбор ресурсов. На первый взгляд, этот аккаунт похож на любого другого игрока, но есть одно важное отличие: это бот.


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

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

Эвристики!


Для подтверждения этой теории я начал с изучения клиента Runescape и почти сразу заметил глобальную переменную hhk, задаваемую вскоре после запуска.

const auto module_handle = GetModuleHandleA(0);hhk = SetWindowsHookExA(WH_MOUSE_LL, rs::mouse_hook_handler, module_handle, 0);

Этот код устанавливает на мышь низкоуровневый перехватчик, прицепляемый к системной цепочке перехватчиков. Это позволяет приложениям под Windows перехватывать все события мыши, даже если они не связаны с конкретным приложением. Низкоуровневые перехватчики (хуки) часто используются кейлоггерами, но могут применяться и в мирных целях, например, в эвристиках, как вышеупомянутый перехватчик мыши.

По сути, обработчик мыши в Runescape довольно прост (псевдокод для красоты был подправлен вручную):

LRESULT __fastcall rs::mouse_hook_handler(int code, WPARAM wParam, LPARAM lParam){  if ( rs::client::singleton )  {      // Call the internal logging handler      rs::mouse_hook_handler_internal(rs::client::singleton->window_ctx, wParam, lParam);  }  // Pass the information to the next hook on the system  return CallNextHookEx(hhk, code, wParam, lParam);}

void __fastcall rs::mouse_hook_handler_internal(rs::window_ctx *window_ctx, __int64 wparam, _DWORD *lparam){  // If the mouse event happens outside of the Runescape window, don't log it.  if (!window_ctx->event_inside_of_window(lparam))  {    return;  }  switch (wparam)  {    case WM_MOUSEMOVE:      rs::heuristics::log_movement(lparam);      break;        case WM_LBUTTONDOWN:    case WM_LBUTTONDBLCLK:    case WM_RBUTTONDOWN:    case WM_RBUTTONDBLCLK:    case WM_MBUTTONDOWN:    case WM_MBUTTONDBLCLK:      rs::heuristics::log_button(lparam);      break;  }}

для снижения нагрузки на канал эти функции rs::heuristics::log_* используют простые алгоритмы для пропуска данных событий, напоминающих ранее зафиксированные события.

Позже эти данные событий парсятся функцией rs::heuristics::process, которая вызывается в каждом кадре основного цикла рендеринга.

void __fastcall rs::heuristics::process(rs::heuristic_engine *heuristic_engine){  // Don't process any data if the player is not in a world  auto client = heuristic_engine->client;  if (client->state != STATE_IN_GAME)  {    return;  }  // Make sure the connection object is properly initialised  auto connection = client->network->connection;  if (!connection || connection->server->mode != SERVER_INITIALISED)  {    return;  }  // The following functions parse and pack the event data, and is later sent  // by a different component related to networking that has a queue system for  // packets.  // Process data gathered by internal handlers  rs::heuristics::process_source(&heuristic_engine->event_client_source);  // Process data gathered by the low level mouse hook  rs::heuristics::process_source(&heuristic_engine->event_hook_source);}

Away from keyboard?


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

Запретив игре вызывать функцию rs::heuristics::process, я поначалу ничего не заметил, однако спустя ровно пять минут меня разлогинил сервер. Очевидно, Runescape определяет неактивность игрока исключительно по передаваемым клиентом на сервер данным эвристик, даже если вы вполне нормально можете играть. Это вызвало новый вопрос: если сервер думает, что я не играю, думает ли он, что я играю ботом?.

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

Для подтверждения своей теории я круглосуточно и семь дней в неделю занимался ботоводством, даже не двигая мышью. Проведя так тысячи часов, я могу со всей уверенностью сказать, что или система обнаружения ботов использует только данные событий эвристик, отправляемых серверу клиентом, или работает только когда игрок не afk. Любой игрок, которому удаётся играть, не двигая курсором, должен быть немедленно забанен, то есть разработчикам стоит обратить внимание на эту недоработку.

Подробнее..

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

10.06.2021 16:07:13 | Автор: admin

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

Типы вредоносных ботов

  • Программы для автоматизированного подбора логина и пароля (брутфорс) специализируются как на получении доступа уровня Администратор, так и на банальную кражу учетных записей пользователей сервиса. А в некоторых случаях с их помощью можно получить действующий список живых email-адресов для спам-рассылки или фишинга. Пример: при авторизации на сайте подставляем случайные значения в поля email и пароль. В этой ситуации правильность пароля не важна. Если логин (email) есть в базе, мы узнаем об этом по таймингу ответа сервера. Сохраняем email, и добавляем его в базу спам рассылок.

  • Боты авторегистрации, которые очень любят сервисы программ лояльности и создают там сотни фейковых аккаунтов. Зачем? В нашей практике были кампании, в рамках которых пользователь мог получить бонусные баллы за регистрацию, и их даже хватало на небольшую покупку например, зубной щетки. Зачем злоумышленникам сотни зубных щеток, неважно важно то, что владельцу сервиса наносится реальный материальный ущерб. Конечно, финансовые потери сравнительно невысоки. Но аналитику и метрики такая атака может сильно подпортить. Часто такие боты создают лишнюю нагрузку на почтовый сервер. Тысячи писем, подтверждающих регистрацию ботов, дают очень неприятный эффект: могут переполнить почтовый ящик, перегрузить релей и т д.

  • Спам-боты могут автоматически оставлять в обсуждениях негативные комментарии или вредоносные ссылки на якобы полезные ресурсы. Некоторые из таких программ умеют регистрироваться на ресурсе, если это необходимо для написания комментариев. Негативные и оскорбительные комментарии повышают репутационные риски. Стоит вспомнить об опыте бьюти-бренда Z Palette, который мог стать культовым, но не успел его буквально похоронил один-единственный провокационный комментарий. Или историю одного из гигантов рынка цифровой техники Dell. В далеком 2005 году этот знаменитый бренд едва не был нокаутирован всего одним негативным отзывом.

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

  • Продвинутые боты могут имитировать действия настоящего пользователя. Их используют для взлома учетных записей, кардинга, мошенничества с покупками и других серьезных атак. Кстати, DDoS тоже реализуется с помощью ботов, которые распределены территориально и одновременно задействуются в момент атаки. К счастью, сейчас есть много сервисов для защиты от атак этого типа. Вот один из них: https://qrator.net/ru. Сервис обеспечивает эффективную защиту в автоматическом режиме, с максимальной скоростью реакции на каждую угрозу. При этом количество ложных срабатываний защиты не превышает 5%.

Выстраиваем защиту от ботов. Что сделать в первую очередь?

Полностью оградиться от ботов невозможно. Но снизить их активность на вашем ресурсе вполне реально. Механизмы защиты могут быть самыми разными от несложных настроек в бэкенде и white\black-листов до многоуровневых систем аналитики трафика с возможностью обучения и распознавания вредоносной активности.

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

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

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

Как сократить активность ботов на сайте?

  • Один из самых простых и популярных инструментов Captcha. Она добавляет некую задачу, чаще всего графическую, которую пользователь должен решить при заполнении формы регистрации, входа, обратной связи и др. Это защита от брутфорса, спам-ботов и ботов авторегистрации. Но некоторые вредоносные программы умеют обходить ее. Ключевой барьер для использования Captcha ее неудобство для легитимных пользователей ресурса. Людей часто напрягает эта бессмысленная процедура, особенно если определить ответ не удается с первого раза и приходится тратить время на повторные попытки. Это может немного снизить конверсию. Решение использовать или не использовать этот инструмент зависит от оценки рисков и аналитики: если видно, что пользователи часто бросают попытки заполнить форму из-за капчи, стоит подумать над упрощением механизма в этом месте. Кстати, вот статья с интересным кейсом использования капчи (точнее, антикапчи).

  • reCAPTCHA v3 сервис, созданный для борьбы с ботами, который основывается на агрегации действий пользователей и поведенческом анализе. И в отличие от классической captcha, не видима обычному пользователю. Подгружается она как JS библиотека и отслеживает поведение пользователя, затем информация отправляется в сервисы google для вынесения вердикта.Не смотря на лояльность такой защиты к пользователям ресурса, данный способ защиты может отрицательно повлиять на скорость загрузки страницы и снизить баллы по Google PageSpeed Insight. Ну и ошибки при поведенческом анализе никто не отменял. При целевой атаке на ресурс полагаться только на данный способ защиты не стоит.

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

  • Можно настроить на сайте ловушки для ботов (honeypot). Например, добавить скрытое от пользователя поле. Обычный пользователь видит нужное ему поле для заполнения, а бот видит еще одно в коде и заполняет его. После этого бот блокируется скриптом. Против умных ботов такая защита срабатывает не всегда, но отбросить часть ненужного трафика она точно поможет. Также можно установить таймер на заполнение полей (сообщения, комментарии и т.д.). Боты обычно вносят данные в поля моментально, в отличие от живых людей это помогает идентифицировать их и блокировать их дальнейшие действия. С ловушками можно экспериментировать и адаптировать их к своему сервису. Этот способ борьбы с ботами даст возможность снизить их активность на ресурсе, но, увы, не избавит вас от них: если кто-то будет целенаправленно атаковать именно ваш сервис, он сможет просто проанализировать вашу форму и алгоритмы и внести изменения в действия своего бота.

  • Также существуют специализированные решения от таких производителей как Akamai, Imperva, Radware, PeremeterX и др., которые применяют подходы на основе анализа данных. Машинное обучение направлено на поведенческий анализ для обнаружения аномалий в трафике веб-сервиса. Анализируя трафик огромного количества интернет-ресурсов, такие инструменты оценивают каждый запрос и определяют вероятность того, что он поступает от бота. При этом учитывается структура защищаемого приложения. Со временем система адаптируется к каждому веб-сервису, и вероятность ложных срабатываний (отклонений запросов настоящих пользователей) минимизируется. Легитимный трафик отделяют от вредоносного в том числе и на основе отпечатка, состоящего из IP адреса, геолокации, браузеров и ряда других идентификаторов. Некоторые решения весьма эффективные, по мнению аналитиков Gartner умеют тестировать структуру сервиса на проникновение ботов, показывая все области, где присутствуют риски для сайта (и, соответственно, бизнеса). Такую защиту уже действительно сложно обойти, но все же возможно если долго и упорно в ней разбираться. Ключевой минус подобных решений высокая цена.

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

А теперь небольшой инсайт. Мы в AGIMA создаем десятки веб-сервисов в год. И каждому второму проекту, который мы разрабатываем, нужна настройка обороны от вредоносных программ. В нашей практике встречались случаи, когда после внедрения определенных мер количество нежелательного трафика на сервис сокращалась на 20-40%, а нагрузка на серверные платформы и бэкенд на 15-30%. Это достаточно ощутимый результат для высоконагруженных веб-сервисов.

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

Затягивать с поиском решения не стоит, промедления могут обернуться существенными потерями. Вот пример: по данным Financial Times, на сегодняшний день из-за активности ботов ведущие стриминговые сервисы (Spotify, Amazon, Universal Music Group, Warner Music и др.) теряют в общей сложности около 300 миллионов долларов в год! Кто знает, возможно, своевременный анализ рисков помог бы этого избежать. Так что угрозу вредоносных ботов никак нельзя игнорировать. Но не стоит и паниковать варианты защиты найдутся в любом случае!

Статья написана совместно с Алексеем Клиновым, Ex-Head of Information Security, AGIMA.

Подробнее..

Из песочницы Создание Discord-бота, используя библиотеку discord.js Часть 1

23.06.2020 20:12:31 | Автор: admin

Введение


В этой статье я подробно расскажу о том, как работать с библиотекой discord.js, создать своего Discord-бота, а также покажу несколько интересных и полезных команд.

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

Начало работы


Если вы уже знакомы с приведёнными ниже материалами, смело можете пролистать этот раздел.

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


и так далее.

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

Для установки переходим по этой ссылке.


Выбираем свою операционную систему и запускаем скачивание.

Установка среды выполнения
Для создания бота мы используем среду выполнения node.js. Для её установки нам необходимо перейти на этот сайт.



На данный момент нас интересует версия долгосрочной поддержки (LTS), скачиваем её.

Установка полезных расширений
В Visual Studio Code присутствует возможность устанавливать расширения.
Для этого, кликните по отмеченной ниже иконке.



В открывшемся окне вписываем название название/идентификатор нужного нам расширения, после чего устанавливаем его.



Из полезных расширений могу отметить:

  1. Discord Presence расширение, позволяющее отображать рабочую область и файл, в котором вы работаете в вашей игровой активности (функция работает только при использовании приложения Discord).

    Идентификатор расширения: icrawl.discord-vscode


  2. Code runner расширение, с помощью которого предоставляется возможность запускать определённые фрагменты кода.
    Идентификатор расширения: formulahendry.code-runner


Создание бота


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

Здесь всё просто. Переходим на портал разработчиков и нажимаем на кнопку с надписью New Application она находится в правом верхнем углу.

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



На этой странице мы можем изменить имя бота, загрузить для него иконку, заполнить описание.

Теперь наша задача воплотить бота в жизнь. Для этого переходим во вкладку Bot.



Нажимаем на кнопку с надписью Add Bot и воплощаем бота в жизнь.

Поздравляю! Вы создали аккаунт для вашего бота. Теперь у него есть тег, токен, ник и иконка.

Подготовка к написанию кода


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

Первым делом создаём папку, после чего открываем её в VS Code (Файл > Открыть папку) / (Ctrl + K Ctrl + O)

Далее нам нужно открыть терминал (Терминал > Создать терминал) / (Ctrl + Shift + `)



Теперь мы должны создать файл с неким описанием нашего бота, сделаем это через терминал.

Вписываем данную строку в терминал и нажимаем Enter:

npm init

После каждой появившейся строки нажимаем Enter или вписываем свои значения.
Значения в этом файле можно будет изменить в любой момент.

Далее, мы должны поочерёдно вводить в терминал эти строки:

npm install

npm install discord.js

Install также можно сокращать в I, но необязательно.

Итого, если вы следовали инструкциям и всё сделали правильно, в вашей папке должны были появиться 3 объекта:



Написание кода


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

Существует множество вариантов для его написания: используя один файл, два, несколько, и т.д

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

Но не волнуйтесь, весь код вам писать не придётся.

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

Мы можем сделать это двумя способами:

  1. Создать отдельный файл
  2. Записать всё в константы

Я не советую вам использовать второй вариант, так как в будущем вам придётся работать с большим объёмом информации, и такая запись будет доставлять неудобства.

Разберём хранение параметров в отдельном файле.

Итак, создаем файл config.json

Вставляем в него следующий код:

{    "token" : "Ваш_токен",    "prefix" : "Ваш_префикс"}

* Для получения токена зайдите на портал разработчиков, перейдите во вкладку Bot и скопируйте его.



* Самым распространённым среди разработчиков префиксом является !

Далее нам нужно создать файл bot.js и вставить в него данный код:

const Discord = require('discord.js'); // Подключаем библиотеку discord.jsconst robot = new Discord.Client(); // Объявляем, что robot - ботconst comms = require("./comms.js"); // Подключаем файл с командами для ботаconst fs = require('fs'); // Подключаем родной модуль файловой системы node.js  let config = require('./config.json'); // Подключаем файл с параметрами и информациейlet token = config.token; // Вытаскиваем из него токенlet prefix = config.prefix; // Вытаскиваем из него префиксrobot.on("ready", function(){ /* Бот при запуске должен отправить в терминал сообщение [Имя бота] запустился! */console.log(robot.user.username + " запустился!");});robot.on('message', (msg) => { // Реагирование на сообщенияif(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){    var comm = msg.content.trim()+" ";    var ok = false;    var comm_name = comm.slice(0, comm.indexOf(" "));    var messArr = comm.split(" ");    for(comm_count in comms.comms){    var comm2 = prefix + comms.comms[comm_count].name;    if(comm2 == comm_name){    comms.comms[comm_count].out(robot, msg, messArr);    }    }    } });robot.login(token); // Авторизация бота

Теперь создаём файл comms.js, в нём будут сами команды.

В нём должен быть следующий код:

const config = require('./config.json'); // Подключаем файл с параметрами и информациейconst Discord = require('discord.js'); // Подключаем библиотеку discord.jsconst prefix = config.prefix; // Вытаскиваем префикс// Команды //    function test(robot, mess , args) {        mess.channel.send('Test!')    } // Список комманд //var comms_list = [{name: "test", out: test, about: "Тестовая команда"}];// Name - название команды, на которую будет реагировать бот// Out - название функции с командой// About - описание команды module.exports.comms = comms_list;

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

const config = require('./config.json');const Discord = require('discord.js');const prefix = config.prefix;const versions = config.versions;// Команды //    function test(robot, mess, args) {        mess.channel.send("Тест!")    }    function hello(robot, mess, args) {        mess.reply("Привет!")    } // Список комманд //var comms_list = [{name: "test", out: test, about: "Тестовая команда"},        {name: "hello", out: hello, about: "Команда для приветствия!"}}module.exports.comms = comms_list;

И вот, мы вышли на финишную прямую!

Осталось всего ничего запустить бота.

Для этого открываем терминал и вставляем в него следующую строку:

node bot.js



Готово! Бот запущен и вы можете им пользоваться, ура!

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

Перейдём во вкладку OAuth2, пролистаем чуть ниже, выберем Bot и отметим нужные боту привилегии.

Теперь осталось скопировать ссылку-приглашение и добавить бота на свой сервер.



Как вывести ссылку-приглашение в терминал, при запуске бота?
Существует два способа:

  1. Заранее отметить нужные привилегии.

    Для этого, сначала мы должны скопировать ссылку-приглашение.
    После чего перейти в файл bot.js и вставить данную строчку кода сюда:

    robot.on("ready", function(){    console.log(robot.user.username + " запустился!");    console.log("Ссылка-приглашение")  // << //})
    

    Итоговый код должен быть таким:

    const Discord = require('discord.js'); const robot = new Discord.Client();var comms = require("./comms.js");const fs = require('fs');let config = require('./config.json');let token = config.token;let prefix = config.prefix; robot.on("ready", function(){    console.log(robot.user.username + " запустился!");    console.log("Ссылка-приглашение")})robot.on('message', (msg) => {if(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){    var comm = msg.content.trim()+" ";    var ok = false;    var comm_name = comm.slice(0, comm.indexOf(" "));    var messArr = comm.split(" ");    for(comm_count in comms.comms){    var comm2 = prefix + comms.comms[comm_count].name;    if(comm2 == comm_name){    comms.comms[comm_count].out(robot, msg, messArr);    }    }    } });robot.login(token)  robot.login(token);
    

  2. Отметить нужные привилегии в самом коде.

    Повторяем процедуры из первого способа, но уже с другими строками кода:

    robot.on("ready", function(){    console.log(robot.user.username + " запустился!");    robot.generateInvite(["ADMINISTRATOR"]).then((link) => { // < //        console.log(link); // < //})})
    

    Итоговый код:

    const Discord = require('discord.js'); const robot = new Discord.Client();var comms = require("./comms.js");const fs = require('fs');let config = require('./config.json');let token = config.token;let prefix = config.prefix;robot.on("ready", function(){    console.log(robot.user.username + " запустился!");    robot.generateInvite(["ADMINISTRATOR"]).then((link) => {         console.log(link);})})robot.on('message', (msg) => {if(msg.author.username != robot.user.username && msg.author.discriminator != robot.user.discriminator){    var comm = msg.content.trim()+" ";    var ok = false;    var comm_name = comm.slice(0, comm.indexOf(" "));    var messArr = comm.split(" ");    for(comm_count in comms.comms){    var comm2 = prefix + comms.comms[comm_count].name;    if(comm2 == comm_name){    comms.comms[comm_count].out(robot, msg, messArr);    }    }    } });   robot.login(token);
    

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

        robot.generateInvite(['KICK_MEMBERS', 'BAN_MEMBERS', 'SEND_MESSAGES']).then((link) => {         console.log(link);
    

    * Все привилегии указываются заглавными буквами

    Список доступных привилегий:

    ADMINISTRATOR
    CREATE_INSTANT_INVITE
    KICK_MEMBERS
    BAN_MEMBERS
    MANAGE_CHANNELS
    MANAGE_GUILD
    ADD_REACTIONS
    VIEW_AUDIT_LOG
    PRIORITY_SPEAKER
    STREAM
    VIEW_CHANNEL
    SEND_MESSAGES
    SEND_TTS_MESSAGES
    MANAGE_MESSAGES
    EMBED_LINKS
    ATTACH_FILES
    READ_MESSAGE_HISTORY
    MENTION_EVERYONE
    USE_EXTERNAL_EMOJIS
    VIEW_GUILD_INSIGHTS
    CONNECT
    SPEAK
    MUTE_MEMBERS
    DEAFEN_MEMBERS
    MOVE_MEMBERS
    USE_VAD
    CHANGE_NICKNAME
    MANAGE_NICKNAMES
    MANAGE_ROLES
    MANAGE_WEBHOOKS
    MANAGE_EMOJIS


    Я не советую вам из привилегий выбирать только ADMINISTRATOR, поэтому лучше указать только те привилегии, которые бот действительно использует для корректной работы


Полезные и интересные команды


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

  1. !say с помощью этой команды бот может повторить ваше сообщение.



    Код:

        if(!mess.member.hasPermission("MANAGE_MESSAGES")) return mess.channel.send("У  вас нет прав"); /* Если у исполнителя команды нету привилегии MANGAGE_MESSAGES, он не сможет её использовать */        let robotmessage = args = mess.content.split(' '); // Пробелы между словами     args.shift();    args = args.join(' ');    mess.delete().catch(); // Удаление сообщения пользователя после отправки     mess.channel.send(robotmessage).then(mess.channel.send(mess.author)) /*             Отправление в чат сообщения бота */
    

  2. !heads_or_tails игра Орёл или Решка.



    Код:

            mess.channel.send('Монета подбрасывается...')        var random = Math.floor(Math.random() * 4); // Объявление переменной random - она вычисляет случайное число от 1 до 3        if (random == 1) { // Если вычислено число 1, то выпадает орёл.            mess.channel.send(':full_moon: Орёл!')        } else if (random == 2) { // Если вычислено число 2, то выпадает решка.            mess.channel.send(':new_moon: Решка!')        } else if (random == 3) { // Если вычислено число 3, то монета падает         ребром.            mess.channel.send(':last_quarter_moon: Монета упала ребром!')        }
    

  3. !clear удаление определённого количества сообщений.



    Код:

            const arggs = mess.content.split(' ').slice(1); // Все аргументы за именем команды с префиксом        const amount = arggs.join(' '); // Количество сообщений, которые должны быть удалены        if (!amount) return mess.channel.send('Вы не указали, сколько сообщений нужно удалить!'); // Проверка, задан ли параметр количества        if (isNaN(amount)) return mess.channel.send('Это не число!'); // Проверка, является ли числом ввод пользователя                 if (amount > 100) return mess.channel.send('Вы не можете удалить 100 сообщений за раз'); // Проверка, является ли ввод пользователя числом больше 100        if (amount < 1) return mess.channel.send('Вы должны ввести число больше чем 1'); // Проверка, является ли ввод пользователя числом меньше 1                async function delete_messages() { // Объявление асинхронной функции        await mess.channel.messages.fetch({ limit: amount }).then(messages => {            mess.channel.bulkDelete(messages)            mess.channel.send(`Удалено ${amount} сообщений!`)        })};        delete_messages(); // Вызов асинхронной функции
    
  4. !random_name генерация случайного имени.



    Не стоит пугаться большого кода, здесь всё предельно просто.

    Код:

            var name = new Array( // Объявление массива name и занесение в него большого количества имён            'Абрам',' Аваз',' Аввакум',' Август',' Августин',            ' Авдей',' Авраам',' Автандил',' Агап',' Агафон',            ' Аггей',' Адам',' Адис',' Адольф',' Адриан',            ' Азамат',' Айдар',' Айнур',' Айрат',' Аким',            ' Алан',' Алей',' Александр',' Алексей',' Али',            ' Альберт',' Альфред',' Амадей',' Амадеус',            ' Амаяк',' Амвросий',' Ананий',' Анастасий',            ' Анатолий',' Анвар',' Ангел',' Андоим',' Андрей',            ' Аникита',' Антон',' Арам',' Арий',' Аристарх',            ' Аркадий',' Арман',' Арно',' Арнольд',' Арон',' Арсен',            ' Арсений',' Арслан',' Артем',' Артемий',' Артур',' Архип'            ,' Аскар',' Аскольд',' Аслан',' Афанасий',' Ахмет',' Ашот'            ,' Бальтазар',' Бежен',' Бенедикт',' Берек',' Бернард',            ' Бертран',' Богдан',' Болеслав',' Борис',' Бронислав',            ' Булат',' Вадим',' Валентин',' Валерий',' Вальтер',            ' Варфоломей',' Василий',' Вацлав',' Велизар',' Венедикт',' Вениамин',' Викентий',' Виктор',' Вилли',' Вильгельм',' Виссарион',' Виталий',' Витольд',' Владимир',' Владислав',' Владлен',' Володар',' Вольдемар',' Всеволод',' Вячеслав',' Гавриил',' Галактион',' Гарри',' Гастон',' Гаяс',' Гевор',' Геннадий',' Генрих',' Георгий',' Геракл',' Геральд',' Герасим',' Герман',' Глеб',' Гордей',' Гордон',' Горислав',' Градимир',' Григорий',' Гурий',' Густав',' Давид',' Дамир',' Даниил',' Даниэль',' Данияр',' Дарий',' Дементий',' Демид',' Демосфен',' Демьян',' Денис',' Джамал',' Джордан',' Дмитрий',' Добрыня',' Дональд',' Донат',' Дорофей',' Евгений',' Евграф',' Евдоким',' Евсевий',' Евсей',' Евстафий',' Егор',' Елеазар',' Елисей',' Емельян',' Еремей',' Ермолай',' Ерофей',' Ефим',' Ефрем',' Жан',' Ждан',' Жорж',' Захар',' Зиновий',' Ибрагим',' Иван',' Игнатий',' Игорь',' Илларион',' Ильдар',' Ильнар',' Ильнур',' Илья',' Ильяс',' Иннокентий',' Иоанн',' Иосиф',' Ипполит',' Искандер',' Ислам',' Камиль',' Карим',' Карл',' Кирилл',' Клим',' Кондрат',' Константин',' Корней',' Кузьма',' Лавр',' Лаврентий',' Лев',' Леон',' Леонид',' Леонтий',' Леопольд',' Лука',' Лукьян',' Любим',' Макар',' Максим',' Максимилиан',' Марат',' Марк',' Марсель',' Мартин',' Матвей',' Мирон',' Мирослав',' Митрофан',' Михаил',' Михей',' Мишель',' Мстислав',' Мурат',' Муслим',' Назар','Абрам',' Аваз',' Аввакум',' Август',' Августин',' Авдей',' Авраам',' Автандил',' Агап',' Агафон',' Аггей',' Адам',' Адис',' Адольф',' Адриан',' Азамат',' Айдар',' Айнур',' Айрат',' Аким',' Алан',' Алей',' Александр',            ' Алексей',' Али',' Альберт',' Альфред',' Амадей',' Амадеус',' Амаяк',' Амвросий',' Ананий',' Анастасий',' Анатолий',' Анвар',' Ангел',' Андоим',' Андрей',' Аникита',' Антон',' Арам',' Арий',' Аристарх',' Аркадий',' Арман',' Арно',' Арнольд',' Арон',' Арсен',' Арсений',' Арслан',' Артем',' Артемий',' Артур',' Архип',' Аскар',' Аскольд',' Аслан',' Афанасий',' Ахмет',' Ашот',' Бальтазар',' Бежен',' Бенедикт',' Берек',' Бернард',' Бертран',' Богдан',' Болеслав',' Борис',' Бронислав',' Булат',' Вадим',' Валентин',' Валерий',' Вальтер',' Варфоломей',' Василий',' Вацлав',' Велизар',' Венедикт',' Вениамин',' Викентий',' Виктор',' Вилли',' Вильгельм',' Виссарион',' Виталий',' Витольд',' Владимир',' Владислав',' Владлен',' Володар',' Вольдемар',' Всеволод',' Вячеслав',' Гавриил',' Галактион',' Гарри',' Гастон',            ' Гаяс',' Гевор',' Геннадий',' Генрих',' Георгий',' Геракл',            ' Геральд',' Герасим',' Герман',' Глеб',' Гордей',' Гордон',            ' Горислав',' Градимир',' Григорий',' Гурий',' Густав',            ' Давид',' Дамир',' Даниил',' Даниэль',' Данияр',            ' Дарий',' Дементий',' Демид',' Демосфен',            ' Демьян',' Денис',' Джамал',' Джордан',' Дмитрий',' Добрыня',            ' Дональд',' Донат',' Дорофей',' Евгений',' Евграф',' Евдоким',' Евсевий',' Евсей',' Евстафий',' Егор',' Елеазар',' Елисей',' Емельян',' Еремей',' Ермолай',' Ерофей',' Ефим',' Ефрем',' Жан',' Ждан',' Жорж',' Захар',' Зиновий',' Ибрагим',' Иван',' Игнатий',' Игорь',' Илларион',' Ильдар',' Ильнар',' Ильнур',' Илья',' Ильяс',' Иннокентий',' Иоанн',' Иосиф',' Ипполит',' Искандер',' Ислам',' Камиль',' Карим',' Карл',' Кирилл',' Клим',' Кондрат',' Константин',' Корней',' Кузьма',' Лавр',' Лаврентий',' Лев',' Леон',' Леонид',' Леонтий',' Леопольд',' Лука',' Лукьян',' Любим',' Макар',' Максим',' Максимилиан',' Марат',' Марк',' Марсель',' Мартин',' Матвей',' Мирон',' Мирослав',' Митрофан',' Михаил',' Михей',' Мишель',' Мстислав',' Мурат',            ' Муслим',' Назар'        );        var RandElement = name[Math.floor(Math.random()*(name.length))]; // Выбор случайного элемента из массива        mess.channel.send(RandElement) // Отправка сообщения со случайным элементом из массива в чат
    


Заключение


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

Итого, из этой статьи мы выяснили:

  • Как установить нужные модули и пакеты
  • Как установить среду разработки
  • Как установить среду выполнения
  • Как установить полезные расширения
  • Как создать аккаунт для бота
  • Как воплотить бота в жизнь
  • Как запустить бота
  • Как научить бота реагировать на команды
  • Как пригласить бота на свой сервер
  • Как писать код для работы команд

А также научились некоторым интересным и полезным командам.

Надеюсь, что вам понравилась моя статья и вы узнали из неё что-то новое.

Я постарался объяснить всё максимально доходчиво и подробно.

Следующую часть обучения я планирую сделать об использовании аргументов, а также покажу вам команды для модерации (!kick, !ban, !warn, !mute и т.д).

Сайты для самостоятельного изучения


Основная документация discord.js
Документация discord.js 2
Руководство discord.js
Руководство discord.js 2
Подробнее..
Категории: Javascript , Node.js , Discord , Bot , Боты

Создание Discord-бота, используя библиотеку discord.js Часть 2 Аргументы

21.07.2020 20:05:11 | Автор: admin

Введение


Аргументы являются важнейшей частью 70% команд их изредка называют вводом пользователя, что вполне является правильным.

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

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

const args = message.content.slice(prefix.length).split(/ +/);

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

Конкретный аргумент


Конкретный аргумент можно получить таким образом:

args[0]

В квадратных скобках указывается номер значения в сообщении:



if (mess.content === `${prefix}test`, args[0]){     mess.channel.send(args[0]);}

В Javascript отсчёт всегда идёт с нуля, поэтому, если мы в квадратных скобках укажем 0, бот отправит в чат сообщение с командой, которую мы вписали нулевой аргумент:



Примеры:

args[1]



args[10]



if (mess.content === `${prefix}test`, args[0]){     mess.channel.send(args[1] + ' ' + args[2]);}



Множество аргументов


Все аргументы в сообщении (или по-другому, содержание сообщения) можно получить следующим образом:

args

if (mess.content === `${prefix}test`, args){     mess.channel.send(args)}



Как видите, бот вывел в чат полное содержание сообщения.

Разделение аргументов


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

if (!args[1]) { // Если пользователь не ввёл аргументов после команды, бот отправляет следующее сообщение:     mess.channel.send('Вы не указали никаких аргументов.');}if (args[1]) { // Если пользователь ввёл хоть один аргумент, бот отправляет введённую команду:    mess.channel.send(`Команда: ${args[0]}`);    args.shift(); // Удаление введённой пользователем команды     mess.channel.send(`Аргументы: ${args}`) // Отправление сообщения с аргументами после введённой пользователем команды}

Результат:



Также вы можете добавить определение количества аргументов:

mess.channel.send(`Количество аргументов: ${args.length}`);



Работа с упоминаниями


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

const mention = message.mentions.users.first();

С помощью неё мы получим первого упомянутого пользователя.
Далее, выведем в чат имя упомянутого пользователя:

mess.channel.send(`Пользователь, которого вы упомянули: ${mention.username}`);



Но теперь, если мы пропишем команду без упоминания, в консоли появится ошибка:

TypeError: Cannot read property 'username' of undefined

Это легко исправить, добавим следующие строки:

if (!message.mentions.users.size) {     return mess.channel.send('Вы не указали пользователя!');}



Команды для модерации


Наконец, мы можем приступить к командам для модерации.

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

Для того, чтобы мы в будущем смогли сделать кик/бан после определённого количества предупреждений, нам нужно создать JSON-файл, в котором будет храниться информация о предупреждённом участнике: его ID и количество предупреждений.

Назовём файл data.json и вставим в него две фигурных скобки:

{}

После чего, вернёмся к файлу с нашей командой и добавим в начало кода следующие строки:

const fs = require('fs'); // Подключаем родной модуль файловой системы node.jsvar warns = JSON.parse(fs.readFileSync("./data.json", "utf8")); // Объявляем переменную warns, с помощью которой бот сможет прочитать файл data.json

Несколько проверок:

if (!mess.member.hasPermission("KICK_MEMBERS")) return mess.reply("У вас нет прав для использования данной команды"); // Если пользователь попытается предупредить участника сервера без привилегии KICK_MEMBERS, ему будет в этом отказано.if (!mess.guild.me.hasPermission("KICK_MEMBERS")) return mess.reply("У меня нет прав!") // Если у бота нету привилегии KICK_MEMBERS, он отправит соответствующее сообщениеlet wUser = mess.guild.member(mess.mentions.users.first()) || mess.guild.members.cache.get(args[0]) // Восприятие упоминания и аргументаif(wUser.id === mess.author.id) return message.channel.send("Вы не можете выдать предупреждение самому себе!"); // Если пользователь попытается предупредить самого себя, ему будет в этом отказано.if (!wUser) return mess.reply("Вы не указали пользователя") // Если пользователь не найден/не указан - в предупреждении пользователю будет отказано

Запись данных в .json файл:

if (!warns[wUser.id]) warns[wUser.id] = { // Если ID пользователя не найден, количество предупреждений устанавливается на 0     warns: 0};warns[wUser.id].warns++; // Если все проверки прошли успешно, к текущему количеству предупреждений пользователя прибавляется +1fs.writeFile("./data.json", JSON.stringify(warns), (err) => { // Все данные сохраняются в .json файле        if (err) console.log(err)});

Перейдём к самой большой и заключительной части кода она отвечает за кик участника сервера после обнаружения трёх предупреждений, за обнуление счётчика предупреждений и за отправку embed'ов.

if (warns[wUser.id].warns >= 3) { // Если обнаружено 3+ предупреждений, то...    wUser.kick("3/3 предупреждений") // Кикнуть участника сервера по причине "3/3 предупреждений"    if (warns[wUser.id].warns >= 3) warns[wUser.id] = { // Если обнаружено 3+ предупреждений, их количество устанавливается на 0            warns: 0    };    fs.writeFile("./data.json", JSON.stringify(warns), (err) => { // Всё сохраняется в .json файл          if (err) console.log(err)    });    var warn_embed1 = new Discord.MessageEmbed() // Embed, отправляющийся при третьем предупреждении         .setColor('#db0f0f')         .addFields(                { name: 'Пользователь', value: `<@${mess.author.id}>` },                { name: 'Выдал предупреждение', value: wUser },                { name: 'Количество предупреждений', value: '3/3 **[Кик]**' }    );    mess.channel.send(warn_embed1)    } else { // Иначе...    var warn_embed2 = new Discord.MessageEmbed() // Embed, отправляющийся при 1 и 2 предупреждении         .setColor('#db0f0f')         .addFields(                { name: 'Пользователь', value: `<@${mess.author.id}>` },                { name: 'Выдал предупреждение', value: wUser },                { name: 'Количество предупреждений', value: `${warns[wUser.id].warns}/3` }    );    mess.channel.send(warn_embed2)    if (warns[wUser.id].warns >= 3) warns[wUser.id] = { // Если обнаружено 3+ предупреждений, их количество устанавливается на 0          warns: 0    };    fs.writeFile("./data.json", JSON.stringify(warns), (err) => { // Всё сохраняется в .json файле        if (err) console.log(err)    });   }}

Результат:



После выдачи предупреждения, в файле data.json должна появиться подобная строка:

{"123456789012345678":{"warns":1}}

Это и есть ID предупреждённого пользователя и количество предупреждений.
После достижения трёх предупреждений, их количество устанавливается на 0.

Перейдём к команде для бана, она значительно проще в написании и компактнее в объёме, т.к нам не понадобится .json файл и запись в него данных.

Для начала, добавим уже знакомые нам строки, но немного видоизменённые:

if (!mess.member.hasPermission("BAN_MEMBERS")) return mess.reply("У вас нет прав для использования данной команды");let bUser = mess.guild.member(mess.mentions.users.first()) || mess.guild.members.cache.get(args[0])if(bUser.id === mess.author.id) return message.channel.send("Вы не можете забанить самого себя!"); if (!mess.guild.me.hasPermission("BAN_MEMBERS")) return mess.reply("У меня нет прав!")

Переназначим переменную args для последующего добавления причины бана:

args = mess.content.split(' '); // Занесли в массив всё содержание сообщенияargs.splice(0, 2); // Начиная с позиции 0, удалили 2 элемента из массиваargs = args.join(' '); // Объединили все элементы в массиве

Добавим пару проверок и функцию бана:

if (!bUser) return mess.reply("Вы не указали пользователя!") if (!args) return mess.reply("Вы не указали причину!")bUser.ban()

И наконец, напишем заключительный embed:

var ban_embed = new Discord.MessageEmbed()     .setColor('#db0f0f')     .addFields(         { name: 'Пользователь', value: `<@${mess.author.id}>` },         { name: 'Забанил', value: bUser },         { name: 'По причине', value: args }     );mess.channel.send(ban_embed)

Результат:



На команде для кика мы заострять внимание не будем, так как она является точной копией команды для бана.
Код
if (!mess.member.hasPermission("KICK_MEMBERS")) return mess.reply("У вас нет прав для использования данной команды");if (!mess.guild.me.hasPermission("KICK_MEMBERS")) return mess.reply("У меня нет прав!")let kUser = mess.guild.member(mess.mentions.users.first()) || mess.guild.members.cache.get(args[0])if(kUser.id === mess.author.id) return message.channel.send("Вы не можете кикнуть самого себя!"); args = mess.content.split(' ');args.splice(0, 2);args = args.join(' ');if (!kUser) return mess.reply("Вы не указали пользователя!")if (!args) return mess.reply("Вы не указали причину!")kUser.kick(args)var kick_embed = new Discord.MessageEmbed()     .setColor('#db0f0f')     .addFields(         { name: 'Пользователь', value: `<@${mess.author.id}>` },         { name: 'Кикнул', value: kUser },         { name: 'По причине', value: args }     );mess.channel.send(kick_embed)


Следующая по счёту команда для заглушения пользователя.

Код для данной команды почти ничем не отличается от предыдущих, добавляется лишь несколько строк.

Начнём с объявления привычной нам уже переменной, переназначения переменной args:

let mUser = mess.guild.member(mess.mentions.users.first()) || mess.guild.members.cache.get(args[0])args = mess.content.split(' ');args.splice(0, 2);args = args.join(' ');

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

let muterole = mess.guild.roles.cache.find(role => role.name === "Muted");if (!mUser) return mess.reply("Вы не указали пользователя!")if (!args) return mess.reply("Вы не указали причину!")if (!muterole) return mess.reply("На этом сервере нету роли **Muted**, создайте её!");mUser.roles.add(muterole)

Два embed'а и их отправка:

var mute_embed = new Discord.MessageEmbed()    .setColor('#db0f0f')    .addFields(        { name: 'Пользователь', value: `<@${mess.author.id}>` },        { name: 'Выдал мут', value: mUser },        { name: 'По причине', value: args });var dm_mute_embed = new Discord.MessageEmbed()    .setColor('#db0f0f')    .addFields(        { name: 'Пользователь', value: `<@${mess.author.id}>` },        { name: 'Выдал мут', value: `Вам, ${mUser}` },        { name: 'На сервере', value: mUser.guild },        { name: 'По причине', value: args });mUser.send(dm_mute_embed) // Embed отправляется пользователю, которому выдан мут в ЛСmess.channel.send(mute_embed) // Embed отправляется в чат

Заключение


Из этой статьи мы узнали:

  • Как работать с конкретным аргументом
  • Как работать с множеством аргументов
  • Как разделять аргументы
  • Как работать с упоминаниями

А также написали несколько команд для модерации.
Следующая часть будет посвящена embed'ам и работе с ними.

Спасибо за прочтение!

Сайты для самостоятельного изучения



Предыдущие статьи


Подробнее..
Категории: Javascript , Node.js , Discord , Bot , Боты

Botsman новая платформа для разработки Telegram-ботов

30.12.2020 12:20:04 | Автор: admin

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

Для тех же, кому уже захотелось ознакомиться с Botsman (но не очень хочется много читать) вот ссылка, милости прошу: https://bots.mn/. Главное, о чём стоит помнить платформа только-только запустилась, и (пока что) не стоит переносить на неё что-то серьёзное и масштабное.

Предыстория: путь к созданию Ботсмана

Пять лет назад в Telegram появилась возможность создавать ботов автоматизированные аккаунты, которыми можно управлять с помощью своих скриптов. Меня это сразу заинтересовало: я люблю делать маленькие, но полезные утилитки.

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

Поэтому почти сразу пришла в голову идея сделать такую платформу, которая возьмёт весь мониторинг на себя: будет логировать и входящие обновления, и то, как бот на них реагирует (и какие возникают при этом ошибки). Заодно можно и графики удобные строить.

Но, к сожалению, дальше придумывания красивого названия Botsman и покупки короткого домена bots.mn дело поначалу не зашло. Проект оказался непривычно большим для того, чтобы осилить его в одиночку, и за пять лет я то брался за него, то снова откладывал на потом.

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

Итак, что же сейчас предлагает данная платформа?

Проксирование запросов

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

Выбор способа обработки запросов ботомВыбор способа обработки запросов ботом

У этой фичи есть очевидный недостаток: небольшое увеличение времени отклика (поскольку в цепочке Telegram ваш сервер появляется дополнительное звено).

Но этой осенью Telegram сделал крутую вещь: они выложили в открытый доступ код сервера-посредника Bot API. По своей сути это такое приложение, которое внутри общается с Телеграмом как клиент по их протоколу MTProto, а снаружи у него торчит уже простое и понятное Bot API. И когда вы обращаетесь к публичному Bot API по HTTPS запрос на самом деле идёт к инстансу такого сервера, а теперь стало можно поднять его самому. И конечно же, внутри Ботсмана я так и сделал (и это новшество оказалось ещё одним мотиватором закончить проект).

Таким образом, вашего бота можно настроить так, что цепочка не станет длиннее: вместо
Telegram сервер Bot API ваш сервер будет
Telegram Botsman ваш сервер.

Правда, тут уже потребуются правки в коде вашего бота: исходящие запросы придётся делать не на api.telegram.org, а на api.bots.mn/telegram. Зато Botsman сможет логировать и их тоже!

Собственно, поговорим о логировании:

Живая лента обновлений

После настройки бота в Botsman, можно сразу открыть страницу Events, отправить что-то в Телеграме своему боту, и увидеть, как это сообщение появилось на экране в реальном времени. Если у вас настроен прокси вы увидите и результат перенаправления запроса вашему серверу. Если ваш сервер шлёт запросы через проксирующий эндпоинт api.bots.mn/telegram они тоже туда попадут.

Так в интерфейсе Botsman выглядит лог всех происходящих с ботом событийТак в интерфейсе Botsman выглядит лог всех происходящих с ботом событий

С технической стороны, конечно, тут всё просто: я использую веб-сокеты чтобы проталкивать все обновления на клиент, если у вас открыта соответствующая вкладка (если открытых страниц нет, лишней нагрузки это создавать не должно). Возможно, если бы я начинал этот проект сейчас, я бы попробовал использовать Server-sent events вместо веб-сокетов, но вряд ли есть какой-то повод переходить на них.

Кроме бесконечного лога, куда все события сыпятся вперемешку, Botsman ещё умеет показывать интерфейс, похожий на обычный список диалогов в самом мессенджере то, как их видит ваш бот. При желании можно даже никак не обрабатывать запросы, а просто вручную открывать диалоги и отвечать от имени бота (этакий режим техподдержки возможно, впоследствии я добавлю поддержку управления ботами с нескольких аккаунтов с разными ролями, если это действительно будет актуально).

Слежение за показателями бота

Ну и конечно же, статистика и графики, куда без них. Честно говоря, аналитик из меня так себе, поэтому сейчас Botsman показывает только довольно базовые метрики общее число апдейтов, число чатов, число пользователей, дневную и месячную аудиторию (DAU и MAU). Графики по числу апдейтов на каждый день/час, и по среднему времени обработки запросов. Было бы, конечно, интересно смотреть на всякую демографию, но в Telegram в этом плане мало информации о пользователях.

Графики в разделе Stats. Как видно, через одного из моих ботов уже прошло почти 20 млн апдейтов.Графики в разделе Stats. Как видно, через одного из моих ботов уже прошло почти 20 млн апдейтов.

Для подсчёта статистики я с самого начала выбрал старый добрый Redis, а вот на клиентской стороне решил рисовать графики с помощью библиотеки, которую до этого сам же написал на конкурс того же Телеграма. Не пропадать же добру :)

Скриптинг

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

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

Поэтому я выбрал JavaScript: моя изначальная идея была взять встроенную в Node песочницу, немного доработать (как это сделано в библиотеках Sandcastle или vm2), чтобы сделать её безопаснее, и выполнять код ботов в ней.

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

В итоге я обратил внимание на библиотеку isolated-vm: она тоже реализует песочницу в JS, но делает это другим, более безопасным (и, что важно, многопоточным) образом. По сути это обёртка над присутствующим в V8 механизмом изолятов независимых контекстов, которые ничего не знают друг про друга. Эта же библиотека, кстати, используется в игре Screeps, где игрокам тоже нужно писать своих ботов.

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

Скриптинг: внутреннее API, обработчики событий

Дальше одним из камней преткновения было дать удобное внутреннее API для написания ботов. Конечно, можно было сказать вашему коду будет доступна переменная update и метод callMethod, а дальше делайте, что хотите. Но раз уж я проектирую всю песочницу, нужно идти до конца.

В частности, мне хотелось реализовать механизм состояний: часто боты рассчитаны на пошаговый диалог, и это надо учесть, как-то запоминать контекст, даже если пользователь бросил диалог и вернулся к нему на следующий день. В итоге я решил, что для каждого чата, пользователя или сообщения я позволю хранить объект с произвольными полями. А у чатов (как личных, так и групповых) в придачу есть понятие пути, route оно позволяет раскидать обработчики событий по тому, на каком шаге находится пользователь.

Само добавление обработчиков делается довольно просто:

on(ctx => {  ctx.log('Some update received: ', update);});

Это самый универсальный обработчик: он вызывается при любом событии (напомню, кроме события пришло сообщение Telegram присылает и ряд других оповещений).

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

on('message', ctx => {  ctx.message.reply('Hi!');});

А что будет, если объявить два обработчика и они оба подходят для текущего апдейта? Botsman вызовет только первый из них но можно передать управление следующему, если вернуть false (ну или промис, резолвящийся в false разумеется, всё делалось с расчётом на асинхронный код).

Ещё есть удобные способы обработывать только текстовые сообщения с помощью on.text (их можно заодно ещё и фильтровать по регэкспу), только команды с помощью on.command, инлайн-запросы on.inline, и коллбэк-запросы (нажатия на кнопки под отправленными сообщениями) on.callback. О них можно почитать в документации.

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

Ну а как разграничить обработчики для разных состояний (путей) чата? Для этого предназначена глобальная функция state:

state('step1', (on, state) => {  // Этот обработчик вызовется для любого сообщения,  // если наш чат в состоянии 'step1' - и переведёт его  // в состояние 'step2'  on.text(ctx => {    ctx.route.to('step2');   });});state('step2', (on, state) => {  // А этот обработчик вызывается, если наш чат в  // состоянии 'step2' и возвращает его в 'step1'  on.text(ctx => {    ctx.route.to('step1');   });});

Обратите внимание: функция state немедленно вызывает переданный ей коллбэк с двумя аргументами, которые заменяют собой глобальные функции on и state. Добавленный с помощью локальной функции on обработчик будет вызываться только в указанном состоянии, а с помощью локальной функции state можно создавать вложенные состояния (хотя их можно создать и вручную, просто записывая путь, разделённый слэшами: 'step1/substep1/branchA'). Пока что, впрочем, иерархическая структура состояний особых преимуществ по сравнению с линейной не имеет (но может помочь их логически упорядочить).

Скриптинг: форматируем сообщения с помощью tagged template literals

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

К счастью, не так давно при отправке сообщения (и в других методах, где можно отправлять форматированный текст) появилась возможность просто указать отдельно, какие участки в нём нужно отформатировать. Добавляем к этому tagged templates из ES6 и получаем вот что:

await ctx.call('sendMessage', {  chat_id: 12345,  ...fmt`Hello ${fmt.bold(foo)}! You can combine ${fmt.italic(bar).bold()} styles together.Links are supported ${fmt.text_link(linkLabel, linkUrl)}.`,});

Выглядит немного непривычно, зато а) не нужно ничего эскейпить, б) невозможно сломать вёрстку, потеряв какой-нибудь HTML-тэг или символ разметки Markdown. Если у вас валидный JS будет и валидная вёрстка. Под капотом запись fmt`something` возвращает объект с двумя полями text и entities поэтому его нужно распаковывать с помощью ... (spread syntax). Ну или его можно передать напрямую в короткие методы типа ctx.message.reply(fmt`something`) или ctx.chat.say(fmt`something`).

Мне кажется, что у tagged template literals вообще не очень много уместных применений в реальном мире, но тут у меня получилось найти одно из них :)

Скриптинг: код по расписанию и запросы к внешним API

Должен сделать важную оговорку: так как код выполняется в изолированных контекстах, у скриптов нет ни доступа к API самой Node, ни возможности импортировать внешние модули. Однако я реализовал метод fetch (по аналогии с одноимённым браузерным API) он позволяет делать не слишком тяжёлые запросы к внешним серверам. Кроме того, доступна глобальная функция cron с помощью неё можно запланировать регулярное выполнение повторяющихся действий:

cron('0 0 * * FRI', ctx => {  ctx.log('This function should execute each Friday at midnight');});

Первый параметр тут либо привычный формат crontab, либо интервал в секундах (правда, и то, и другое с разрешением не чаще раза в пять минут). Я думаю, что возможности выполнять код по расписанию и делать запросы к внешним API позволят реализовать множество практических задач. И не исключено, что в будущем список возможностей (например, импорт каких-то проверенных модулей) будет расширяться.

Скриптинг: веб-интерфейс

Писать код прямо в браузере не самое комфортное занятие, но я стремлюсь сделать его хотя бы сравнимым с разработкой в IDE. Сейчас в качестве редактора я использую CodeMirror (в первую очередь из-за его относительно небольшого веса), в дальнейшем, вероятно, добавлю возможность переключиться на Monaco он ощутимо тяжелее, зато должен быть шустрее и функциональнее (именно он используется внутри VS Code).

Так сейчас выглядит редактор кода в BotsmanТак сейчас выглядит редактор кода в Botsman

Пока что в Botsman нет разбивки кода на отдельные файлы в этом тоже может быть неудобство, если вы собираетесь писать сложного бота. Зато код сохраняется автоматически, и есть возможность хранить все его предыдущие версии это ещё не Git, но всё же.

И ещё одна небольшая, но довольно ценная возможность: проверка кода перед деплоем с помощью тестов. При этом Botsman по нажатию одной кнопки сразу покажет подробный лог выполнения (см. скриншот выше): время инициализации, обработки запроса, отладочный вывод и возникшие ошибки (код с синтаксическими ошибками задеплоить не выйдет в принципе).

Песочница для запросов к Telegram

Ну и последняя небольшая, но довольно полезная фича Botsman, о которой хотелось бы рассказать панель для формирования запросов к Telegram. Нередко социальные сети предоставляют собственный инструмент для этого, но у Телеграма его, к сожалению, нет. Поэтому я сделал страницу, где можно выбрать нужный метод API, заполнить его параметры и наглядно увидеть результат вызова. Заодно можно сразу скопировать эквивалентный код, делающий этот запрос.

Панель вызова методов Telegram APIПанель вызова методов Telegram API

Будущие планы

Как было сказано ранее, Botsman находится в самом начале своего пути. Возможно, его даже настигнет Хабраэффект (надеюсь, что нет!). Возможно, ему станет тяжко, если созданные на нём боты наберут популярность не исключено, что тогда придётся вводить платные возможности. Поскольку занимаюсь им я сейчас в одиночку, сложно сказать, что с ним будет.

В очень примерных планах сейчас такие фичи:

  • Визуальный конструктор в дополнение к скриптингу

  • Глобальное key-value хранилище + создание собственных хранилищ

  • Поддержка других платформ, кроме Telegram

  • Доступный снаружи эндпоинт для вызова кода бота

  • Управление ботом с нескольких аккаунтов

  • Навигация по коду, разбивка на модули, поддержка сторонних модулей

  • Более гибкое тестирование кода, автоматические тесты

  • Больше статистики и графиков

  • Оповещения (если с ботом что-то не так)

  • Улучшение вида чатов

  • Улучшение работы с файлами (скачивание, загрузка), в том числе в песочнице

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

Подробнее..

Botfather универсальный фреймворк для автоматизации

16.04.2021 20:09:46 | Автор: admin

Привет, Хабр!

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

Общие сведения

Называется эта программа Botfather. Скачать ее можно с официального сайта. Написана она с использованием библиотеки Qt и доступна как для Windows, так и для GNU/Linux. Для дистрибутивов GNU/Linux приложение доступно только в виде пакета flatpak. На официальном сайте имеется некоторое количество скриптов и довольно неплохая документация.

Итак, устанавливаем программу и запускаем. Нас встречает примерно такое окно:

Я уже добавил двух ботов. Самый первый в списке позволяет вести поиск заданного объекта на изображении. Второй умеет заходить на сайт botfather.io под определенным логином и паролем. Можно добавлять новых ботов из имеющихся в списке или создавать своих. Вот список готовых ботов:

Вызывается этот список по нажатию на "Add a bot". В программе имеется встроенный браузер, но своего редактора кода нет. Писать код для бота можно в любом текстовом редакторе, который вам по душе. Писать придется на языке JavaScript. Также в панели инструментов можно заметить кнопку "Android". С ее помощью можно подключить свой телефон или планшет и запускать ботов на мобильных устройствах. Теперь подробнее об уже добавленных мной ботах.

Image Detection Demo

Как уже говорилось, этот бот умеет искать указанный объект на изображении. Откроем его папку, перейдя во вкладку "Settings" и нажав на кнопку "Open bot folder". Мы увидим вот это:

Мы видим сам файл скрипта find_boxes.js, изображение box.png, которое следует искать и изображение screenshot.png, в котором нужно искать. Посмотрим на скрипт:

// Read the Image and Vision APIs documentation to lear more.// https://botfather.io/docs/var screenshot = new Image("screenshot.png");var box_template = new Image("box.png");var matches = Vision.findMatches(screenshot, box_template, 0.99);Helper.log(matches.length, "boxes have been found:")for (var i = 0; i < matches.length; i++) {Helper.log(matches[i]);}var output = Vision.markMatches(screenshot, matches, new Color("red"));output.save("output.png");Helper.log("The matches have been marked red on a newly created image.");Helper.log("That output image which has been saved as 'output.png'");Helper.log("Open the bots folder to view it.");

Здесь я бы хотел отметить переменную output. Как можно видеть, у нас в папке бота, после его отработки, должно появиться еще одно изображение, в котором красной рамкой будут выделены все найденные элементы. Проверим! Запускаем бот и смотрим логи:

Судя по логам, изображение должно быть в папке. Откроем ее:

Да, действительно, бот отработал на отлично:

Посмотрим теперь на следующего бота.

Website Login Demo

Немного рассмотрим сначала код этого бота:

function main(){// Validate the user script configurationif (!Config.getValue("username") || !Config.getValue("password")){Helper.log("Please provide a Botfather username and password in the bots 'Config' tab.");return;}// Load the Botfather login pagevar browser = new Browser("Main Browser");browser.loadUrl("https://botfather.io/accounts/login/");browser.finishLoading();// Fill out the username and password fieldvar u = Config.getValue("username");var p = Config.getValue("password");browser.executeJavascript("document.getElementById('id_username').value = '" + u + "';");browser.executeJavascript("document.getElementById('id_password').value = '" + p + "';");Helper.sleep(4);// Submit the formbrowser.executeJavascript("document.getElementById('id_password').form.submit();");Helper.sleep(2);browser.finishLoading();// Tell the script user whether login succeeded or notif (browser.getUrl().toString().indexOf("/accounts/login") !== -1){Helper.log("Looks like login failed. Open the browser to check for yourself.");return;}Helper.log("Success! You're logged in. Open the browser to check for yourself.")}main();

Как видно, этот бот заходит на официальный сайт botfather.io под логином и паролем. Эти данные нужно заранее ввести во вкладке "Config":

После запуска бота во вкладке "Browsers" появится браузер. Оттуда его можно и запустить. Так как у меня нет аккаунта на сайте botfather.io, то мне в логах было показано это:

После регистрации на сайте, по указанным во вкладке "Config" данным, запускаю бота снова. Получаю следующее:

Встроенный браузер подтверждает успешный вход:

Теперь немного пробежимся по API этого фреймворка.

Небольшой обзор API

Android

У меня получилось подключить свой телефон, но для этого нужно получить права разработчика и разрешить отладку по USB. Подключение должно быть в режиме PTP (камера). Ниже привожу примеры из официальной документации.

Можно сделать скриншот:

Android.takeScreenshot();

Получить список всех пакетов:

Android.listPackages();

Запустить приложение:

Android.startApp(package);

Сымитировать тап:

Android.sendTap(location);

Свайп:

Android.sendSwipe(start, end, duration_in_ms);

И многое другое.

Desktop

Получить позицию курсора:

var mousePositionPoint = Desktop.getCursorPosition();

Клик левой кнопкой мыши:

var position = new Point(300, 300);// A simple left clickDesktop.pressMouse(position);// This is equivalent toDesktop.pressMouse(position, "left");// And also equivalent toDesktop.holdMouse(position, "left");Desktop.releaseMouse(position, "left");

Пример функции перетаскивания:

function dragAndDrop(from, to) {    Desktop.holdMouse(from, "left");    Helper.msleep(750);    // Drag is triggered by first moving the element a little    var dragTriggerOffset = from.pointAdded(new Point(25, 25));    Desktop.warpCursor(dragTriggerOffset);    Helper.msleep(750);    Desktop.releaseMouse(to, "left");}// The function is then called like this:dragAndDrop(new Point(60, 60), new Point(400, 60));

Ввод простых символов:

// Entering lowercase "a"Desktop.press("a");// Entering uppercase "A"Desktop.holdKey("shift");Desktop.pressKey("a");Desktop.releaseKey("shift");

И так далее. В разделе документации на сайте много примеров.

Browser

Загрузить страницу:

Browser.loadUrl(url);

Вызвать перезагрузку:

Browser.reload();

Выполнить код на странице:

Browser.executeJavascript(javascript_code);

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

Browser.stopLoading();

Ожидание загрузки браузера:

Browser.finishLoading(timeout_seconds);

Пример создания браузеров и загрузки страниц:

var browser1 = new Browser("Browser Name 1");var browser2 = new Browser("Browser Name 2", new Size(1200, 600));browser1.loadUrl("https://google.com/");browser2.loadUrl("https://youtube.com/");browser1.finishLoading(); // (default) waits max 30 seconds for the website to loadbrowser2.finishLoading(10); // waits max 10 seconds for the website to load

На этом все! Надеюсь, что вам было интересно. До встречи в следующих постах!


Дата-центр ITSOFT размещение и аренда серверов и стоек в двух дата-центрах в Москве. За последние годы UPTIME 100%. Размещение GPU-ферм и ASIC-майнеров, аренда GPU-серверов, лицензии связи, SSL-сертификаты, администрирование серверов и поддержка сайтов.

Подробнее..

Оплата в телеграм боте Платежи 2.0 Сбербанк Telegraf Node.js

02.05.2021 10:10:12 | Автор: admin

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



И в этом туториале мы создадим простого бота с Node.js на фреймворке Telegraf.js, который сможет принимать деньги с клиента и отправлять их на ваш счет через Сбербанк.


Платежи 2.0


Платежи 2.0


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


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


На данный момент поддерживаются платежи из более чем 200 стран через следующие платежные системы:


Платежи 2.0


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


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


Создаём бота в Telegram


Бот в Telegram создается при помощи другого бота под названием @BotFather. Отправляем ему команду /newbot, выбираем имя, которое будет отображаться в списке контактов, и адрес. Например, Оплата в Telegram боте с адресом sber_pay_test_bot.


newbot


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


ВНИМАНИЕ! Его нужно сохранить и никому не показывать.


Создаем проект Node.js


Далее создадим новый проект. Создаем папку.


Вводим в консоле:


mkdir sber_pay_test_bot && cd sber_pay_test_bot

Затем:


npm init 

Программа задаёт вам разные вопросы и создает package.json, который определяет настройки проекта, зависимости, скрипты, название и прочее. Для примера можно везде нажать enter


и добавим файл index.js в котором будет разрабатываться наш бот.


touch index.js    

Telegraf.js


Cтавим telegraf.js это один из популярных фреймворков для создания телеграм бота.


npm install telegraf@3.38 

Ставим библиотеку dotenv это модуль, который загружает переменные среды из файла .env в process.env., а также заодно поставим nodemon инструмент, который помогает разрабатывать приложения на основе node.js путем автоматического перезапуска приложения node при обнаружении изменений файлов в каталоге.


npm install dotenv nodemon

Добавляем скрипт запуска в package.json


"scripts": {    "start": "nodemon index"}

Из документации telegraf.js, копируем в наш проект первоначальную настройку бота.


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherbot.start((ctx) => ctx.reply('Welcome')) //ответ бота на команду /startbot.help((ctx) => ctx.reply('Send me a sticker')) //ответ бота на команду /helpbot.on('sticker', (ctx) => ctx.reply('')) //bot.on это обработчик введенного юзером сообщения, в данном случае он отслеживает стикер, можно использовать обработчик текста или голосового сообщенияbot.hears('hi', (ctx) => ctx.reply('Hey there')) // bot.hears это обработчик конкретного текста, данном случае это - "hi"bot.launch() // запуск бота

Создаем файл .env куда в переменную BOT_TOKEN кладем токен, который ранее нам выдал @BotFather


BOT_TOKEN='сюда'

Запускаем бот командой


npm run start

Проверяем работу бота


check bot


Получаем PROVIDER_TOKEN от @SberbankPaymentBot


Для получения PROVIDER_TOKEN вам необходимо получить merchantLogin в Сбербанке. Для этого необходимо подключить услугу интерент-эквайринг в Сбербанке.


После того как вы его получили переходим в @BotFather и вызываем команду /mybots, где выбираем вашего бота.


Далее Payments


Payments


Где выбираем Сбербанк


Payments


Выбираем Connect Сбербанк Live


Payments


После этого вас перекинет на @SberbankPaymentBot, где нужно ввести ваш merchantLogin, который необходимо вводить без всяких префиксов -api или -operator. Например так: P71XXXXXXX21. Из-за того что я этого не знал, у меня ушло на переписку с техподдержкой Сбербанка неделя времени.


SberbankPaymentBot


После @BotFather выдаст вам токен, который нужно вставить в переменную PROVIDER_TOKEN файла .env


PROVIDER_TOKEN='41018XXXX:LIVE:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

SberbankPaymentBot


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


Пишем в index.js следующий код:


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherconst getInvoice = (id) => {  const invoice = {    chat_id: id, // Уникальный идентификатор целевого чата или имя пользователя целевого канала    provider_token: process.env.PROVIDER_TOKEN, // токен выданный через бот @SberbankPaymentBot     start_parameter: 'get_access', //Уникальный параметр глубинных ссылок. Если оставить поле пустым, переадресованные копии отправленного сообщения будут иметь кнопку Оплатить, позволяющую нескольким пользователям производить оплату непосредственно из пересылаемого сообщения, используя один и тот же счет. Если не пусто, перенаправленные копии отправленного сообщения будут иметь кнопку URL с глубокой ссылкой на бота (вместо кнопки оплаты) со значением, используемым в качестве начального параметра.    title: 'InvoiceTitle', // Название продукта, 1-32 символа    description: 'InvoiceDescription', // Описание продукта, 1-255 знаков    currency: 'RUB', // Трехбуквенный код валюты ISO 4217    prices: [{ label: 'Invoice Title', amount: 100 * 100 }], // Разбивка цен, сериализованный список компонентов в формате JSON 100 копеек * 100 = 100 рублей    payload: { // Полезные данные счета-фактуры, определенные ботом, 1128 байт. Это не будет отображаться пользователю, используйте его для своих внутренних процессов.      unique_id: `${id}_${Number(new Date())}`,      provider_token: process.env.PROVIDER_TOKEN     }  }  return invoice}bot.use(Telegraf.log())bot.hears('pay', (ctx) => { . // это обработчик конкретного текста, данном случае это - "pay"  return ctx.replyWithInvoice(getInvoice(ctx.from.id)) //  метод replyWithInvoice для выставления счета  })bot.on('pre_checkout_query', (ctx) => ctx.answerPreCheckoutQuery(true)) // ответ на предварительный запрос по оплатеbot.on('successful_payment', async (ctx, next) => { // ответ в случае положительной оплаты  await ctx.reply('SuccessfulPayment')})bot.launch()

Метод Telegraf replyWithInvoice это метод telegram.sendInvoice.


Используйте этот метод для отправки счетов. В случае успеха отправленное сообщение возвращается.


Запускаем бот командой yarn start и проверяем проходит ли оплата.


Проверить как работает оплата можно в наших телеграм ботах JavaScript Bot это бот с тестовыми вопросами по нашим курсам JavaScript, React Native, TypeScript, а также проверить платежи можно боте по изучению английских слов по эмодзи Englishmoji


Проблемы или вопросы?


Задавайте их в телеграм сообществе Боты на Telegraf


Подписывайтесь на наши новости и социальные сети.


JavaScript Camp

Подробнее..

Telegram-бот на Python для создания задач в MS Outlook и заметок в Evernote

29.03.2021 10:21:19 | Автор: admin

В MS Outlook есть прекрасный раздел задач. Это удобно и быстро. Можно с утра (или с вечера) накидать себе задачек на день и постепенно расщёлкивать их. Вторым уровнем группируем задачи по матрице Эйзенхауера или используем любой другой удобный вам инструмент тайм-менеджмента. Одна проблема с этими задачами: для их создания надо заходить в Outlook, щёлкать, писать, нажимать Enter, двигать в нужную группу. Это всё долго и не всегда удобно. Но есть в Outlook также правила, позволяющие письма содержащие определённые слова в теме автоматически делать задачами. Ещё быстрее и проще получится, если такие письма отправляются прямо из Telegram. О простейших ботах помогающих создавать задачи в MS Outlook и заметки в Evernote без необходимости сложных интеграций.

Бот: Telegram + Python + Docker

Строго говоря ботов два. Пока не получилось совместить весь функционал в одном боте так, чтобы это было удобно как переслать/накидать сообщение и нажать на кнопку "Send". Немного о стеке. Python был выбран за простоту кода и доступность для менеджеров проектов без глубоких познаний в программировании. Docker удобно упаковать бота в контейнер и запускать в нём, без необходимости думать о версиях Linux на хостинге, настройках сервисов и так далее. В качестве хостера использовался DigitalOcean, в котором Docker-контейнеры разворачиваются легко и просто.

Конечно же использовался не чистый Telegram API, а удобный telebot. Для отправки писем вполне подошла стандартная библиотека smtplib. Для сокращения текста используется textwrap. А формированием сущности сообщения занимается тоже стандартная email.mime:

import osimport telebotimport smtplibimport textwrapfrom email.mime.text import MIMEText

Пароли в контейнер кладём аккуратно. Чтобы не хранить их открытым текстом в исходнике, используем переменные окружения:

#ConfigurationCFG_TOKEN = os.environ.get('CFG_TOKEN') #TELEGRAM_BOT_TOKENCFG_SMTP_LOGIN = os.environ.get('CFG_SMTP_LOGIN') #'%YOUR_SMTP_LOGIN_ON_YANDEX%'CFG_SMTP_PASS = os.environ.get('CFG_SMTP_PASS') #'%YOUR_SMTP_PASS_ON_YANDEX%'CFG_SMTP_FROM = os.environ.get('CFG_SMTP_FROM') #'%FROM_EMAIL_ADDRESS%'CFG_SMTP_TO = os.environ.get('CFG_SMTP_TO') #'%TO_EMAIL_ADDRESS%'

При запуске Docker-контейнера берём переменные откуда нам удобно, например из файла .env или переменной окружения на хостовой машине.

Бот частный. Он не предназначен для раздачи доступов всем подряд. Поэтому в самом начале проводим проверку отправителя. Мне было лень писать обработчик значений с разными типами, поэтому я написал обработчик исключения:

try:    CFG_OWNER_ID = int(os.environ.get('CFG_OWNER_ID')) #YOUR_USER_ID_IN_TELEGRAMexcept:    CFG_OWNER_ID = os.environ.get('CFG_OWNER_ID')

Собственно письмо формируем по следующему алгоритму. Если текста сообщения менее или равна 40 символам, то помещаем его целиком в тему письма, а в теле пишем стандартный текст. Если более - помещаем первые 40 символов, а остаток кладём в тело письма. Это точно позволяет обойти какие-то правила антиспам-фильтра Яндекса, который использовался для рассылки сообщений.

msg = MIMEText('')if len(txt) > 40:txt = textwrap.shorten(txt, width=40, placeholder="...") #Лишнее обрезаем тремя точками  msg = MIMEText(message.text)else:msg = MIMEText("Задача из Telegram")

Если пересылаем сообщение другого пользователя (например, начальника) и делаем его сообщение задачей, то подсвечиваем в теме письма имя нашего контакта:

if "forward_sender_name" in message.json:txt = f'[{message.json["forward_sender_name"]}] {txt}'elif "forward_from" in message.json:  txt = f'[{message.json["forward_from"]["first_name"]}] {txt}'

Метим наше сообщение в теме как "[TASK]", чтобы MS Outlook мог его отличить от обычных писем и обработать правилами:

msg['Subject'] = f'[TASK] {txt}'

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

try:server = smtplib.SMTP_SSL('smtp.yandex.ru:465')  server.login(CFG_SMTP_LOGIN, CFG_SMTP_PASS)  server.sendmail(CFG_SMTP_FROM, CFG_SMTP_TO, msg.as_string())   bot.send_message(message.from_user.id, "Задача отправлена в Outlook")  server.quit()except Exception as err:  bot.send_message(message.from_user.id, f"При отправке сообщения произошла ошибка: {str(err)}")

Полный код бота доступен здесь: https://github.com/nsuvorov83/sendtask-bot

Настройка MS Outlook

Правила MS Outlook настраиваются просто:

А как отправлять заметки в Evernote?

Для того, чтобы была возможность отправить сообщение в бота, которое автоматом станет заметкой в Evernote нужно написать код чуть по сложнее. Принцип тот же: отправляем сообщение, которое потом превращается в e-mail отправляемый на специальный адрес. Все письма поступающие по этому адресу становятся заметками.

Ключевой момент здесь - обработка типов сообщений и вложений. Определяем функции-обработчики для различных типов сообщений Telegram:

def _is_photo(message):        return message.photodef _is_document(message):        return message.documentdef _is_text(message):    return message.textdef _is_caption(message):    return message.caption  #А вот как определяется сам тип сообщения. Если тип некорректный, то вернётся Falseif _is_photo(message):#Photo handler  cached_files = getPhotoCached(message)  #Insert into e-mail  for f in cached_files:  with open(f, 'rb') as file:    msg.attach(MIMEImage(file.read()))

Пересылаемые фотографии и документы обязательно надо закешировать прежде чем их можно будет вложить в E-mail. Суть функции одна, поэтому привожу её только для фото:

def cachFile(file_info):    dt = datetime.datetime.now()    timestamp = dt.timestamp()    downloaded_file = bot.download_file(file_info.file_path)    ext = os.path.split(file_info.file_path)[1].split('.')[1]    cached_file_name = str(timestamp) + '.' + ext    src = tempfile.gettempdir() + os.path.sep + cached_file_name    with open(src, 'wb') as new_file:        new_file.write(downloaded_file)    return src  def getPhotoCached(message):    cached_files = []    ff = message.photo[-1]    file_info = bot.get_file(ff.file_id)    asrc = cachFile(file_info)    cached_files.append(asrc)    return cached_files  if _is_photo(message):        #Photo handler        cached_files = getPhotoCached(message)        #Attach into e-mail        for f in cached_files:            with open(f, 'rb') as file:                msg.attach(MIMEImage(file.read()))

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

if len(txt) > 30:txt_subject = textwrap.shorten(txt, width=30, placeholder="...")elif len(txt) == 0:  #Стандартный заголовой для заметок без текста включает "Из Telegram", текущую дату и время  now = datetime.datetime.now()txt_subject = 'Из Telegram ' + str(now)else:txt_subject = txtmsg['Subject'] = f'{txt_subject} #{d.year} #из_telegram'

Процесс отправки e-mail стандартный и описан выше.

Полный код бота найдёте здесь: https://github.com/nsuvorov83/sendevn-bot

Подробнее..

Опенсорс-бот для трекинга SLA в хелпдеске

10.03.2021 12:22:46 | Автор: admin

Лебовски создавался для биллинга (отсюда и название), но быстро прижился везде, где была нужна простая статистика по хелпдескам.

Все началось в декабре 2019-го. Ко мне пришли проджекты и тестировщики из биллинга: Есть канал в Slack, куда мы кидаем обращения по проблемным платежам. Хотим вести по ним статистику: смотреть, какие типы обращений встречаются чаще, понимать, сколько времени заняло решение.

Slack не дает циферок, но многим их хочется. Поэтому есть вариант интегрироваться с Jira, затем строить графики в Redash или Grafana. Тут кажется, что нужна помощь аналитика но для простых случаев это как гвозди микроскопом забивать. Зацепившись за слово статистика, я подумал о таблицах: в них можно считать всякие метрики с помощью формул, а если понадобится что-то сложнее аналитики смогут настроить выгрузку данных.

Итак, мы можем подключить бота к каналу в Slack, сделать простой интерфейс со списками и лить данные в таблицу. Можно в свою базу данных, можно в Google Таблицы. Выбирая решение для прототипа, я остановился на последних: с ними умеют работать все, особенно менеджеры (мой основной заказчик), и у продукта есть готовое API.


Так за 4 часа ожидания пересадки в аэропорту Хельсинки появился MVP бота.

Теперь, когда в канал падало сообщение, под ним появлялся бот с кнопкой Закрыть обращение. Когда разработчик разбирался с задачей, он нажимал Закрыть и мы просили его выбрать категорию обращения. Данные из выпадающего списка попадали в табличку (при необходимости вместе с текстом оригинального сообщения), а также датой и временем, когда оно появилось в канале и когда было закрыто.

Благодаря таблицам мы стали быстро собирать фидбэк от заказчика, и вскоре бот оброс новыми фичами:

  • появились реакции: время попадания запроса в канал не равно старту работ по нему, поэтому саппорт ставил эмодзи, когда на самом деле брал обращение, и этот момент в формате дата-время тоже попадал в таблицу;
  • саппорт мог отметить, сколько времени занял непосредственно фикс проблемы, так у бота появилась вторая кнопка Залогировать время;
  • если задачу требовалось передать в другой отдел, то можно было указать, кому и в какой.

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

Как бот стал популярным и как я упрощал его поддержку


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

Лебовски быстро заметили в других проектах. И пришли с классическим: А напишите нам похожего. Мы уже шаблонизировали других популярных ботов в компании, чтобы не тратить ресурс разработки на типовые задачи, и пошли этим же путем тут.

  • Простая функциональность для раскатки на другие команды: каждый новый Slack-канал подключается простым добавлением пары ID (к какому каналу подключиться и куда отправлять данные) на GitHub. Завести бота для нового заказчика внутри компании буквально дописать 6 строк в один из файликов.
  • Добавление категорий без участия разработки: в табличке у каждого заказчика есть лист, на котором можно дописывать классы обращений, не привлекая нас. А оно передается в бот.
  • Поддержка Slack Workflows. Что любят люди, помимо таблиц? Формы. Поэтому Slack сделал нативное решение, которое их заменяет. Но т.к. формы реализованы на базе бота, а наш бот обучен не учитывать сообщения от других ботов и не отвечать на них (были забавные инциденты), пришлось чуть повозиться с тонкими настройками фильтра не реагируй на других ботов.

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

И решил, что пора его опенсорсить


Теперь вы можете поднять своего Лебовски на своем сервере (или в Heroku) и пользоваться им в своем рабочем Slack. Инструкции о том, как его развернуть, а также сами исходники бота лежат на нашем GitHub здесь.

Сейчас Лебовски работает так:

  • когда пользователь пишет в канал, бот записывает текст сообщения, его автора, дату/время написания в таблицу и присваивает обращению номер, по которому его потом можно найти в таблице. После этого он оставляет под обращением сообщение с кнопками для управления обращением;



  • когда саппорт ставит сообщению определенный эмодзи (какой именно можно задать в конфиге), обращение помечается как В работе и дата/время установки эмодзи сохраняется в таблице (так вы можете отслеживать SLA);
  • саппорт может залогировать время, потраченное на обращение, с помощью кнопки Залогировать работу. Ворклоги сохраняются на отдельном листе в удобном формате;
  • как только саппорт закончил работу над тикетом, он нажимает на Закрыть обращение, после чего Лебовски спрашивает категорию и исполнителя обращения и складывает эти данные в таблицу.

С одной стороны может показаться, что этот бот делает не так уж и много, но в повседневной жизни этого достаточно, чтобы посчитать много полезных метрик, например AFRT (Average First Response Time) и ACRT (Average Case Resolution Time).

Но лучше 1 раз попробовать, чем 100 раз прочитать.

Что еще почитать про боты в Slack: 7 cмертных грехов Slack в большой компании (и как победить их автоматизацией).
Подробнее..

Реинкарнация в чат-бота Microsoft запатентовал технологию создания цифрового клона человека

15.01.2021 22:23:38 | Автор: admin
Источник

Человека смогут формально превратить в чат-бота. Microsoft получила патент на эту технологию. Чат-бот будет создан с учетом имеющейся в базе личных данных человека. Если в ближайшем будущем предоставить чат-ботам достаточно данных, они смогут клонировать/имитировать любого. Если использовать эту технологию не в благих целях, то последствия могут быть непредсказуемыми. Разбираемся, что за патент зарегистрировала Microsoft. И самое интересное: кого он будет клонировать живых или умерших людей?

Патент, который корпорация зарегистрировала в конце прошлого года, называется Создание разговорного чат-бота конкретного человека (Creating a Conversational Chatbot of a Specific Person). С одной стороны, в аннотации к проекту все выглядит безобидно. Например, там сказано, что в некоторых случаях программа будет получать доступ к личным данным человека: фотографиям, записям голоса, сообщениям в социальных сетях, к письмам на электронной почте. Если обобщить эти данные, то может показаться, что цель Microsoft улучшить пользовательский опыт, обучить ИИ для таких инструментов, как Alexa или Siri.

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

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

Как выглядит идеальный клонированный чат-бот


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

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

Что планирует клонировать Microsoft



Из заявки видно, что компания планирует использовать следующие данные:

  • Изображения. Вспомните, как у вас их много в соцсетях, селфи, в полный рост, разные ракурсы. Их даже можно превратить в 3D-модель.
  • Голос. С переходом на аудиосообщения в мессенджерах получить эти данные все проще.
  • Записи в социальных сетях. На что вы реагируете, какими новостями делитесь, кого упоминаете, где находитесь и в каком настроении.
  • Электронные письма. Здесь вообще целый клад всего: присущая вам манера письма, слова-паразиты, которые вы любите применять.
  • Сообщения в мессенджерах. Тут комментарии излишни. Вы уже представили масштаб.


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

Последовательность клонирования



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

Обилие данных позволяет по-разному ими распоряжаться. Помимо достаточно обыденной текстовой версии личности, может появится его голосовая версия, а также 2D- и 3D-модель, что куда изощреннее. Для голосового клона будут применять персонализированный синтезатор голоса.

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

Dadbot: реинкарнация в действии


Фото: Альма Хазер

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

Во время разговоров отец травил анекдоты, давно знакомые Джеймсу, и вспоминал редкие подробности своей биографии. Всего за это время журналист записал 91 970 слов, которые заняли 203 страницы текста с одинарным интервалом 12 кеглем Palatino. Сначала он сброшюровал эти страницы, оставил фолиант на полке. Но задумал воплотить их в нечто большее, чем просто текстовое наследие жизни близкого родственника.

В его голове уже был план действий. Дело в том, что с ИИ Джеймс был знаком с юношества. В 1982 году он увидел первого чат-бота Элизу. Нашел он ее за компьютером в музее науки рядом с домом. Ученый из MIT создал чат-бота в середине 1960-х годов. Элиза потрясла мальчика, но потом он отошел от программирования и ушел в журналистику.

В 2015 году судьба снова свела его с любопытным ИИ. Он готовил материал о новом цифровом воплощении разговорной куклы Hello Barbie. Над аудиовоплощением куклы работали команды из Mattel и компании PullString, которая создала бота Call of Duty и специализируется на разработке ПО. От основателя PullString Джеймс узнал об их новом ПО, способном генерировать чат-ботов.

Джеймс решил создать настоящего Dad-bot бота, имитирующего его отца. Он рассказал о своей идеи отцу еще при его жизни и получил одобрение.

В итоге Джеймсу Влахосу действительно удалось создать чат-бота умершего отца. Вся его семья общается с ним через сообщения и может переходить на голос благодаря голосовому помощнику Alexa. Хотя им и немного странно слушать ответы отца голосом Alexa.

Кто еще работает над вечной жизнью


Выходцы из MIT запустили несколько лет назад стартап Eterni.me, который разрабатывает цифровые аватары умерших людей.

Eterni собирает все, что создано человеком при жизни, все доступные данные. Затем эти сведения обрабатываются сложным алгоритмом ИИ. После генерируется цифровой аватар. Он подражает личности конкретного человека, может общаться с родственниками и друзьями. Разработчики сравнили это с чатом Skype в прошлое.

Подробнее..

Перевод Как в Runescape ловят пользователей ботов, и почему они не поймали меня

19.04.2021 18:14:05 | Автор: admin

Автоматизация игроков всегда была большой проблемой в глобальных многопользовательских онлайновых ролевых играх (MMORPG), таких как World of Warcraft и Runescape, и этот вид взлома игр значительно отличается от традиционных читов, например в стрелялках. Однажды в выходные я решил взглянуть на системы обнаружения, созданные компанией Jagex для предотвращения автоматизации игроков в Runescape и вот что из этого вышло.


Использование ботов

Последние несколько месяцев игрок с учётной записью sch0u играл в World 67 круглосуточно, выполняя обычные задачи, такие как убийство мобов или сбор ресурсов. На первый взгляд игрок с этой учётной записью выглядит так же, как и любой другой игрок, но есть одно ключевое отличие это бот.

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

Поэтому единственный вывод, который мне удалось сделать, заключается в том, что движение мыши имеет значение.

Эвристика!

Я начал с анализа клиента Runescape, чтобы подтвердить эту теорию, и быстро заметил глобально вызываемую переменную hhk, которая задаётся вскоре после запуска.

const auto module_handle = GetModuleHandleA(0);hhk = SetWindowsHookExA(WH_MOUSE_LL, rs::mouse_hook_handler, module_handle, 0);

В результате на мышь устанавливается низкоуровневая hook-точка, добавляя её к общесистемной цепочке hook-точек. Это позволяет приложениям в Windows перехватывать все события мыши, независимо от того, связаны они с вашим приложением или нет. Низкоуровневые hook-точки часто используются клавиатурными шпионами, однако есть и законные случаи использования, такие как эвристика, подобная вышеупомянутой hook-точке мыши.

Обработчик мыши Runescape довольно прост по своей сути (следующий псевдокод красиво переписан вручную):

LRESULT __fastcall rs::mouse_hook_handler(int code, WPARAM wParam, LPARAM lParam){  if ( rs::client::singleton )  {      // Call the internal logging handler      rs::mouse_hook_handler_internal(rs::client::singleton->window_ctx, wParam, lParam);  }  // Pass the information to the next hook on the system  return CallNextHookEx(hhk, code, wParam, lParam);}void __fastcall rs::mouse_hook_handler_internal(rs::window_ctx *window_ctx, __int64 wparam, _DWORD *lparam){  // If the mouse event happens outside of the Runescape window, don't log it.  if (!window_ctx->event_inside_of_window(lparam))  {    return;  }  switch (wparam)  {    case WM_MOUSEMOVE:      rs::heuristics::log_movement(lparam);      break;case WM_LBUTTONDOWN:case WM_LBUTTONDBLCLK:case WM_RBUTTONDOWN:case WM_RBUTTONDBLCLK:case WM_MBUTTONDOWN:case WM_MBUTTONDBLCLK:  rs::heuristics::log_button(lparam);  break;  }}

С учётом пропускной способности эти функции rs::heuristics::log_* используют простые алгоритмы для пропуска данных событий, которые похожи на предыдущие зарегистрированные события.

Эти данные события позже анализируются функцией rs::heuristics::process, которая вызывается каждым фреймом в основном цикле рендеринга.

void __fastcall rs::heuristics::process(rs::heuristic_engine *heuristic_engine){  // Don't process any data if the player is not in a world  auto client = heuristic_engine->client;  if (client->state != STATE_IN_GAME)  {    return;  }  // Make sure the connection object is properly initialised  auto connection = client->network->connection;  if (!connection || connection->server->mode != SERVER_INITIALISED)  {    return;  }  // The following functions parse and pack the event data, and is later sent  // by a different component related to networking that has a queue system for  // packets.  // Process data gathered by internal handlers  rs::heuristics::process_source(&heuristic_engine->event_client_source);  // Process data gathered by the low level mouse hook  rs::heuristics::process_source(&heuristic_engine->event_hook_source);}

Вдали от клавиатуры?

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

Запретив игре вызывать функцию rs::heuristics::process, я сразу ничего не заметил, но ровно через пять минут вышел из игры. По-видимому, Runescape принимает решение о неактивности игрока просто по эвристическим данным, отправленным клиентом на сервер, хотя вы можете просто отлично играть в эту игру. Это породило новый вопрос: если сервер не считает, что я играю, то считает ли он, что я использую бота?

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

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

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

Другие профессии и курсы

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Как чат-боты помогают цирку, вузу и эко-проекту 5 неординарных кейсов на визуальном конструкторе c NLU

19.05.2021 18:19:31 | Автор: admin

Чат-бот МЕГИ и ИКЕА распознает 8 наиболее распространенных фракций отходов и ежедневно обрабатывает порядка 30 сообщений.Бот АкБарс Банка развивает сотрудников и в прошлом году обучил 54% специалистов в компании. Бот Президентской академии в Санкт-Петербурге отвечает на вопросы абитуриентов и в августе 2020 года помог более 1000 поступающим.При этом все кейсы были реализованы на визуальном конструкторе с NLU. Just AI, разработчик технологий в сфере разговорного AI,рассказывает о деталях создания чат-ботов.

Чат-бот МЕГИ и ИКЕА сортирует мусор

Ежегодно в России образуется около 70 млн тонн бытового мусора, это в 10 раз больше веса пирамиды Хеопса. При разложении отходы выделяют опасные химикаты, например, метан, которыми мы же потом и дышим.

МЕГА и ИКЕА реализуют глобальную стратегию по устойчивому развитию ДА людям и планете! и несколько лет назад запустили программу раздельного сбора мусора Правила Деления в Санкт-Петербурге. На территории двух центров МЕГА появились сортировочные пункты, было налажено сотрудничество с перерабатывающими предприятиями. Организаторы движения стали проводить лекции и сделали группу в социальной сети ВКонтакте, на момент публикации в ней состоят более 22 тыс. подписчиков.

Отчасти причина непопулярности экологических инициатив в России в недостаточном эко-образовании населения. Люди не понимают, как, куда и в каком виде можно сдавать отходы. Мы постоянно получали вопросы, принимается та или иная продукция, нужно ли снимать этикетки с бутылок. Нам хотелось сделать так, чтобы любой человек мог мгновенно получить ответы на запросы о маркировке и раздельном сборе отходов, - Александр Страдышев, куратор проекта, МЕГА Парнас.

Количество мусора можно сократить почти на 80%, если органические и пищевые отходы закапывать в почву, а опасные правильно утилизировать.

Организаторы получали так много сообщений ВКонтакте, что решили автоматизировать ответы на типовые запросы. Команда Правил Деления разработала в конструкторе Aimylogiс чат-бота, который теперь помогает администратору группы. Бот представляет собой интерактивный FAQ, где есть ответы на часто задаваемые вопросы: Можно ли это сдать, Где вы находитесь, Время работы станций, Нужно ли снимать этикетку и др.

Чат-бота разрабатывали в несколько этапов. Для начала собрали таблицу со всеми возможными маркировками отходов, их описанием и возможностями приема и переработки. Затем написали сценарии вопросов и ответов, их разработка заняла около недели, и запрограммировали бота. Наконец, доработали формулировки, логотип и удобные для распознавания маркировки.

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

В будущем команда Правил Деления планирует научить чат-бота распознавать маркировки по фото за несколько недель работы пользователи прислали боту 127 фотографий.

Результат

Чат-бот умеет распознавать 8 наиболее распространенных фракций отходов. Ежедневно он обрабатывает порядка 30 сообщений, а в пиковый день помог более чем 500 людям. За все время работы ботом воспользовались 4 430 человек.

Чат-бот Упсала-Цирка знает расписание спектаклей

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

От AI-технологии в Упсала-Цирке в первую очередь хотели получить больше возможностей для общения со зрителями и волонтерами.

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

Персонажем чат-бота стала собака по кличке Пина, которую списали с реальной собаки режиссера.

Цирк в целом про эмоции и удивление. Кто-то в шутку предложил сделать Пину персонажем чат-бота. Я зацепилась за эту мысль, потому что Пина постоянно в цирке, у всех на виду. Мне показалось, что такой персонаж может заинтересовать и завлечь пользователей, Екатерина Черемисина.

Задумка, действительно, удалась. Бегу за мячиком! Но на пару вопросов отвечу! пишет собака Пина в диалоге. Она может скинуть расписание спектаклей, сориентировать в курсах, объяснить, как добраться до цирка и каким транспортом лучше воспользоваться. В чат-боте есть ветки по вопросам сотрудничества, волонтерства, пожертвований. Также Пина предлагает всем заполнить контактную форму.

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

Результат

За два с половиной месяца работы в цирке роботизированная собака Пина помогла 144 уникальным пользователям. У команды Упсала-Цирка есть задумка встроить в чат-бота окошко для вноса пожертвований. Кроме того, сейчас цирк разрабатывает новый сайт и планирует интегрировать чат-бота туда.

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

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 3 960 руб.

Чат-бот АкБарс Банка развивает сотрудников

Технология чат-ботов востребована в HR-сфере, часто ее используются для задач прескрининга кандидатов, онбординга новых сотрудников и опросов. В АкБарс Банке взглянули на возможности технологии шире и разработали 9 ботов, задача которых обучение и развитие персонала.

Мы планировали запустить обучающий, прикладной и массовый продукт в компании, но бюджета на реализацию не было. Также мы понимали, что региональные сотрудники хотят обучаться, но не имеют возможности ездить в командировки, - Марина Вахтина, руководитель Учебного центра Ак Барс Банка.

Чат-боты АкБарс Банка помогают сотрудникам осваивать профессиональные навыки вроде владения Excel и развивать софт-скиллы. Бот Барсик обучает коммуникативным навыкам: он дает задание и варианты ответов, а потом проговаривает правильный вариант и объясняет, почему другие варианты неправильные.

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

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

Результат

За 3 месяца 2019 года с помощью чат-бота прошли обучение 1798 человек 31% сотрудников компании. Командировочные расходы, связанные с выездами на обучение, упали на 36%.

В 2020 году, когда командировки стали невозможны, значение удаленного обучения существенно возросло. Чат-бот обучил 2726 человек 54% сотрудников. По результатам опроса, в 27 удаленных регионах удовлетворенность обучением выросла с 62 до 75%.

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 47 200 руб.

Чат-бот Президентской академии помогает абитуриентам

Прием абитуриентов время предельной нагрузки для любого вуза. Чтобы сделать процесс поступления максимально комфортным, в Петербургском РАНХиГС при Президенте РФ действует проект Виртуальный помощник абитуриента. Суть программы в том, что каждый поступающий оставляет электронную почту и потом регулярно получает на нее полезную информацию.

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

По данным Совета ректоров Санкт-Петербурга и Ленинградской области, 70% из числа поступающих приезжают в наш город из других субъектов России. Чтобы процесс поступления в вуз для них был максимально простым и понятным, мы решили создать консультанта с искусственным интеллектом силу, которая никогда не спит и способна общаться с тысячью пользователями одновременно, говорит директор Северо-Западного института управления Владимир Шамахов.

Стоит сказать, что виртуальный консультант СЗИУ РАНХиГС коренной петербуржец, именно поэтому он готов ответить на вопросы не только о поступлении, но и рассказать абитуриентам о главных достопримечательностях города. Для этого потребуется задать лишь один вопрос: Куда сходить в Петербурге?.

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

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

Результат

Пик вопросов предсказуемо пришелся на время вступительных экзаменов. В августе 2020 года ботом воспользовались более 1000 человек.

Цветочный чат-бот принимает заказы в интернет-магазине

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

Затем для удобства покупателей в БукетОпт подключили Открытые линии Битрикс24. Эта система собирает сообщения с разных площадок Instagram, ВКонтакте, WhatsApp, сохраняет в CRM и ставит в очередь к оператору. Оказалось, что людям удобно задавать вопросы в привычных социальных сетях и мессенджерах число обращений выросло в несколько раз, и ресурса одного оператора перестало хватать. Тогда в компании задумались о виртуальном помощнике.

Люди часто задают однотипные вопросы: оформление заказа, оплата, доставка, ассортимент, и гораздо проще, когда на них отвечает бот. Мы прослушали порядка 300 звонков и выделили 11 групп часто задаваемых вопросов, - Лада Трегубова, маркетолог БукетОпт.

На изучение материалов и инструкций Aimylogic ушла неделя. Основной задачей была верно составить логику вопросов и ответов для чат-бота.

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

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

Результат

Бот обслуживает около 1000 диалогов каждый месяц. Их результативность в компании отслеживают по utm-меткам. 1000 запросов дают 269 переходов на сайт, из посетивших интернет-магазин клиентов 23% добавляют заказ в корзину и 14% оплачивают покупку.

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

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 68 990 руб.

Подробнее..

Всё, о чём должен знать разработчик Телеграм-ботов

24.02.2021 18:11:35 | Автор: admin

Вы вряд ли найдете в интернете что-то про разработку ботов, кроме документаций к библиотекам, историй "как я создал такого-то бота" и туториалов вроде "как создать бота, который будет говорить hello world". При этом многие неочевидные моменты просто нигде не описаны.

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

Подробный гайд о том, как работать с ботами под катом.

Содержание

Начало работы

Telegram API vs Telegram Bot API

Рассказываю по порядку.

Телеграм использует собственный протокол шифрования MTProto. MTProto API (он же Telegram API) это API, через который ваше приложение Телеграм связывается с сервером. Telegram API полностью открыт, так что любой разработчик может написать свой клиент мессенджера.

Для написания ботов был создан Telegram Bot API надстройка над Telegram API. Перевод с официального сайта:

Чтобы использовать Bot API, вам не нужно ничего знать о том, как работает протокол шифрования MTProto наш вспомогательный сервер будет сам обрабатывать все шифрование и связь с Telegram API. Вы соединяетесь с сервером через простой HTTPS-интерфейс, который предоставляет простую версию Telegram API.

Среди упрощений Bot API: работа через вебхуки, упрощенная разметка сообщений и прочее.

Почему-то мало кто знает о том, что боты могут работать напрямую через Telegram API. Более того, таким образом можно даже обойти некоторые ограничения, которые даёт Bot API.

Об авторизации ботов через Telegram API в официальной документации

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

На чём пишут Телеграм-ботов

Бот должен уметь отправлять запросы Телеграм-серверу и получать от него апдейты (updates, обновления).

Как получать апдейты в Bot API

Получать апдейты можно одним из двух способов:

  • Поллинг просто регулярно отправлять запрос к серверу Телеграма для получения обновлений,

  • Вебхук сделать так, чтобы Телеграм сам отправлял запросы по нужному URL.

Конечно, удобнее использовать библиотеки, чем делать http-запросы "руками".

Если вы попробуете загуглить, как написать Телеграм-бота на Python, вам предложат воспользоваться библиотеками python-telegram-bot и telebot. Но не стоит.

Ну, если вы только хотите познакомиться с разработкой ботов и написать своего hello-world-бота, то можете, конечно использовать и их. Но эти библиотеки могут далеко не всё. Среди разработчиков ботов лучшей библиотекой для ботов на Python считается aiogram. Она асинхронная, использует декораторы и содержит удобные инструменты для разработки. Ещё был хороший Rocketgram, но он давно не обновлялся.

Также ботов часто пишут на JavaScript, для этого обычно используется Telegraf. Библиотеки есть и для многих других языков, но используют их реже.

Если же вы хотите использовать Telegram API, то можете воспользоваться Python'овскими Telethon и Pyrogram.

Пример кода бота

Если вы хотите получить какое-то представление о том, как вообще выглядит код бота, вот вам пример использования на aiogram с его странички на GitHub:

import asynciofrom aiogram import Bot, Dispatcher, typesasync def start_handler(event: types.Message):    await event.answer(        f"Hello, {event.from_user.get_mention(as_html=True)} ?!",        parse_mode=types.ParseMode.HTML,    )async def main():    bot = Bot(token=BOT-TOKEN)    try:        disp = Dispatcher(bot=bot)        disp.register_message_handler(start_handler, commands={"start", "restart"})        await disp.start_polling()    finally:        await bot.close()asyncio.run(main())

Этот бот будет отвечать на команды /start и и /restart.

Создание бота

Единственная информация о Телеграм-ботах, которой в интернете полным-полно: как создать бота. Это делается через специального бота BotFather. Когда вы создадите бота, BotFather даст вам его токен. Токен выглядит примерно так: 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw. Именно с помощью токена вы сможете управлять ботом.

Один пользователь может создать до 20 ботов.

В BotFather удобно управлять ботами своими командой /mybots.

Юзернеймы

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

Как поменять юзернейм бота

Если у вас есть бот, и вы хотите дать ему более короткий юзернейм (который может быть занят неработающим ботом), то вы, теоретически, можете это сделать через @BotSupport.

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

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

  1. @old_username,

  2. @new_username,

  3. Что бот делает.

Если вы везунчик 9999 lvl вам ответят.

Юзернейм бота выглядит как обычный юзернейм, но он должен заканчиваться на "bot".
Вы могли видеть ботов с именами @pic, @vid, @sticker, @gamee это официальные боты Телеграма. Им можно нарушать все правила :)

Очень многие юзернеймы уже заняты. Свободных коротких юзернеймов осталось очень мало. И что самое грустное: почти все эти боты мертвы. Просто не отвечают на сообщения. Наверное, это просто разные любопытные люди хотят сделать бота, создают его, а потом забивают. У меня самого есть несколько лежащих ботов. Так что, думаю, лимит в 20 ботов на одного владельца вполне оправдан :)

Оформление бота

Открыв бота, пользователи могут увидеть его профиль.

Оформление бота настраивается в BotFather: меню /mybots Edit Bot. Там можно изменить:

  1. Имя бота.

  2. Описание (Description) это текст, который пользователи будут видеть в начале диалога с ботом под заголовком "Что может делать этот бот?"

  3. Информация (About) это текст, который будет виден в профиле бота.

  4. Аватарка. Аватарки ботов, в отличие от аватарок пользователей и чатов, не могут быть анимированными. Только картинки.

  5. Команды тут имеются ввиду подсказки команд в боте. Подробнее о командах ниже.

  6. Inline Placeholder об инлайн-режиме см. ниже.

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

Сообщения и чаты

Запуск бота пользователем

Когда пользователь впервые открывает бота, он видит кнопку "Запустить" или "Начать" (зависит от платформы пользователя), на английском "Start". Нажимая на эту кнопку, он отправляет команду /start.

Таким образом, первое сообщение от пользователя это всегда /start (либо /start с параметрами, об этом ниже в разделе "Диплинки").

...если пользователь использует официальный клиент

На стороне сервера это не проверяется, поэтому теоретически пользователь может отправить боту любое сообщение через Telegram API.

Сообщения

Понятно, что главная функция бота отправлять и получать сообщения.

И то, и другое можно делать со всеми видами сообщений (фото и видео, файлы, опросы, голосовые сообщения и т. д.).

В Телеграме можно делиться файлами до 2 ГБ, но в Bot API более жесткие лимиты: боты могут скачивать файлы до 20 МБ и отправлять файлы до 50 МБ.

Работа с файлами в Bot API

Если бот уже загрузил файл на сервер Телеграма, то он может использовать file_id, чтобы отправлять этот файл.

Загружать файл на сервер можно в том числе и по URL файла.

Подробнее об отправке файлов в Bot API

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

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

Боты не могут писать другим ботам.

Бота можно добавить в группу (если в BotFather включена соответствующая настройка). По умолчанию он видит не все сообщения (об этом ниже, в разделе "Видимость сообщений в группах").

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

В одной группе может быть до 20 ботов. В публичные группы (группы с юзернеймом) ботов могут добавлять только админы.

Также бота можно добавить в канал, причем только как администратора. Самый частый способ использования ботов в каналах добавление кнопок под постами ("лайки", ссылки и прочее).

Как боты добавляют кнопки

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

Подробнее о кнопках тоже ниже.

Супергруппы

На самом деле многие группы в Телеграме являются супергруппами.

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

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

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

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

id пользователей и чатов

У каждого пользователя, бота, группы, канала в Телеграме есть собственный id. Различать чаты в коде бота следует именно по id, потому что он никогда не меняется.

В токене бота первая часть это его id. Например, токен 110201874:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw принадлежит боту с id 110201874.

В Bot API перед id супергрупп и каналов пишется -100. Так, id 1356415630 превращается в -1001356415630. Осторожно: вы не сможете сохранить это значение в 32-битный тип числа.

id сообщений

Каждое сообщение в Телеграме имеет свой id. Это относится и к системным сообщениям (пользователь зашел в группу, изменилось название группы и т. д.)

Через Telegram API боты могут получать по запросу сообщения в любом чате по их id.

id сообщений в супергруппах и каналах уникальны для чата: первое сообщение в чате имеет номер 1, второе имеет номер 2 и так далее.

id сообщений в личных сообщениях и обычных группах работают по другому. Там, можно сказать, нумерация сквозная: id сообщения уникально для каждого отправившего его пользователя. Так, первое сообщение от пользователя во всех личках и группах имеет номер 1, второе сообщение от того же пользователя имеет номер 2 и так далее.

Видимость сообщений в группах

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

Но если боту нужно видеть все сообщения в группе (например, если это чат-бот или антиспам-бот), для него можно отключить Privacy mode.

Privacy mode настройка в BotFather, которая по умолчанию включена. В таком режиме бот в группах видит только такие сообщения:

  • Сообщения с упоминанием бота,

  • Ответы на сообщение бота, ответы на ответы и так далее,

  • Системные сообщения,

  • Команды о них в следующем пункте.

А если Privacy mode выключен, то бот видит все сообщения в группе.

Если бот админ в группе, то он в любом случае видит все сообщения.

Бот, работающий через Bot API, в любом случае не будет видеть сообщения от других ботов.

Бот видит не все сообщенияБот видит не все сообщенияЯ включил Privacy mode, а он не работает

Нужно удалить бота из группы и добавить заново.

Исправленный баг с видимостью сообщений

Недавно был найден баг: боты не могли видеть некоторые сообщения от юзеров, если сообщения выглядят как команды с юзернеймом пользователя на конце.

Это могло нарушить работу антиспам- и других ботов.

Сейчас баг уже исправлен.

О Privacy mode в документации Bot API

Команды

Часто используемый способ "общения" пользователей с ботом команды. Команды начинаются на "/" и состоят из латинских букв (можно использовать цифры и нижние подчеркивания).

Команды подсвечиваются как ссылки: нажатие отправляет команду в чат.

В группах, чтобы различать команды от разных ботов, Телеграм предлагает ставить в конце команды юзернейм бота. Например: /start@examplebot.

В BotFather можно указать подсказки команд для бота. Он будут отображаться при вводе "/" и команд. Если есть подсказки, рядом с кнопкой "Отправить" появляется кнопка для открытия меню команд.

Если в подсказках команд есть /help, в профиле бота появляется кнопка "Помощь с ботом". Нажатие на кнопку отправляет эту команду.

Если в подсказках команд есть /settings, в профиле бота появляется кнопка "Настройки бота". Нажатие на кнопку отправляет эту команду.

Разметка сообщений

Как вы, наверное, знаете, сообщения в Телеграме могут содержать не только обычный текст, но и жирный, курсив и др. В Bot API разметку сообщений можно делать в HTML и Markdown.

Разметка в Telegram API

В Telegram API для разметки надо вместе с сообщением передавать entities (MessageEntityBold, MessageEntityItalic и так далее). Хорошие библиотеки сами превращают HTML/Markdown в текст и entities.

Способы выделения текста:

  • Жирный текст

  • Курсив

  • Подчёркнутый текст

  • Зачёркнутый текст

  • Моноширинный текст ("в строке" и "блоком")

  • Ссылка (встроенная в текст)

  • Упоминание пользователя текст, похожий на ссылку, клик по которому открывает профиль пользователя. Если упомянуть в группе её участника, он получит уведомление.
    Чтобы вставить в сообщение упоминание пользователя, в Bot API нужно встроить ссылку на tg://user?id=123456789.

О разметке в документации Bot API

Кнопки

Инлайн-кнопки

Бот может оставлять кнопки под своими сообщениями.

Кнопки под сообщениями (они же inline keyboards / inline buttons) в основном бывают трёх видов:

  • URL button кнопка с ссылкой.

  • Callback button. При нажатии на такую кнопку боту придёт апдейт. С созданием кнопки можно указать параметр, который будет указан в этом апдейте (до 64 байтов). Обычно после нажатий на такие кнопки боты изменяют исходное сообщение или показывают notification или alert.

  • Switch to inline button. Кнопка для переключения в инлайн-режим (об инлайн-режиме см. ниже). Кнопка может открывать инлайн в том же чате или открывать меню для выбора чата. Можно указать в кнопке запрос, который появится рядом с никнеймом бота при нажатии на кнопку.

Дополнительные виды кнопок
  • Login URL button специальная кнопка для авторизации пользователей на сайте. Использовалась, например, в официальном боте @discussbot (до добавления нативных комментариев в Телеграм).

  • Callback game button кнопка для открытия HTML-игры. См. пункт "HTML-игры".

  • Pay button кнопка для платежей. См. пункт "Платежи через ботов".

Клавиатурные кнопки

Есть другой тип кнопок: keyboard buttons. Они отображаются вместо клавиатуры как подсказки. При нажатии на такую кнопку пользователь просто отправит этот текст.

При этом в личных чатах с помощью кнопки можно:

  • Запросить номер телефона пользователя,

  • Запросить геолокацию пользователя,

  • Открыть у пользователя меню создания опроса.

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

Чтобы показать клавиатурные кнопки, бот должен отправить сообщение. Можно отправить клавиатуру, которая свернётся (но не пропадёт) после нажатия на кнопку.

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

  • Для пользователей, юзернеймы которых были в тексте сообщения,

  • Если это ответ на другое сообщение: для пользователя, который его отправил.

Ещё о кнопках

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

При отправке сообщения можно выбрать одно (но не больше) из следующих действий:

  • Добавить к сообщению инлайн-кнопки,

  • Показать клавиатурные кнопки,

  • Убрать все клавиатурные кнопки,

  • Force reply: автоматически заставить пользователя ответить на сообщение. Так произойдёт то же самое, что и при нажатии пользователем кнопки "Ответить". Это нужно для того, чтобы бот мог общаться с пользователями в группах, не нарушая Privacy mode.

Таким образом, нельзя показать оба типа кнопок одновременно.

Взаимодействие с ботом

Ссылки на бота

Юзернеймы ботов работают так же, как и любые другие юзернеймы в Телеграме: бота @examplebot можно открыть по ссылке t.me/examplebot.

Также существует прямая ссылка: tg://resolve?domain=examplebot

Подробнее о ссылках tg://

Такие ссылки могут не только заменять ссылки t.me, но и задавать свои действия. Например, tg://settings открывает настройки.

Список известных таких ссылок есть канале @DeepLink.

Ссылка на добавление в группу

По ссылке t.me/examplebot?startgroup=true у пользователя откроется меню: выбор группы для добавления бота.

Прямая ссылка: tg://resolve?domain=examplebot&startgroup=true

Диплинки

По ссылке t.me/examplebot?start=<ваш текст> пользователь может запустить бота с каким-то стартовым параметром (<ваш текст>).

Как это выглядит:

  1. При переходе по ссылке бот открывается как обычно.

  2. Отображается кнопка "Запустить", даже если пользователь уже запускал бота.

  3. Пользователь нажимает на кнопку и видит сообщение /start (всё как обычно).

  4. Боту вместо этого приходит сообщение /start <ваш текст>

Так бот может отреагировать на запуск не как на обычный "/start", а другим способом.

Часто диплинки используются для реферальных программ (в качестве параметра можно передавать id пользователя, который поделился ссылкой). Есть и другие применения.

Прямая ссылка: tg://resolve?domain=examplebot&start=<ваш текст>

О диплинках в документации Bot API

Инлайн-режим

Инлайн-режим (inline mode) это специальный режим работы бота, с помощью которого пользователь может использовать бота во всех чатах.

Выглядит это так: пользователь вводит юзернейм бота в поле для ввода сообщения. После юзернейма можно ещё записать запрос (текст до 256 символов).

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

Инлайн-режим можно включить в BotFather, там же можно выбрать плейсхолдер вместо стандартного "Search..."

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

Страничка об инлайн-режиме на сайте Telegram

Результаты инлайн-режима

Результаты можно отображать двумя способами:

  • Сеткой. Удобно для выдачи картинок.

  • Вертикальным списком. Удобно для выдачи текста.

Можно совмещать два типа, но корректно отображается это только на Telegram Desktop.

Приватность и геопозиция в инлайне

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

Но зато если включить в BotFather настройку "Inline Location Data", то бот сможет видеть геопозицию пользователей, когда они используют инлайн (на мобильных устройствах). Перед этим у пользователей показывается предупреждение.

Inline feedback

Inline feedback это апдейты о выбранных инлайн-результатах. Включаются через BotFather.

Предполагается использование inline feedback для сбора статистики, но не всегда он используется так. Inline feedback позволяет "подгружать" не все результаты сразу, а только выбранный. Например, если бот используется для поиска музыки, то он может загружать не все песни сразу, а только одну.

Важный момент: если вы получили апдейт об отправке инлайн-сообщения, то вы можете его редактировать, только если к нему прикреплены инлайн-кнопки. (Если кнопок нет, то в апдейте не указывается id инлайн-сообщения, по которому происходит редактирование).

Создание наборов стикеров

Боты (и только боты!) могут создавать наборы стикеров. При этом каждый набор стикеров должен принадлежать какому-то пользователю. Посмотреть свои наборы стикеров пользователь может с помощью бота @Stickers.

Платежи через ботов

Телеграм предоставляет ботам возможность принимать платежи от пользователей. Это делается через провайдеров ЮMoney, Сбербанк, Stripe и ещё 7.

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

Платежи, к тому же, не работают на iOS из-за ограничений Apple.

Страница Bot Payments API

HTML-игры в ботах

Боты могут позволять пользователям играть в HTML5-игры в чатах. Бот может отправлять сообщения-игры или создавать их через инлайн-режим. Как это работает, можно посмотреть на примере официального @gamebot.

Страница Bot Gaming Platform

Telegram Login Widget

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

  1. Пользователь должен будет ввести свой номер телефона.

  2. Бот Telegram попросит подтвердить вход.

  3. Пользователь авторизуется и нажимает на "Принять" на сайте.

Telegram Login Widget не связан с Login URL button (см. раздел про кнопки выше), а является его альтернативой.

О Telegram Login Widget на сайте Телеграм

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

Какие апдейты можно получать

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

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

В Telegram API бот может чуточку больше: он может получать сообщения по id, получать список участников группы и прочее.

Получение апдейтов: Bot API vs Telegram API

Если вы получили апдейт в Bot API, то второй раз вы его уже не получите.

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

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

Ограничения Bot API не позволяют сделать то же самое.

Лимиты

Конечно, на запросы к серверу существуют лимиты. В Bots FAQ на сайте Telegram названы следующие:

  • Не больше одного сообщения в секунду в один чат,

  • Не больше 30 сообщений в секунду вообще,

  • Не больше 20 сообщений в минуту в одну группу.

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

Другие известные ограничения в Telegram собраны на limits.tginfo.me см. раздел про ботов.

Рассылка по пользователям

Ниже в Bots FAQ сказано, что Bot API не позволяет рассылать сообщения всем юзерам одновременно и что в будущем, может быть, они что-то для этого сделают. И написано это уже несколько лет.

Они советуют растянуть рассылку на длительное время (8-12 часов) и замечают, что API не позволит отправлять сообщения более чем ~30 пользователям в секунду.

Смена владельца бота

Осенью 2020 года появилась возможность передавать ботов другому человеку. Это можно сделать в настройках бота в BotFather. Для этого на вашем аккаунте должна быть включена двухфакторная авторизация не менее, чем за 7 дней до передачи. Передать бота можно только пользователю, который что-либо ему писал.

Локальный сервер Bot API

Также осенью 2020 года исходники Bot API выложили на GitHub. Теперь вы можете поднять собственный сервер Bot API. На GitHub перечислены следующие преимущества:

  • Скачивание файлов с сервера без ограничения (ограничение на отправку файлов пользователями в Телеграме 2 ГБ),

  • Загрузка файлов на сервер до 2000 МБ,

  • Загрузка файлов на сервер с помощью локального пути и URI файла,

  • Использование HTTP URL для вебхука,

  • Использование любого локального IP-адреса для вебхука,

  • Использование любого порта для вебхука,

  • Возможность увеличить максимальное число соединений до 100000,

  • Получение локального пути файла вместо загрузки файла с сервера.

Юзерботы

В начале статьи я рассказывал о том, что такое Telegram API и Telegram Bot API.

Telegram API используется не только для ботов тогда в чём проблема управлять аккаунтами пользователей, как ботами? Люди это делают. Кто-то автоматически ставит текущее время себе на аватарку, кто-то скриптом реагирует на свои сообщения как на команды, кто-то сохраняет сообщения из публичных групп и каналов. Всё это называют юзерботами.

Юзерботов следует использовать аккуратно: за большую подозрительную активность аккаунт могут ограничить или забанить.

Заключение

Я постарался собрать в одном месте и структурировать информацию о всех возможностях Телеграм-ботов. Большое спасибо vanutp, NToneE и Grinrill за помощь с фактами. Если мы что-то забыли пишите, исправлю.

Я специально не разделял большую статью на несколько постов, чтобы можно было быстро найти нужную информацию. К тому же, в начале статьи есть её содержание. Так что можете сохранить её к себе и использовать как справочник :)

Вообще интерфейс бота (то есть интерфейс чата) имеет много ограничений. Но плохо ли это? Действительно удобнее использовать инструмент, когда это часть привычной среды. Я часто прямо в переписке нахожу нужную картинку или информацию с помощью инлайн-ботов. Как заядлый пользователь Телеграма, я люблю использовать ботов. И создаю ботов. И вы создавайте.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru