Задать вопрос
@nerdh

Как мне написать watermark бота?

Здравствуйте!

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

К сожалению, я не понимаю, как реализовать этот функционал. Подскажите, пожалуйста, как это лучше сделать? Буду благодарен за любую помощь и советы.

Спасибо!

Вот основной реализация основного функционала, если кому интересно -
import logging
from telegram import Update, MessageEntity
from telegram.ext import (
    ApplicationBuilder,
    CommandHandler,
    MessageHandler,
    filters,
    ContextTypes,
)

# Токен бота
TOKEN = "ваш_токен"

# Логирование
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Корректировка смещения для entities
def adjust_entities_offset(entities, offset):
    """Корректирует смещение entities."""
    if not entities:
        return []
    return [
        MessageEntity(
            type=entity.type,
            offset=entity.offset + offset,
            length=entity.length,
        )
        for entity in entities
    ]

# Обработчик новых сообщений в канале
async def handle_channel_post(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Добавляет водяной знак к новым сообщениям в канале."""
    post = update.channel_post
    if not post:
        return

    watermark = "© Ваш водяной знак"
    separator = "\n\n"

    try:
        if post.text:
            original_entities = list(post.entities or [])
            updated_text = f"{post.text}{separator}{watermark}"
            watermark_offset = len(post.text) + len(separator)
            adjusted_entities = adjust_entities_offset(original_entities, 0) + adjust_entities_offset(
                [MessageEntity(type="bold", offset=watermark_offset, length=len(watermark))], 
                watermark_offset
            )
            await context.bot.edit_message_text(
                chat_id=post.chat_id,
                message_id=post.message_id,
                text=updated_text,
                entities=adjusted_entities,
            )
        elif post.caption:
            original_entities = list(post.caption_entities or [])
            updated_caption = f"{post.caption}{separator}{watermark}"
            watermark_offset = len(post.caption) + len(separator)
            adjusted_entities = adjust_entities_offset(original_entities, 0) + adjust_entities_offset(
                [MessageEntity(type="italic", offset=watermark_offset, length=len(watermark))], 
                watermark_offset
            )
            await context.bot.edit_message_caption(
                chat_id=post.chat_id,
                message_id=post.message_id,
                caption=updated_caption,
                caption_entities=adjusted_entities,
            )
        logger.info(f"Водяной знак добавлен к сообщению {post.message_id}")
    except Exception as e:
        logger.error(f"Ошибка при обработке сообщения: {e}")

# Команда /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Отправляет приветственное сообщение."""
    await update.message.reply_text("Привет! Я добавляю водяные знаки к сообщениям в канале.")

# Основной метод запуска бота
def main():
    app = ApplicationBuilder().token(TOKEN).build()

    # Обработчики
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.UpdateType.CHANNEL_POST, handle_channel_post))

    logger.info("Бот запущен.")
    app.run_polling()

if __name__ == "__main__":
    main()
Тут только скелет проекта, весь не поместился:)
  • Вопрос задан
  • 125 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@GrigoryMorozov
Из документации (один, два):

Custom emoji entities can only be used by bots that purchased additional usernames on Fragment

You can also upgrade collectible usernames to assign them to Telegram bots. To upgrade, assign the username to a bot and pay a one-time fee.


Если коротко: это будет очень дорогая задача (найти точную цифру не получилось, оценка снизу — 600 000 ₽). Не уверен, что вам это нужно. Если нужно — информация по покупке коллекционного имени для бота есть по второй ссылке, а непосредственно по вставке кастомных эмодзи — по первой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы