Telegram bot который принимает фотографии и публикует их

b539be5c171c392322d5aa140cf3a9d9.jpg

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

Импорт необходимых модулей

Приступим, для написания бота нам потребуется python, модуль библиотеки python-telegram-bot — telegram, и модуль time.

import time
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext

Кратко пройдемся по импортируем классам и функциям.

  • Application — основной класс, для взаимодействия с Telegram API. Он обрабатывает действия пользователя при работе с ботом.

  • Handler — функции, которые отвечают на сообщения, и события при работе с ботом.

  • CommandHandler — обрабатывает команды, такие как /start.

  • MessageHandler — обрабатывает сообщения определенных типов, в нашем случае — изображение.

  • filters — модуль, который используется для создания условий на входящие сообщения.

  • CallbackContex — объект, который передается в функции-обработчики. Содержит информацию, о контексте вызова обработчика.

Константы и глобальные переменные

# Ваш токен бота
BOT_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
CHANNEL_ID = '@your_channel' # Ссылка на ваш канал
DEFAULT_CAPTION = "Это текст, который будет добавляться к каждому посту в канал."
  • BOT_TOKEN — токен вашего бота. Его мы получаем при создании бота в BotFather.

  • CHANNEL_ID — ссылка на ваш канал, если он публичный пишется с @, но если ваш канал приватный, то из ссылки канала вам надо взять значения, которое начинается с -, к примеру #-00000000, то вам необходимо взять -00000000, и добавить 100. CHANNEL_ID = '-10000000000'.

  • DEFAULT_CAPTION — это заранее заданный текст, который будет добавляться к каждому изображению, отправляемому в канал. Вы можете изменить этот текст на любой другой по вашему усмотрению.

Так же необязательно, но я добавлю проверку времени последней отправки пользователем.

# Словарь для хранения времени последней отправки фото пользователем
user_last_photo_time = {}
# Ограничение по времени (12 часов в секундах)
TIME_LIMIT = 12 * 60 * 60  # 12 часов = 43200 секунд
  • user_last_photo_ time — словарь, который хранит когда последний раз пользователь отправлял изображение в бота.

  • TIME_LIMIT — ограничение отправки сообщений пользователем, я поставил 12 часов, но можно поставить любое время

Функция проверки временного ограничения

def can_send_photo(user_id):
    current_time = time.time()
    last_time = user_last_photo_time.get(user_id, 0)
    if current_time - last_time >= TIME_LIMIT:
        return True
    return False
  • can_send_photo (user_id): эта функция проверяет, прошло ли достаточно времени (12 часов) с момента последней отправки фото пользователем.

  • time.time () — возвращает текущее время в секундах.

  • user_last_photo_time.get (user_id, 0) — получает последнюю временную метку, когда пользователь отправил фото. Если данных нет (пользователь отправляет фото впервые), возвращает значение 0.

  • current_time — last_time >= TIME_LIMIT: проверяет, прошло ли 12 часов с последней отправки фото.

    Если условие выполняется, возвращает True, иначе — False.

Обработка изображений

async def handle_image(update: Update, context: CallbackContext):
    user_id = update.message.from_user.id
  • handle_image — эта функция обрабатывает изображения, которые присылают пользователи.

  • update.message.from_user.id — извлекает user_id пользователя, который отправил изображение.

    if can_send_photo(user_id):
        photo = update.message.photo[-1]
        caption = DEFAULT_CAPTION
  • can_send_photo (user_id) — проверяет, может ли пользователь отправить фото (учитывая временное ограничение).

  • photo = update.message.photo[-1] — если было отправлено несколько фото от одного человека, отправлять в канал только первое.

  • caption = DEFAULT_CAPTION — берёт заранее заданный текст, который будет отправлен вместе с изображением.

        await context.bot.send_photo(
            chat_id=CHANNEL_ID,
            photo=photo.file_id,
            caption=caption
        )
  • context.bot.send.photo — отправляет фото в указанный канал.

  • chat_id=CHANNEL_ID — идентификатор канала, куда будет отправлено изображение.

  • photo=photo.file_id — файл изображения, который будет отправлен.

  • caption=caption — текст, который будет прикреплён к изображению.

        user_last_photo_time[user_id] = time.time()
        await update.message.reply_text("Изображение с текстом отправлено в канал!")
  • user_last_photo_time[user_id] = time.time () — обновляет временную метку отправки изображения пользователем.

  • await update.message.reply_text (») — ответ пользователю, о том что его сообщение принято.

    else:
        remaining_time = TIME_LIMIT - (time.time() - user_last_photo_time[user_id])
        hours, remainder = divmod(remaining_time, 3600)
        minutes, _ = divmod(remainder, 60)
        await update.message.reply_text(f"Вы сможете отправить фото через {int(hours)} часов и {int(minutes)} минут.")

Если пользователь пытается отправить фото до истечения 12 часов, бот рассчитывает, сколько времени осталось до следующей возможности отправить изображение, и уведомляет об этом.

Обработка команды /start

async def start(update: Update, context: CallbackContext):
    await update.message.reply_text("Отправьте мне изображение, и я размещу его в канале вместе с текстом, но не чаще, чем раз в 12 часов.")

start — это обработчик команды /start. Когда пользователь вводит эту команду, бот отправляет ему сообщение с инструкциями, как отправить изображение.

Основная функция — запуск бота

def main():
    application = Application.builder().token(BOT_TOKEN).build()

    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.PHOTO, handle_image))

    application.run_polling()

main () — главная функция, которая запускает бота.

  • Application.builder ().token (BOT_TOKEN).build () — создает экземпляр бота с вашим токеном.

  • application.add_handler (CommandHandler («start», start)) — добавляет обработчик команды /start.

  • application.add_handler (MessageHandler (filters.PHOTO, handle_image)) — добавляет обработчик изображений.

  • application.run_polling () — запускает бота в режима постоянного опроса сервера Telegram для получения обновлений.

Готовый код Telegram бота

import time
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext

# Ваш токен бота
BOT_TOKEN = 'BOT_TOKEN'
CHANNEL_ID = '-100999999'  # Приватный канал

# Словарь для хранения времени последней отправки фото пользователем
user_last_photo_time = {}

# Ограничение по времени (12 часов в секундах)
TIME_LIMIT = 12 * 60 * 60  # 12 часов = 43200 секунд

# Текст, который будет добавляться к посту
DEFAULT_CAPTION = "Добавьте свой текст"

# Функция для проверки ограничения
def can_send_photo(user_id):
    current_time = time.time()
    last_time = user_last_photo_time.get(user_id, 0)
    if current_time - last_time >= TIME_LIMIT:
        return True
    return False

# Функция для обработки изображений
async def handle_image(update: Update, context: CallbackContext):
    user_id = update.message.from_user.id


    # Проверка на временное ограничение (12 часов)
    if can_send_photo(user_id):
        # Разрешаем отправку фото
        photo = update.message.photo[-1]

        # Используем заранее заданный текст как подпись
        caption = DEFAULT_CAPTION

        # Отправляем фото в канал с подписью
        await context.bot.send_photo(
            chat_id=CHANNEL_ID,
            photo=photo.file_id,
            caption=caption
        )

        # Обновляем время последней отправки фото
        user_last_photo_time[user_id] = time.time()

        # Подтверждение пользователю
        await update.message.reply_text("Изображение отправлено в канал!")
    else:
        # Если не прошло 12 часов, отклоняем запрос
        remaining_time = TIME_LIMIT - (time.time() - user_last_photo_time[user_id])
        hours, remainder = divmod(remaining_time, 3600)
        minutes, _ = divmod(remainder, 60)
        await update.message.reply_text(f"Вы сможете отправить фото через {int(hours)} часов и {int(minutes)} минут.")

# Функция для старта
async def start(update: Update, context: CallbackContext):
    await update.message.reply_text("Отправьте мне изображение, и я размещу его в канале, но не чаще, чем раз в 12 часов.")

def main():
    # Создаем экземпляр Application и передаем ему токен бота
    application = Application.builder().token(BOT_TOKEN).build()

    # Обработчик команды /start
    application.add_handler(CommandHandler("start", start))

    # Обработчик изображений
    application.add_handler(MessageHandler(filters.PHOTO, handle_image))

    # Запускаем бота
    application.run_polling()

if __name__ == '__main__':
    main()

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

© Habrahabr.ru