Как отправить смайл через telegram bot
Перейти к содержимому

Как отправить смайл через telegram bot

  • автор:

TelegramBot. Базовый функционал. Стикеры и смайлы. (Часть 3)

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

Как с ними работать, какими инструментами пользуюсь я и т.д.

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

Кому интересно, прошу под кат.

По-традиции, начинаем статью со ссылки на исходники по ней 🙂

Весь обсуждаемый в статье код собран в ветке Part3-Stick_and_Emoji.

Стикеры

Одна из вещей, что мне так понравилась в телеграмме, как только он появился — были стикеры. Они классные, удобные, бесплатные. И все это огромное разнообразие стикеров нам, естественно, хочется использовать и в боте. На деле эта процедура очень простая. Чтобы отправить стикер пользователю, нам нужно знать только лишь id стикера и больше ничего.
Обычно для стикеров я создаю себе вот такой класс-помощник, где храню данные о используемых в боте стикерах:

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

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

У нас есть базовый функционал, который мы создавали тут:
TelegramBot. Базовый функционал. (Часть 2)
Чтобы наш бот начал как-то обрабатывать принятые стикеры, нам нужно:

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

В список команд мы добавили команду STICKER

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

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

Соответственно в SystemHandler нам нужно указать, как обрабатывать поступившую команду STICKER:
SystemHandler.java строка 31

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

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

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

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

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

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

В первую очередь добавим в pom.xml вот такую зависимость:

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

В библиотеке собрано много разных инструментов:

Любознательным и пытливым будет где развернуться 🙂

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

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

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

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

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

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

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

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

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

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

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

Это код вот этой кнопки:

Я заметил один нюанс этой библиотеки. Не все смайлы, что есть в телеграмме, библиотека умеет распознавать. Поэтому следите за тем, как выходят новые версии библиотеки.

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

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

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

В парсере, который определяет, что за команда содержится в нашем сообщении добавим вот такой текст:

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

Создадим отдельный хендлер, который будет обрабатывать только эту команду:
EmojiHandler.java

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

Результат работы выглядит вот так:

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

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

Как, например, видно тут:

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

Итак, обработчик у нас есть. Как мы передадим ему задание?

Т.к. мы уже знаем, что текстовое сообщение со смайликами внутри детектируется как команда TEXT_CONTAIN_EMOJI — в MessageReciever нам нужно указать, что за обработку этой команды ответственен отдельный хендлер EmojiHandler.

Программируйте в удовольствие и не стейсняйтесь задавать вопросы 🙂

Как Telegram боты отправляют стикеры ⁠ ⁠

Через Telegram бот довольно легко отправлять стикеры пользователям.

В мессенджере есть понятная документация как это сделать. Если бот написан кодом, то используется метод SendSticker 👉 https://core.telegram.org/bots/api#sendsticker

Если бот сделан на конструкторе Botmother, то можно отправлять стикеры с помощью компонента «Запрос», выбрать метод Post, в URL вставить ссылку: https://api.telegram.org/bot<Токен бот>/sendSticker

В тело запроса вставить короткий код:

file_id — идентификатор стикера

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

Потестировать отправление ботом стикера можно тут @botmothercom_bot/?start=sticker.
Если нужно получить id стикеров, чтобы использовать в своем боте, то этому же боту можно отправлять стикеры и получать в ответ идентификаторы.

887 постов 3.4K подписчиков

Правила сообщества

Уважать мнение других

Не переходить на личности, даже при споре, «Что лучше Intel или AMD».

Матерится, выражая эмоции можно, но опять же, не в адрес оппонента или собеседника.

Отдельно для «свидетелей LINUX»: Вам здесь рады, но и к Вам пожелание быть проще и понятней.

Не вводить в заблуждение заведомо неверными и вредными советами, даже в шутку. Если же пошутить хочется, помечайте это в комментарии, добавив слово «шутка», или другим понятным словом, что бы в дальнейшем данный комментарий не воспринимался серьезно.

В публикуемом посте настоятельно рекомендуется указывать конфигурацию ПК (ноутбука) и операционную систему. А также марки и модели комплектующих.

Указывайте теги «Компьютер» «Ноутбук» «Программное обеспечение» «сборка компьютера» «Операционная система» «Драйвер» «Комплектующие».

Надо же, как интересно. А какую базу данных посоветуете использовать?

Недельный геймдев: #84 — 28 августа, 2022⁠ ⁠

Из новостей: недельный геймдев в виде рассылки, в Godot 4.0 уберут визуальный скриптинг (останется только в 3.x), Масахиро Сакураи, известный по Kirby и Super Smash Bros, запустил канал на YouTube.

Из интересностей: советы и практики планирования, почему ИИ в F.E.A.R. по-прежнему остается лучшим в шутерах от первого лица, список кастомных игровых движков, использование TikTok’а, чтобы получить 120 миллионов просмотров и 60 тысяч добавлений в список желаемого Steam, симуляция тропической погоды в Far Cry 6.

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Недельный геймдев в виде рассылки

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Меня уже не раз просили дайджест в виде рассылки сделать. Совсем нет времени этим заниматься, а у Твиттера, как оказалось, встроенные новостные рассылки есть. Решил попробовать. Подписывайтесь, раз в неделю буду дайджест рассылать 😎

В Godot 4.0 уберут визуальный скриптинг (останется только в 3.x)

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Если найдутся волонтёры, то можно перенести всё в расширение с помощью GodotCPP.

Масахиро Сакураи, известный по Kirby и Super Smash Bros, запустил канал на YouTube

Планирует рассказывает про создание игр и то, что делает игры фановыми.

SFX and Music for Your Games Bundle

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Новый Humble Bundle, представляющий собой коллекцию звуковых эффектов и музыкальных треков от различных разработчиков на GameDev Marketplace.

Антикранч: советы и практики

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

Основные моменты выписал.

— Эстимейты — это не комитмент.

— Жёстко заданные тайминги выполнения задач не работают. Всё быстро сдвигается, приходится постоянно модифицировать план + стресс у команды, т.к. ощущение, что постоянно не успевают.

— Bell Curve очень хорошо иллюстрирует то, чего ожидать. Если эстимейт был на 3 дня, то выполнить за 5 дней ок. А вот на 10 день уже стоит переосмыслить задачу — вероятно она оказалось слишком сложной. Возможно стоит её вообще отменить или в беклог положить.

Cone of uncertainty.

— Не нужно засорять беклог мелкими вещами, особенно если доберётесь до них через много месяцев. Достаточно сгруппировать это и/или оформить в виде эпика. А возможно и вовсе выкинуть.

— Не правьте числа/эстимейты после выполнения задачи.

— Если команда делает 10 сторипоинтов за недельный спринт, а осталось 100, это не значит, что вы выполните их за 10 недель, т.к. не учитываете задачи, которые появляются по ходу дела.

По поводу методики разработки:

— Перфомят не команды, состоящие чисто из профи, а из людей, которые дополняют сильные и слабые стороны друг друга.

— Если вы добавляете людей в проект, то команда замедлится (порой на месяц-два, пока онбординг идёт и всё такое). Я рекомендую всем почитать у Брукса «Мифический человеко-месяц».

— Bus factor (да-да). Не должно быть такого, что критические вещи зависят только от одного человека. В таком случае у вас просто будет группа индивидуалов, а не команда.

Парное программирование, код ревью и шаринг знаний внутри команды.

— QA должны быть включены в пайплайн, в дизайн ревью, в обсуждения.

— TDD хорошая практика.

— Continuous integration — это не просто использование Дженкинса или Тимсити, они лишь технологии/средства. На почитать: trunk based development, feature toggle.

— Не нужно запарываться над идеальным решением.

— Качество vs скорость. Не нужно пытаться продумать всё заранее.

— Нужно давать командам побольше свободы и меньше бюрократии (кэп).

Почему ИИ в F.E.A.R. по-прежнему остается лучшим в шутерах от первого лица

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

В F.E.A.R. — игре 12-летней давности с искусственным интеллектом, которому могут позавидовать многие современные шутеры, большое внимание удаляется деталям. Армия солдат-клонов выглядит умнее любых врагов, с которыми автор сталкивался в FPS впоследствии, и остаётся такой и по сей день.

Список кастомных игровых движков

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Впервые наткнулся на этот пост со списком существующих кастомных игровых движков, хотя ему уже и больше двух лет. Как следствие, не все движки там есть и где-то уже на самая актуальная информация.

Но всё равно довольно познавательная инфа.

Блок-схема по Ведьмак 2 Убийцы Королей (ver. 1.0)

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Схема всех игровых квестов со всеми развилками.

Растущая коллекция материалов с SIGGRAPH 2022: презентации, слайды, видео, ссылки и прочее

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Небольшая статья про метод создание декалей взрыва в 3D-игре, который хорош для игр с видом сверху

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Vampire the Masquerade Bloodlines — редизайн UI для ремейка которого не случилось

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Художник решил поддержать будущего коллегу, сделавшего редизайн UI в первой Deus Ex, и поделился своим видением интерфейса ремейка VTMB

Симуляция тропической погоды в Far Cry 6

В докладе с GDC 2022 года Эмили Чжоу из Ubisoft Montreal и Колин Вейк из Ubisoft Toronto описывают методы и системы, реализованные для имитации тропической погоды в Far Cry 6, а также проблемы, с которыми пришлось столкнуться при организации этих систем для создания динамических переходов погоды.

Провальные игры — извлечённые уроки

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

Разработчик Recipe For Disaster делится своими мыслями, чтобы помочь другим разработчикам игр не наступать на его грабли.

Как соединить три композиции в одну: создатели «Аркейн» о написании саундтрека и песен для сериала

В четвёртом эпизоде документального сериала о создании «Аркейн» авторы рассказали о написании саундтрека и песен для шоу. Этим занимался как внутренний музыкальный отдел Riot Games, так и несколько сторонних музыкантов и групп, вроде Стинга и Imagine Dragons.

В какое время года лучше всего выпускать игру?

Недельный геймдев: #84 — 28 августа, 2022 Gamedev, Разработка, Новости, Дайджест, Видео, YouTube, Гифка, Без звука, Длиннопост

GamediscoverCo на основе собранных за год данных пытаются разобраться в вопросе.

Telegram API — Отправка Emoji

введите сюда описание изображения

Посмотрите на Emoji Unicode Tables.
Нужный вам код смайлика находится в колонке Bytes (UTF-8) .

Перед отправкой на сервер необходимо выполнять URL Encode.

Например, \xF0\x9F\x98\x81 должен выглядеть так: %F0%9F%98%81 .

user avatar

Я просто копировал emoji из таблицы выше обычным выделением мышкой (как выделяется текст) из колонки «Native» получается вот так: ��

На bash я использую этот ресурс для получения кода

Строка «C/C++/Java source code» отображает необходимую кодировку. Запрос приобретает вид

где \uD83D\uDE31 и есть кодированный символ 👌

user avatar

Пишу бота на C#, работает в таком виде «\U0001F69A» для кода U+1F69A из таблицы.

user avatar

Для РНР там где смайл:

код смайла без \х отсюда (колонка Bytes (UTF-8) )

Используйте средства для представления Unicode текста в вашей среде. Она сама выполнит преобразование из текста в октеты согласно utf-8 кодировке, а затем произведёт percent-encoding. Например, чтобы отправить флаг ����, который состоит из Unicode символов U+1f1f7, U+1f1fa в restclient в Emacs:

Это выполняет http POST запрос по указанному url (bot идентифицируемый по :token отправляет сообщение ура ����! в :chat-id чат).

На Питоне это может выглядеть как:

Видно, что нет необходимости руками кодировать строку в ascii-представление:

Питон автоматически кодирует сообщение. На сервер уходит (зашифрованное с помощью TLS), что-то вроде:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *