Почему сложно использовать Jabber для спама уже обсуждалось, но так же можно организовать отправку автоматических сообщений и с благими намерениями.
Идея написания бота возникла просто из баловства и интереса к джабберу. Поигрался с ним пару дней и понял, что есть достаточно большой простор для практического применения:
Первая мысль сразу была взята в оборот и быстренько реализована. Так же еще одной функцией было напоминание о просроченных, невыполненных задачах. Самое главное, что появился результат. Реагирование на новые задачи стало гораздо быстрее, нежели в случае уведомления почтой.
Ну а теперь об реализации. В интернете полно библиотек реализующих протокол XMPP. Стоит только посмотреть Википедию. Мне нужна была библиотека для Java. Я выбрал Smack. Достаточно удобна в использовании и полносью реализует протокол XMPP/Jabber. Кстати, это библиотека от разработчиков IM Spark.
А вот код. Он достаточно прост, но я посторался написать к нему некоторые пояснения:
Идея написания бота возникла просто из баловства и интереса к джабберу. Поигрался с ним пару дней и понял, что есть достаточно большой простор для практического применения:
- Для корпоративного багтракера. О каком-либо изменении или добавлении новой задачи пользователь автоматически уведомляется через 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.
В данном примере выполняется подключение к серверу и вывод полученных сообщений в консоль. Цель примера — показать, насколько легко можно работать с протоколом. Практическое применение ограничивается только фантазией…
_________
Текст подготовлен в ХабраРедакторе