Тут мог быть Ваш бот. Свой собственный Jabber-бот

1 отзыв

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

Бот Jabber — в чем суть?

Оказалось, что делать ботов для того же Jabber’а на C# совсем не сложно, учитывая наличие развитого инструментария. Под инструментарием я понимаю библиотеку agsXMPP. Она, судя по косвенным признакам, уже не является основным продуктом немецкой компании AG-Software. Поэтому я библиотеку тут прикопаю на всякий случай.

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

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


GPL — для проектов с открытым исходным кодом. В этом случае библиотека бесплатная

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

создать бота бесплатно

Можно создать приложение для создания бота, как это было в свое время сделано для ICQ, программа называлась MaxXBot. Можно ограничиться консольной программой, а можно — сделать сервис Windows. На самом деле обещают, что библиотека agsXMPP должна работать и на Mono, поэтому велики шансы, что программу можно завести под Linux, но такой цели у меня не было, можете попробовать, если интересно.

Итого, алгоритм таков:

  1. Создаем аккаунт бота на Jabber-сервере, например, bot@my_jabber_domain
  2. Пишем программу бота, ниже есть его простейшая реализация
  3. Запускаем программу на любом компьютере с выходом и Интернет
  4. Заходим в любой другой Jabber-аккаунт, который у нас есть, например, admin@my_jabber_domain, добавляем аккаунт бота bot@my_jabber_domain в наш ростер и тестируем его, отправляя ему команды, заданные в программе. И не заданные 

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

Установка библиотеки agsXMPP

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

установка agsXMPP. Выбор языка

Затем пойдет рутинный процесс установки обычной виндовой программы.

установка agsXMPP. Начало

Укажем папку, в которую мы установим библиотеки:

установка agsXMPP. Выбор папки

Выберем нужный вариант установки — с документацией или без. Я не поскупилась на место и выбрала вариант с документацией.

установка agsXMPP. Выбор варианта установки

Согласимся с наименованием программы или напишем свой вариант:

установка agsXMPP. Название программы

И наконец подтвердим установку с выбранными нами параметрами:

установка agsXMPP. Подтверждение установки

После нажатия на кнопку «Установить» нас ждет недолгая процедура копирования файлов, потом нас поздравят с успешной установкой. Т.е. ничего не обычного нас здесь не ждало.

Создадим бота Jabber в Visual Studio

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

Создаем новый проект в Visual Studio, например, консольную программу. Допустим, мы будем использовать .NET 4.0 или новее. В созданный проект добавляем библиотеку agsXMPP. Начало положено!

Первая часть бота — подключение, реакция на ошибки

Далее наша задача написать простого клиента, подключающегося к Jabber-серверу с использованием имеющегося инструментария.

В процедуру static void Main(string[] args) пишем, например, такие строки (комменты можно убрать ):

Код начнет подсвечиваться как ошибочный, так как нам надо обязательно подключить using’и

Теперь наша задача реализовать методы, которые как параметры передавались в делегаты для событий OnLogin, OnMessage и OnError.

Метод OnLoginEvent может быть весьма простым:

В нем можно посылать на определенный JID сообщение об успешном логине. Тогда код может выглядеть так:

Метод xmpp_OnError можно так реализовать:

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

Самое важное — это реализация метода xmpp_OnMessage. Именно в нем мы будем описывать поведение бота при получении им сообщения от пользователя.

Реализация основного поведения бота

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

Вот так в общем может выглядеть сам метод.

Теперь давайте разберем его построчно.

Здесь мы в консоль cmd выводим JID отправителя и его сообщение.

Вид этого будет следующий:

сообщение бота jabber

Создаем объект JID, который отвечает за идентификатор Jabber’а написавшего боту пользователя:

Свойство msg.Form.Bare — это «обратный» адрес, куда надо отвечать боту.

Создадим некоторый метод с сигнатурой, например, string BuildResponseMessage (string body) { }, из которого будет возвращаться ответ в зависимости от запроса пользователя.

Например, метод BuildResponseMessage может быть таким:

Наконец, командами

мы отправляем сообщение пользователю в ответ на его запрос.

Такова реализация простейшего бота на Jabber.

Ростер у бота. Не самая обязательная часть

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

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

Это можно сделать, подписавшись на событие OnPresence класса XmppClientConnection.

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

Итак, строчкой ниже после кода

пишем

Метод xmpp_OnPresence можно реализовать, например, так:

Никакие другие типы пресенсов, кроме подписки, нас сейчас не интересуют. Если пришел нужный нам пресенс, то мы автоматически подтверждаем запрос на подписку клиента, JID которого узнаем при помощи свойства From класса Presence.

Заключение

Конечно же, для сервера jabber.noservice.ru свой бот существует, его аккаунт bot@jabber.noservice.ru. Чтобы узнать, какие команды он понимает, ему необходимо отправить команду help.


Один ответ “Тут мог быть Ваш бот. Свой собственный Jabber-бот”

  1. Александр

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

    Ответить

Оставьте комментарий

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

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

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...