Python + PIL + Pyrogram = Кастомные эмодзи для Telegram

—

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/762420/


Комментарии

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

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