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