Как стать автором
Обновить

Бот для Jabber'a своими руками

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

Идея написания бота возникла просто из баловства и интереса к джабберу. Поигрался с ним пару дней и понял, что есть достаточно большой простор для практического применения:
  • Для корпоративного багтракера. О каком-либо изменении или добавлении новой задачи пользователь автоматически уведомляется через jabber
  • Автоматизация работы с этим же багтракером
  • Мониторинг состояния чего-либо (сервер, приложение ...)


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

Ну а теперь об реализации. В интернете полно библиотек реализующих протокол XMPP. Стоит только посмотреть Википедию. Мне нужна была библиотека для Java. Я выбрал Smack. Достаточно удобна в использовании и полносью реализует протокол XMPP/Jabber. Кстати, это библиотека от разработчиков IM Spark.

А вот код. Он достаточно прост, но я посторался написать к нему некоторые пояснения:
public class JabberBot {

  protected String login;
  protected String pass;
  protected String server;
  protected ConnectionConfiguration config;
  protected XMPPConnection connection;

  public JabberBot() {
    login = "login"// без @server
    pass = "pass";
    server = "server"; // например jabber.ru
    config = new ConnectionConfiguration(server);
  }

  public void connect() {
    connection = new XMPPConnection(config);
    try {
      connection.connect();
      System.out.println("Подключились к серверу " + server + "...");
      connection.login(login, pass);
      System.out.println("Авторизация одобрена...");
      // Устанавливаем прослушку входящих сообщений
      createChatListener();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public void disconnect() {
    if (connection.isConnected())
      connection.disconnect();
    System.out.println("Отключились от сервера " + server + "...");
  }

  public void createChatListener() {
    if (!connection.isConnected()) connect();

    PacketFilter pf = new PacketFilter() {
      public boolean accept(Packet packet) {
        if (packet instanceof Message) {
          Message message = (Message) packet;
          // Нам нужны только те сообщения(пакеты), которые адресованы нам. Не так ли?
          if (message.getTo().contains(login))
            return true;
        }
        return false;
      }
    };

    PacketListener pl = new PacketListener() {
      public void processPacket(Packet packet) {
        // Если сообщение прошло фильтр, то мы его получим тут.
        Message message = (Message) packet;
        // И разбираем таким образом, каким захотим
        parseMessage(message);
      }
    };

    connection.addPacketListener(pl, pf);
  }

  public void parseMessage(Message message) {
    String mesText = message.getBody();
    String mesFrom = message.getFrom();
    // В зависимости от полученного сообщения, можем делать разные вещи
    System.out.println(mesFrom+": "+mesText);
  }

  // отправляем адресату необходимый текст
  // адресат указывает в полном виде имя@сервер
  public void sendMessage(String sendTo, String text) {
    try {
      Chat chat = connection.getChatManager().createChat(sendTo, null);
      chat.sendMessage(text);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}


* This source code was highlighted with Source Code Highlighter.

В данном примере выполняется подключение к серверу и вывод полученных сообщений в консоль. Цель примера — показать, насколько легко можно работать с протоколом. Практическое применение ограничивается только фантазией…
_________
Текст подготовлен в
ХабраРедакторе
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.