Телеграмбот. Базовый Функционал. Наклейки И Смайлики. (Часть 3)

Один из вопросов, который часто приходит в личку, — как работать со смайлами (эмодзи) и стикерами.

Как с ними работать, какие инструменты использую и т.д. В этой части будут рассмотрены следующие темы: как создать сообщение со стикером, как обработать полученное сообщение со стикером, как найти все смайлы (эмодзи) в тексте сообщения, как создать сообщение с помощью смайлов.

(эмодзи).

Кому интересно, смотрите кат. Как обычно, начнем статью со ссылки на исходный код :) Весь код, обсуждаемый в статье, собран в потоке.

Часть 3-Stick_and_Emoji .



Наклейки

Одна из вещей, которые мне так понравились в Telegram, как только он вышел, — это стикеры.

Они классные, удобные, бесплатные.

И естественно, все это огромное разнообразие стикеров мы хотим использовать в боте.

На самом деле эта процедура очень проста.

Чтобы отправить стикер пользователю, нам нужно знать только идентификатор стикера и ничего больше.

Обычно для стикеров я создаю вот такой вспомогательный класс, в котором храню данные о стикерах, используемых в боте: Стикеры.

java

  
  
  
  
  
  
  
  
  
  
  
   

import org.telegram.telegrambots.api.methods.send.SendSticker; public enum Stickers { FUNNY_JIM_CARREY("CAADBQADiQMAAukKyAPZH7wCI2BwFxYE"), ; String stickerId; Stickers(String stickerId) { this.stickerId = stickerId; } public SendSticker getSendSticker(String chatId) { if ("".

equals(chatId)) throw new IllegalArgumentException("ChatId cant be null"); SendSticker sendSticker = getSendSticker(); sendSticker.setChatId(chatId); return sendSticker; } public SendSticker getSendSticker() { SendSticker sendSticker = new SendSticker(); sendSticker.setSticker(stickerId); return sendSticker; } }

Здесь все просто.

Мы даем наклейке имя, которое имеет для нас смысл.

И с помощью пары методов получаем готовый объект для отправки пользователю.

Для того, чтобы ответить на вопрос: «Где взять ID стикераЭ», напишем помощника, который будет сообщать нам эти данные в нашем боте.

У нас есть базовый функционал, который мы создали здесь: ТелеграмБот. Базовый функционал.

(Часть 2) Чтобы наш бот начал как-то обрабатывать принятые стикеры, нам нужно:

  • Определить, что нам прислали наклейку
  • Укажите какой обработчик отвечает за обработку сообщений со стикерами
  • Запустить обработчик, который будет генерировать сообщение в ответ пользователю
Задача : при получении стикера в чате бот должен ответить текстовым сообщением с идентификатором стикера.

Мы добавили команду в список команд НАКЛЕЙКА В анализаторе отправленных обновлений мы попробуем определить, является ли наше сообщение текстовым сообщением или оно содержит стикер: MessageReciever.java строка 57

if (message.hasText()) { parsedCommand = parser.getParsedCommand(message.getText()); } else { Sticker sticker = message.getSticker(); if (sticker != null) { parsedCommand = new ParsedCommand(Command.STICKER, sticker.getFileId()); } }

нам не нужно делать сложную обработку отправленного сообщения, то мы доверим обработку сообщений, содержащих наклейку, существующему обработчику, отвечающему за обработку так называемых «системных сообщений»: MessageReciever.java строка 86

case START: case HELP: case ID: case STICKER: SystemHandler systemHandler = new SystemHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + systemHandler); return systemHandler;

Соответственно, в Системный обработчик нам нужно указать, как обрабатывать входящую команду НАКЛЕЙКА : SystemHandler.java, строка 31

case STICKER: return "StickerID: " + parsedCommand.getText();

В результате, когда вы отправите нашему боту любой стикер, мы в ответ получим его ID:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)



Смайлики или эмодзи

Они стандартизированы, их понимают и могут отображать практически все устройства и операционные системы.

Их очень удобно использовать для оформления сообщений.

Лаконично выглядят кнопки под сообщениями.

Как ни крути, одни плюсы.

Например, в бот-планировщик событий

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

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

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

Для себя я выбрал такой способ работы с эмодзи: смайлы удобнее смотреть и выбирать в самом телеграмме.

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

Прежде всего, добавим к pom.xml Вот зависимость:

<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.3.0</version> </dependency>

Честно говоря, не помню, где я это наткнулся, но с тех пор использую только в том случае, если мне нужно что-то сделать со смайлами в боте.

Библиотека содержит множество различных инструментов:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

Любознательным и любознательным будет что посмотреть :) Что нужно для отправки смайла с помощью бота? Вам необходимо встроить нужный смайлик в текст сообщения в Юникоде.

Да, вы можете найти ресурсы, которые предоставляют списки Юникода со смайлами, показывающие разные сводные таблицы того, как смайлы выглядят на разных смартфонах.

Хочу показать вам метод, который оказался для меня наиболее удобным для работы со смайлами.

Для начала давайте рассмотрим, как можно использовать смайлы в самом телеграмме.

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

Вы также можете добавить смайлы в сообщение с помощью тегов.

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

Если вы начнете вводить в поле ввода сообщения сообщение, начинающееся с двоеточия, Telegram сам начнет показывать, какие эмодзи содержат введенный текст тега:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

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

Теги также отображаются, если зажать левую кнопку мыши на смайле.



ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

И теперь нам на помощь приходит библиотека, зависимость от которой мы добавили выше.

Она умеет работать с тегами эмодзи.

Это удобно, в первую очередь, вам, так как теги более читабельны и несут в себе определенный смысл.

А мы, зная тег, можем получить Юникод смайла вот так:

String emoji_kissing = EmojiParser.parseToUnicode(":kissing:");

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

Используя тот же пример планировщик мероприятий , в его арсенале имеются следующие смайлы:

import com.vdurmont.emoji.EmojiParser; public enum Icon { PLUS(":heavy_plus_sign:"), MINUS(":heavy_minus_sign:"), CHECK(":white_check_mark:"), NOT(":x:"), DOUBT(":zzz:"), FLAG(":checkered_flag:") private String value; public String get() { return EmojiParser.parseToUnicode(value); } Icon(String value) { this.value = value; } }

А вот как будет выглядеть в коде использование этого класса и конкретного смайлика:

row.add(new InlineKeyboardButton() .

setText(Icon.CHECK.get() + " I'm going")

Вот код этой кнопки:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

Я заметил один нюанс этой библиотеки.

Библиотека умеет распознавать не все смайлы, которые есть в телеграмме.

Поэтому следите за тем, как выходят новые версии библиотеки.

Ну а чтобы быть уверенными, какие смайлы нам можно показывать, а какие нет, доверим эту задачу нашему помощнику.

Задача: если отправленное сообщение не содержит какой-либо конкретной команды, но содержит в тексте смайлы, отобразить эти смайлы на экране пользователя в виде сообщения и указать их атрибуты (тег и описание).

Добавьте команду в список команд TEXT_CONTAIN_EMOJI Command.java строка 8

public enum Command { .

TEXT_CONTAIN_EMOJI, .

}

В парсер, определяющий, какая команда содержится в нашем сообщении, добавим следующий текст: Парсер.

java, строка 38

if (result.getCommand() == Command.NONE) { List<String> emojiContainsInText = EmojiParser.extractEmojis(result.getText()); if (emojiContainsInText.size() > 0) result.setCommand(Command.TEXT_CONTAIN_EMOJI); }

Если мы определим, что сообщение не содержит какой-либо конкретной команды, но в нем есть смайлы, мы возвращаем, что разобрали команду TEXT_CONTAIN_EMOJI. Давайте создадим отдельный обработчик, который будет обрабатывать только эту команду: EmojiHandler.java

import com.example.telegrambot.bot.Bot; import com.example.telegrambot.command.ParsedCommand; import com.vdurmont.emoji.Emoji; import com.vdurmont.emoji.EmojiManager; import com.vdurmont.emoji.EmojiParser; import org.apache.log4j.Logger; import org.telegram.telegrambots.api.objects.Update; import java.util.HashSet; import java.util.Set; public class EmojiHandler extends AbstractHandler { private static final Logger log = Logger.getLogger(EmojiHandler.class); public EmojiHandler(Bot bot) { super(bot); } @Override public String operate(String chatId, ParsedCommand parsedCommand, Update update) { String text = parsedCommand.getText(); StringBuilder result = new StringBuilder(); Set<String> emojisInTextUnique = new HashSet<>(EmojiParser.extractEmojis(text)); if (emojisInTextUnique.size() > 0) result.append("Parsed emojies from message:").

append("\n"); for (String emojiUnicode : emojisInTextUnique) { Emoji byUnicode = EmojiManager.getByUnicode(emojiUnicode); log.debug(byUnicode.toString()); String emoji = byUnicode.getUnicode() + " " + byUnicode.getAliases() + " " + byUnicode.getDescription(); result.append(emoji).

append("\n"); } return result.toString(); } }

Этот код извлекает из текста сообщения только смайлы, формирует из них набор уникальных, выбирает из их свойств теги и описания и формирует из этого текстовое сообщение.

Результат работы выглядит следующим образом:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

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

Вы можете видеть, что один смайлик иногда имеет более одного тега.

А также с помощью этого помощника мы можем понять, какие именно смайлы понимает наша библиотека, а какие игнорирует. Как, например, вы можете увидеть здесь:

ТелеграмБот. Базовый функционал.
</p><p>
 Наклейки и смайлики.
</p><p>
 (Часть 3)

Смайлик с кодом :face_with_monocle: По какой-то причине он не определяется этой библиотекой.

Итак, у нас есть обработчик.

Как мы дадим ему задание? мы уже знаем, что текстовое сообщение со смайлами внутри распознаётся как команда TEXT_CONTAIN_EMOJI — в MessageReciever нам нужно указать, что за обработку этой команды отвечает отдельный EmojiHandler. MessageReciever.java строка 94

case TEXT_CONTAIN_EMOJI: EmojiHandler emojiHandler = new EmojiHandler(bot); log.info("Handler for command[" + command.toString() + "] is: " + emojiHandler); return emojiHandler;

Наслаждайтесь программированием и не стесняйтесь задавать вопросы :) P.S. Опробовать бота с такой функциональностью можно здесь: https://t.me/test_habr_bot .

Теги: #git #api #java #maven #emoji #multithreading #telegramapi #sticker

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.