Как фильтровать входящие сообщения в 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 |