Перейти к содержанию

Как фильтровать входящие сообщения в WhatsApp на Java#

Установка#

Перед началом необходимо установить библиотеку и сконфигурировать бота, подробно этот процесс описан здесь: Как импортировать библиотеку и сконфигурировать своего бота.

Как фильтровать входящие сообщения и обрабатывать тело уведомлений#

Фильтрация по типу вебхука происходит автоматически с помощью переопределения нужных методов, как описано в пункте Как получать другие уведомления, но как фильтровать по типу сообщения?

Так как каждое уведомление автоматически преобразуется до java объекта, вы можете фильтровать сообщения по любому полю самостоятельно. С описанием структуры объектов уведомлений можно ознакомиться по этой ссылке: Документация

Для удобства все java объекты и поля названы аналогично документации:

Java объект Webhook's json объект
TextMessageWebhook TextMessage
TemplateMessageWebhook TemplateMessage
StickerMessageWebhook StickerMessage
ReactionMessageWebhook ReactionMessage
QuotedMessageWebhook QuotedMessage
PollUpdateMessageWebhook PollUpdateMessage
PollMessageWebhook PollMessage
LocationMessageWebhook LocationMessage
ListMessageWebhook ListMessage
GroupInviteMessageWebhook GroupInviteMessage
FileMessageWebhook imageMessage, videoMessage, documentMessage, audioMessage
ExtendedTextMessageWebhook ExtendedTextMessage
ButtonsMessageWebhook ButtonsMessage
ContactMessageWebhook ContactMessage
ContactsArrayMessageWebhook ContactMessage
TemplateButtonsReplyMessageWebhook TemplateButtonsReplyMessage
ButtonsResponseMessageWebhook ButtonsResponseMessage
ListResponseMessageWebhook ListResponseMessage

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

Ссылка на пример: MediaStartScene.java.

public class MediaStartScene extends Scene {
    @Override
    public State processIncomingMessage(MessageWebhook incomingMessage, State currentState) {
        if (incomingMessage instanceof ContactMessageWebhook) {
            answerWithText(incomingMessage, "This is a contact message");

        } else if (incomingMessage instanceof LocationMessageWebhook) {
            answerWithText(incomingMessage, "This is location message");

        } else if (incomingMessage instanceof FileMessageWebhook) {
            answerWithText(incomingMessage, "This is a message with a file");
        }

        return currentState;
    }
}

Вы так же можете фильтровать сообщения по тексту используя методы класса Scene. Методы, которые начинаются с answerWith... перегружены, в них встроены наиболее востребованные фильтры по тексту входящего сообщения. Примеры использования методов данного класса будут описаны ниже. Если же вы хотите задать условие не выполняя методов класса Scene, вы можете воспользоваться методами класса Filter данной библиотеки, которые возвращают boolean значение:

Название фильтра Описание
Filter.isSenderIdExpected(MessageWebhook messageWebhook, String expectedSenderId) Возвращает true, если expectedSenderId равен идентификатору отправителя в messageWebhook
Filter.isMessageTextRegex(MessageWebhook messageWebhook, Pattern regexPattern) Возвращает true, если regexPattern совпадает с текстом в messageWebhook
Filter.isMessageTextExpected(MessageWebhook messageWebhook, String expectedMessage) Возвращает true, если expectedMessage равен тексту в messageWebhook

Пример использования встроенных фильтров#

В этом примере бот отправит сообщение и файл в ответ на команду rates. Отправка сообщения методом answerWithText() запускается только в ответ на команду rates благодаря тому, что третьим параметром в метод answerWithText передана строка "rates". Данный механизм реализован во всех методах класса Scene. Если вы хотите отвечать на все сообщения, без фильтра, просто не указывайте третий параметр. Так-же вы можете вместо строки передать в качестве третьего параметра regex паттерн.

Отправка файла методом answerWithUploadFile() запускается только в ответ на команду rates благодаря тому, что метод находится в блоке if в условии которого выполняется метод Filter.isMessageTextExpected(incomingMessage, "rates").

Ссылка на пример: FiltersStartScene.java.

public class FiltersStartScene extends Scene {
    @Override
    public State processIncomingMessage(MessageWebhook incomingMessage, State currentState) {

        answerWithText(incomingMessage, "You see this because you wrote \"rates\"", "rates"); //фильтрация перегруженным методом

        if (Filter.isMessageTextExpected(incomingMessage, "rates")) {                         //фильтрация методом класса Filter
            answerWithUploadFile(incomingMessage, new File("src/main/resources/data/rates.png"));
        }

        return currentState;
    }
}

Полный перечень методов сцены:#

Методы класса Scene Описание
activateNextScene(State currentState, Scene nextScene) Активирует следующую сцену nextScene для текущего чата.
activateStartScene(State currentState) Активирует стартовую сцену для текущего пользователя.
getText(MessageWebhook messageWebhook) Возвращает текст сообщения, если оно текстовое, если нет возвращает null
answerWithText(MessageWebhook messageWebhook, String text) Отвечает текстом на входящее сообщение.
answerWithUploadFile(MessageWebhook messageWebhook, String caption, File file) Загружает и отправляет файл в ответ на входящее сообщение. Сaption - не обязательное поле.
answerWithUrlFile(MessageWebhook messageWebhook, String caption, String url, String fileName) Отправляет файл из url в ответ на входящее сообщение. Сaption - не обязательное поле.
answerWithLocation(MessageWebhook messageWebhook, String nameLocation, String address, Double latitude, Double longitude) Отправляет геолокация в ответ на входящее сообщение.
answerWithPoll(MessageWebhook messageWebhook, String message, List<Option> options, Boolean multipleAnswers) Отправляет опрос в ответ на входящее сообщение.
answerWithContact(MessageWebhook messageWebhook, Contact contact) Отправляет контакт в ответ на входящее сообщение.

В перегруженном варианте методы ответов на сообщения могут содержать дополнительные параметры expectedMessage и regexPattern, если текст входящего сообщения совпадает с условием, метод выполнится и вернет ответ метода согласно документации, если нет, то метод вернет null.

Список примеров#

Описание Ссылка на пример
Как инициализировать объект BotStarterClassExample.java
Сцена "Привет" BaseStartScene.java
Сцена "Эхо" EchoStartScene.java
Как получать другие типы уведомлений EventStartScene.java
Как фильтровать входящие сообщения FiltersStartScene.java
Как обрабатывать тело уведомлений MediaStartScene.java
Как работать с состоянием бота state
Пример готового чат бота full