Телеграм — один из самых популярных, если не самый популярный мессенджер в рунете. Многие ведут в нём личные каналы или группы, а для кого‑то это платформа для предоставления различных услуг. Очень часто, для создания своего стиля авторы используют смайлики и другие символы, а с появлением подписки 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

  • Сначала создаётся папка, в которой мы будем хранить наши картинки

  • Затем мы подбираем размер шрифта, банальным подбором: увеличиваем значение на единичку и проверяем, что буква влезает на наш холст, а в конце уменьшаем на единичку, на всякий случай

  • Пробегаясь по всем элементам мы помещаем в центр нашего холста нашу букву и сохраняем в файл

Снимок экрана 2023-09-20 в 23.56.54

Теперь у нас есть картинки. Давайте отправим их в бота.

Создаём эмодзи-пак

Для автоматизации процесса будем использовать популярную библиотеку для создания юзерботов(боты симулирующие действия пользователя) — 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.

Комментарии (0)