Телеграм — один из самых популярных, если не самый популярный мессенджер в рунете. Многие ведут в нём личные каналы или группы, а для кого‑то это платформа для предоставления различных услуг. Очень часто, для создания своего стиля авторы используют смайлики и другие символы, а с появлением подписки Telegram‑премиум стало возможным создавать и добавлять свои собственные картинки.
Сегодня мы рассмотрим, как из обычного шрифта, сделать уникальный набор эмозди и добавить его в телеграм.
Для этого используется бот @Stickers
, и если вы когда‑то делали свои собственные стикеры — то он вам уже знаком. Для создания нового пакета эмодзи используется команда /newemojipack
, а затем необходимо заполнить название и отправить картинку, а затем эмодзи из базового набора, который будет соотносится с нашим новым значком. Да, важно сказать, что мы будем создавать статичные эмодзи, а значит мы должны отправлять картинку на прозрачном фоне, размером не превышающую 100×100 пикселей.
Это несложно сделать руками, когда у нас один или два новых кастомных смайлика. Но очень часто для оформления постов применяются эмодзи‑буквы и знаки препинания, а это уже минимум(если говорить про русский язык) 33 символа. Так что будем автоматизировать.
Создаём набор изображений с буквами
Итак, нам необходимо сгенерировать набор из 33 картинок, каждая из которых — буква, на прозрачном фоне, написаная определённым шрифтом и определённого цвета. Самое сложное — было найти какой‑нибудь прикольный шрифт, но в одном телеграм‑канале я смог найти несколько прикольных. Для создания картинок будем использовать библиотеку PIL.
Для начала установим её, зафиксировав версию, потому что в более новой — отсутствуют необходимые нам методы.
pip install pillow==9.5.0
А затем напишем небольшую функцию, которая и создаст наш набор картинок
from PIL import Image, ImageDraw, ImageFont
import os
def generate_all_alphabet(font_name, alphabet, color=(0, 0, 255, 255)):
output_dir_name = f"{font_name.split('.ttf')[0].split('/')[-1]}"
try:
os.makedirs(output_dir_name)
except FileExistsError:
pass
fontsize = None
font = None
for letter in alphabet:
img = Image.new('RGBA', (100, 100), (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
if not fontsize or font:
fontsize = 1
font = ImageFont.truetype(font_name, fontsize)
while font.getsize(letter)[0] < img.size[0] * 0.9 and font.getsize(letter)[1] < img.size[1] * 0.9:
fontsize += 1
font = ImageFont.truetype(font_name, fontsize)
fontsize -= 1
font = ImageFont.truetype(font_name, fontsize)
letter_width, letter_height = font.getsize(letter)
position = ((img.width - letter_width) // 2, (img.height - letter_height) // 2)
draw.text(position, letter, fill=color, font=font)
img.save(f"{output_dir_name}/letter_{letter}.png", "PNG")
Давайте разберём, что в ней происходит:
-
В качестве параметров, в функцию поступают:
Путь к файлу шрифта -
font_name
Список символов(букв и/или знаков препинания), из которые мы хотим сделать картинки -
alphabet
Цвет, в который мы хотим окрасить по схеме RGBA, по умолчанию - синий -
color
Сначала создаётся папка, в которой мы будем хранить наши картинки
Затем мы подбираем размер шрифта, банальным подбором: увеличиваем значение на единичку и проверяем, что буква влезает на наш холст, а в конце уменьшаем на единичку, на всякий случай
Пробегаясь по всем элементам мы помещаем в центр нашего холста нашу букву и сохраняем в файл
Теперь у нас есть картинки. Давайте отправим их в бота.
Создаём эмодзи-пак
Для автоматизации процесса будем использовать популярную библиотеку для создания юзерботов(боты симулирующие действия пользователя) — Pyrogram.
Чтобы подключить бота написаного с помощью этой библиотеки, необходимо зарегистрировать приложение в телеграме. Это делается не с помощью привычного @BotFather
, а вот по этой инструкции. Вам понадобятся api_id
и api_hash
.
Как и в предыдущем случае, напишем функцию, а затем рассмотрим её поподробнее:
from pyrogram import Client
from pyrogram.enums import ChatType
from constants import emoji_alphabet
def add_emoji_alphabet(font_name, api_id, api_hash, session_name):
with Client(session_name, api_id, api_hash) as client:
dialogs = client.get_dialogs()
stickers_chat_id = None
for dialog in dialogs:
chat = dialog.chat
if chat.type == ChatType.BOT and chat.username == "Stickers":
stickers_chat_id = chat.id
break
client.send_message(stickers_chat_id, "/start")
client.send_message(stickers_chat_id, "/newemojipack")
client.send_message(stickers_chat_id, "Статичные эмодзи")
client.send_message(stickers_chat_id, font_name)
for letter in emoji_alphabet.keys():
client.send_document(stickers_chat_id, f"{font_name}/letter_{letter}.png")
client.send_message(stickers_chat_id, emoji_alphabet[letter])
client.send_message(stickers_chat_id, "/publish")
client.send_message(stickers_chat_id, "/skip")
client.send_message(stickers_chat_id, font_name)
Для начала, разберёмся, что это за emoji_alphabet
. Как вы помните, для добавления нужно две вещи: картинка и базовый эмодзи. Так вот, это словарь, где ключом является буква алфавита, а значением — необходимый эмодзи. Большой плюс Python‑а в том, что он поддерживает эти символы и не нужно париться с их кодом. Вот так выглядит кусочек этого словаря:
emoji_alphabet = {'А': "????", 'Б': "????", 'В': "????", 'Г': "????"}
Теперь посмотрим, что происходит в функции:
Для начала мы подключаемся к нашему приложению, используя полученные ранее
api_id
иapi_hash
, в качествеsession_name
обычно используется какой-нибудь уникальный идентификатор, что бы потом, в свойствах Telegram его можно было легко заметитьПотом, ищем идентификатор нашего чата со стикерами
-
Потом отправляем целый набор команд и фраз:
/start
- для перезапуска бота/newemojipack
- для запуска процесса создания нового пакета эмодзиСтатичные эмодзи
- для выбора типа создаваемого пакетаfont_name
- для выбора имени нашего пакета
-
А затем, для каждой буквы мы отправляем две вещи:
Сначала изображение с этой буквой
А затем "стандартный эмодзи"
После этого публикуем наш пакет, пропускаем выбор обложки(в этом случае приложения будут показывать в качестве обложки первый эмодзи из набора) и указываем название нашего шрифта (
font_name
) для создания короткой ссылки
После перехода по этой ссылке - вы сможете использовать сгенерированные эмодзи
Теперь, вы можете создавать свои собственные эмодзи паки из любых шрифтов. Весь код доступен на GitHub.