Здравствуйте!
Я разрабатываю 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()
Тут только скелет проекта, весь не поместился:)