TelegramBot。 基本功能。 贴纸和图释。 (第3部分)

PM中经常出现的问题之一是如何使用笑容(表情符号)和贴纸。

如何与他们合作,我使用什么工具,等等。

在这一部分中,我们将考虑以下方面:如何创建带有标签的消息,如何处理带有标签的接收消息,如何在消息文本中查找所有表情符号(表情符号),如何使用表情符号创建消息。

谁在乎,请在猫下。

按照传统,我们从文章的来源链接开始:)

本文讨论的所有代码都在Part3-Stick_and_Emoji分支中进行编译。

贴图


电报一出现,我非常喜欢的一件事就是贴纸。 他们很酷,舒适,免费。 我们自然希望在机器人中使用所有这些种类繁多的贴纸。 实际上,此过程非常简单。 要将标签发送给用户,我们只需要知道标签的ID即可。
通常对于贴纸,我会创建自己的助手类,在其中存储有关机器人中使用的贴纸的数据:

Stickers.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?”,让我们写一个助手给我们,该助手将在我们的机器人中向我们提供这些数据。

我们具有在此处创建的基本功能:
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

Source: https://habr.com/ru/post/zh-CN482260/


All Articles