from aiogram import Bot, Dispatcher, types, F from aiogram.filters import Command import logging import asyncio import re from typing import List, Optional import os from dotenv import load_dotenv load_dotenv() logging.basicConfig(level=logging.INFO) BOT_TOKEN = os.getenv("BOT_TOKEN") if not BOT_TOKEN: raise ValueError("BOT_TOKEN не указан в .env файле!") bot = Bot(token=BOT_TOKEN) dp = Dispatcher() @dp.message(Command("start")) async def cmd_start(message: types.Message): await message.answer("Привет! Отправь мне сообщение с премиум эмодзи, и я покажу его в текстовом формате.") def extract_emoji_entities(message: types.Message) -> List[types.MessageEntity]: """Извлекает все эмодзи-сущности из сообщения.""" if not message.entities: return [] return [entity for entity in message.entities if entity.type == "custom_emoji"] @dp.message(F.entities) async def handle_message_with_entities(message: types.Message): emoji_entities = extract_emoji_entities(message) if not emoji_entities: return original_text = message.text text_parts = [] last_position = 0 for entity in emoji_entities: text_parts.append(original_text[last_position:entity.offset]) emoji_text = original_text[entity.offset:entity.offset + entity.length] emoji_id = entity.custom_emoji_id text_parts.append(f"<emoji id={emoji_id}>{emoji_text}</emoji>") last_position = entity.offset + entity.length if last_position < len(original_text): text_parts.append(original_text[last_position:]) text_with_emoji_tags = "".join(text_parts) MAX_MESSAGE_LENGTH = 4000 if len(text_with_emoji_tags) <= MAX_MESSAGE_LENGTH: await message.answer(text_with_emoji_tags) else: chunks = [] current_chunk = "" for line in text_with_emoji_tags.split('\n'): if len(line) > MAX_MESSAGE_LENGTH: for i in range(0, len(line), MAX_MESSAGE_LENGTH - 100): part = line[i:i + MAX_MESSAGE_LENGTH - 100] if current_chunk and len(current_chunk) + len(part) + 1 > MAX_MESSAGE_LENGTH: chunks.append(current_chunk) current_chunk = part else: if current_chunk: current_chunk += "\n" current_chunk += part else: if current_chunk and len(current_chunk) + len(line) + 1 > MAX_MESSAGE_LENGTH: chunks.append(current_chunk) current_chunk = line else: if current_chunk: current_chunk += "\n" current_chunk += line if current_chunk: chunks.append(current_chunk) for i, chunk in enumerate(chunks): await message.answer(f"Часть {i+1}/{len(chunks)}:\n{chunk}") @dp.message() async def handle_regular_message(message: types.Message): await message.answer("В вашем сообщении нет премиум эмодзи. Отправьте сообщение с премиум эмодзи или используйте /example для просмотра примера.") async def main(): logging.info("Бот запущен") await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) Python from aiogram import Bot, Dispatcher, types, F from aiogram.filters import Command import logging import asyncio import re from typing import List, Optional import os from dotenv import load_dotenv load_dotenv() logging.basicConfig(level=logging.INFO) BOT_TOKEN = os.getenv("BOT_TOKEN") if not BOT_TOKEN: raise ValueError("BOT_TOKEN не указан в .env файле!") bot = Bot(token=BOT_TOKEN) dp = Dispatcher() @dp.message(Command("start")) async def cmd_start(message: types.Message): await message.answer("Привет! Отправь мне сообщение с премиум эмодзи, и я покажу его в текстовом формате.") def extract_emoji_entities(message: types.Message) -> List[types.MessageEntity]: """Извлекает все эмодзи-сущности из сообщения.""" if not message.entities: return [] return [entity for entity in message.entities if entity.type == "custom_emoji"] @dp.message(F.entities) async def handle_message_with_entities(message: types.Message): emoji_entities = extract_emoji_entities(message) if not emoji_entities: return original_text = message.text text_parts = [] last_position = 0 for entity in emoji_entities: text_parts.append(original_text[last_position:entity.offset]) emoji_text = original_text[entity.offset:entity.offset + entity.length] emoji_id = entity.custom_emoji_id text_parts.append(f"<emoji id={emoji_id}>{emoji_text}</emoji>") last_position = entity.offset + entity.length if last_position < len(original_text): text_parts.append(original_text[last_position:]) text_with_emoji_tags = "".join(text_parts) MAX_MESSAGE_LENGTH = 4000 if len(text_with_emoji_tags) <= MAX_MESSAGE_LENGTH: await message.answer(text_with_emoji_tags) else: chunks = [] current_chunk = "" for line in text_with_emoji_tags.split('\n'): if len(line) > MAX_MESSAGE_LENGTH: for i in range(0, len(line), MAX_MESSAGE_LENGTH - 100): part = line[i:i + MAX_MESSAGE_LENGTH - 100] if current_chunk and len(current_chunk) + len(part) + 1 > MAX_MESSAGE_LENGTH: chunks.append(current_chunk) current_chunk = part else: if current_chunk: current_chunk += "\n" current_chunk += part else: if current_chunk and len(current_chunk) + len(line) + 1 > MAX_MESSAGE_LENGTH: chunks.append(current_chunk) current_chunk = line else: if current_chunk: current_chunk += "\n" current_chunk += line if current_chunk: chunks.append(current_chunk) for i, chunk in enumerate(chunks): await message.answer(f"Часть {i+1}/{len(chunks)}:\n{chunk}") @dp.message() async def handle_regular_message(message: types.Message): await message.answer("В вашем сообщении нет премиум эмодзи. Отправьте сообщение с премиум эмодзи или используйте /example для просмотра примера.") async def main(): logging.info("Бот запущен") await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) скрин работы https://imgur.com/a/jMMDzar в .env файл добавьте BOT_TOKEN=токен