PM中经常出现的问题之一是如何使用笑容(表情符号)和贴纸。
如何与他们合作,我使用什么工具,等等。
在这一部分中,我们将考虑以下方面:如何创建带有标签的消息,如何处理带有标签的接收消息,如何在消息文本中查找所有表情符号(表情符号),如何使用表情符号创建消息。
谁在乎,请在猫下。
按照传统,我们从文章的来源链接开始:)
本文讨论的所有代码都在
Part3-Stick_and_Emoji分支中进行编译。
贴图
电报一出现,我非常喜欢的一件事就是贴纸。 他们很酷,舒适,免费。 我们自然希望在机器人中使用所有这些种类繁多的贴纸。 实际上,此过程非常简单。 要将标签发送给用户,我们只需要知道标签的ID即可。
通常对于贴纸,我会创建自己的助手类,在其中存储有关机器人中使用的贴纸的数据:
Stickers.javaimport 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?”,让我们写一个助手给我们,该助手将在我们的机器人中向我们提供这些数据。
我们具有在此处创建的基本功能:
TelegramBot。 基本功能。 (第二部分)为了使我们的机器人开始以某种方式处理可接受的标签,我们需要:
- 确定他们给我们寄了一张贴纸
- 指出哪个处理程序负责处理带有贴纸的消息
- 运行一个处理程序,该处理程序将生成一条响应消息给用户
任务 :机器人在聊天中收到贴纸时,应发送带有贴纸ID的文本消息作为响应。
我们将
STICKER命令添加到命令列表中
在发送的更新的分析器中,我们将尝试确定是否有文本消息或其中是否包含标签:
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中,我们需要指定如何处理收到的
STICKER命令:
SystemHandler.java第31行 case STICKER: return "StickerID: " + parsedCommand.getText();
结果,当向我们的机器人发送任何标签时,我们将收到其ID作为响应:

表情符号或表情符号
它们是标准化的,几乎所有设备和操作系统都可以理解并能够显示它们。 使用它们装饰消息非常方便。 它们简洁地显示在消息下方的按钮上。 喜不喜欢-一些优点。
例如,在
事件调度程序中
使用按钮上和消息文本中的相同图标,可以使用户直观地理解您的界面,使消息和按钮上的多余文本变得混乱。
要在消息或按钮上显示表情符号,您需要知道其Unicode。 Internet上有很多资源,您可以在其中找到所有列出的表情符号,并在其中指示其标签,代码。
对于我自己,我选择了这种使用表情符号的方式:在电报本身中观看和选择表情符号更加方便。
好吧,当然,通过贴标的类比,让我们为自己写一个小帮手,他们将向我们展示必要的代码,甚至可以确保我们正确地处理它们。
首先,将以下依赖项添加到
pom.xml :
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>3.3.0</version> </dependency>
老实说,我不记得我遇到了什么地方,但是从那以后,我只在需要对机器人中的表情符号进行处理时才使用它。
该库包含许多不同的工具:

好奇和好奇将在哪里转身:)
使用漫游器发送表情符号需要什么? 您需要在Unicode消息的文本中嵌入所需的表情符号。
是的,您可以找到提供带有表情符号的Unicode列表,显示表情符号在不同智能手机上外观的不同摘要表的资源。
我想向您展示一种最有效的微笑方式。
首先,让我们看看如何在电报本身中使用微笑。 您可以打开一个对话框,其中列出了所有表情并将其添加到消息中,只需单击它们的图标即可。 表情符号也可以使用标签添加到邮件中。
标签应该用冒号括起来,并包含某种独特的文本,指示所需的笑脸。
如果您在输入消息的字段中开始输入以冒号开头的消息,则电报本身将开始显示哪些表情符号包含输入的标签文本:

当您输入正确的表情符号标签并放入另一个冒号时,文本将变成笑脸。 如果在图释上按住鼠标左键,也会显示标签。

现在,图书馆为我们提供了帮助,我们在上面添加了对图书馆的依赖。 她知道如何使用表情符号标签。 这主要是为您提供方便,因为标签更具可读性,它们带有某种含义。
我们知道了标签之后,便可以得到Unicode表情符号,如下所示:
String emoji_kissing = EmojiParser.parseToUnicode(":kissing:");
您可以将自己设置为一个单独的类,在其中可以保留在bot中使用的表情符号。 以同一个
活动策划者为例,他的武器库中充满了这些微笑:
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")
这是此按钮的代码:

我注意到这个图书馆的一个细微差别。 库无法识别电报中的所有表情符号。 因此,请注意该库的新版本。
好吧,为了确切地确定我们可以显示哪些微笑,而不能显示哪些微笑,我们会将这项任务委托给我们的助手。
任务:如果发送的消息不包含任何特定命令,但在文本中包含微笑,请在屏幕上以向用户发送消息的形式显示这些微笑,并指示其属性(标签和描述)。
将命令
TEXT_CONTAIN_EMOJI添加到命令列表中
Command.java第8行 public enum Command { ... TEXT_CONTAIN_EMOJI, ... }
在确定消息中包含哪种命令的解析器中,添加以下文本:
Parser.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(); } }
此代码仅从消息文本中选择图释,形成具有唯一图释的集合,从其属性中选择标签和说明,并由此生成文本消息。
工作的结果如下所示:

在方括号中,我们获得了可用于插入图释的标签。 您会看到有时一个标签中有多个标签。
而且,在此助手的帮助下,我们可以准确地了解我们的库可以理解哪些表情符号,而忽略哪些表情符号。
例如,您可以在这里看到:

使用以下代码微笑
: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;
程序愉快,不要犹豫,提出问题:)
聚苯乙烯
您可以在这里感觉到具有此功能的机器人:
https :
//t.me/test_habr_bot 。