Загрузка...

Telegram-boot for loading screenshots on IMGUR

Thread in Python created by пикми Mar 13, 2025. (bumped Mar 17, 2025) 190 views

  1. пикми
    пикми Topic starter Mar 13, 2025 guest, купи звёзды 1.29р - lolz.live/threads/4643304/ :pog:
    Для запуска этого бота вам потребуется:

    1. Создать файл .env в той же директории, где находится скрипт, со следующим содержимым:
    Python
    BOT_TOKEN=ваш_токен_телеграм_бота
    IMGUR_CLIENT_ID=ваш_client_id_imgur
    2. Установить необходимые библиотеки:
    Python
    pip install aiogram requests python-dotenv
    3. Получить токены:

    Токен Telegram бота можно получить у бот фазира в тг
    [IMG]
    Client ID для Imgur API нужно получить, зарегистрировавшись ТУТ
    [IMG]

    Python
    import logging
    import os
    from io import BytesIO
    import requests

    from aiogram import Bot, Dispatcher, types, executor
    from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
    from aiogram.contrib.fsm_storage.memory import MemoryStorage
    from aiogram.dispatcher import FSMContext
    from aiogram.dispatcher.filters.state import State, StatesGroup
    from dotenv import load_dotenv

    # Загрузка переменных окружения
    load_dotenv()

    # Настройка логирования
    logging.basicConfig(level=logging.INFO)

    # Получение токенов из переменных окружения
    BOT_TOKEN = os.getenv("BOT_TOKEN")
    IMGUR_CLIENT_ID = os.getenv("IMGUR_CLIENT_ID")

    # Инициализация бота и диспетчера
    bot = Bot(token=BOT_TOKEN)
    storage = MemoryStorage()
    dp = Dispatcher(bot, storage=storage)

    # Определение состояний для FSM
    class UploadStates(StatesGroup):
    waiting_for_image = State()

    # Функция для загрузки изображения на Imgur
    async def upload_to_imgur(image_data):
    url = "https://api.imgur.com/3/upload"
    headers = {"Authorization": f"Client-ID {IMGUR_CLIENT_ID}"}
    files = {"image": image_data}

    try:
    response = requests.post(url, headers=headers, files=files)
    response.raise_for_status()
    data = response.json()
    return data["data"]["link"]
    except Exception as e:
    logging.error(f"Ошибка загрузки на Imgur: {e}")
    return None

    # Обработчик команды /start
    @dp.message_handler(commands=['start'])
    async def cmd_start(message: types.Message):
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Загрузить скриншот", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Помощь", callback_data="help"))

    await message.answer(
    "Привет! Я бот для загрузки скриншотов на Imgur. "
    "Чем могу помочь?",
    reply_markup=keyboard
    )

    # Обработчик команды /help
    @dp.message_handler(commands=['help'])
    async def cmd_help(message: types.Message):
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Загрузить скриншот", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Назад", callback_data="start"))

    await message.answer(
    "Инструкция по использованию:\n"
    "1. Нажмите кнопку 'Загрузить скриншот'\n"
    "2. Отправьте мне изображение\n"
    "3. Я загружу его на Imgur и пришлю вам ссылку\n\n"
    "Для начала нажмите кнопку ниже:",
    reply_markup=keyboard
    )

    # Обработчик инлайн-кнопки "Загрузить скриншот"
    @dp.callback_query_handler(lambda c: c.data == "upload")
    async def process_upload_callback(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Отмена", callback_data="cancel"))

    await bot.send_message(
    callback_query.from_user.id,
    "Пожалуйста, отправьте мне изображение для загрузки на Imgur",
    reply_markup=keyboard
    )

    await UploadStates.waiting_for_image.set()

    # Обработчик для получения изображения
    @dp.message_handler(content_types=[types.ContentType.PHOTO], state=UploadStates.waiting_for_image)
    async def handle_image(message: types.Message, state: FSMContext):
    # Отправка статуса "typing" для индикации процесса
    await bot.send_chat_action(message.chat.id, "typing")

    # Получение файла с наибольшим разрешением
    photo = message.photo[-1]
    file_id = photo.file_id
    file = await bot.get_file(file_id)
    file_path = file.file_path

    # Загрузка изображения
    downloaded_file = await bot.download_file(file_path)
    image_data = BytesIO(downloaded_file.read())

    # Отправка на Imgur
    link = await upload_to_imgur(image_data)

    # Создание клавиатуры с результатами
    keyboard = InlineKeyboardMarkup()

    if link:
    keyboard.add(InlineKeyboardButton("Открыть изображение", url=link))
    keyboard.add(InlineKeyboardButton("Загрузить еще", callback_data="upload"))

    await message.answer(
    f"Изображение успешно загружено!\nСсылка: {link}",
    reply_markup=keyboard
    )
    else:
    keyboard.add(InlineKeyboardButton("Попробовать снова", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("В начало", callback_data="start"))

    await message.answer(
    "К сожалению, произошла ошибка при загрузке изображения на Imgur. "
    "Пожалуйста, попробуйте еще раз позже.",
    reply_markup=keyboard
    )

    # Сброс состояния
    await state.finish()

    # Обработчик документов (для случаев, когда пользователь отправляет изображение как файл)
    @dp.message_handler(content_types=[types.ContentType.DOCUMENT], state=UploadStates.waiting_for_image)
    async def handle_document(message: types.Message, state: FSMContext):
    # Проверка, является ли документ изображением
    mime_type = message.document.mime_type
    if mime_type and mime_type.startswith('image/'):
    await bot.send_chat_action(message.chat.id, "typing")

    file_id = message.document.file_id
    file = await bot.get_file(file_id)
    file_path = file.file_path

    # Загрузка изображения
    downloaded_file = await bot.download_file(file_path)
    image_data = BytesIO(downloaded_file.read())

    # Отправка на Imgur
    link = await upload_to_imgur(image_data)

    # Создание клавиатуры с результатами
    keyboard = InlineKeyboardMarkup()

    if link:
    keyboard.add(InlineKeyboardButton("Открыть изображение", url=link))
    keyboard.add(InlineKeyboardButton("Загрузить еще", callback_data="upload"))

    await message.answer(
    f"Изображение успешно загружено!\nСсылка: {link}",
    reply_markup=keyboard
    )
    else:
    keyboard.add(InlineKeyboardButton("Попробовать снова", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("В начало", callback_data="start"))

    await message.answer(
    "К сожалению, произошла ошибка при загрузке изображения на Imgur. "
    "Пожалуйста, попробуйте еще раз позже.",
    reply_markup=keyboard
    )
    else:
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Попробовать снова", callback_data="upload"))

    await message.answer(
    "Пожалуйста, отправьте изображение. "
    "Файл, который вы отправили, не является изображением.",
    reply_markup=keyboard
    )

    # Сброс состояния
    await state.finish()

    # Обработчик для отмены загрузки
    @dp.callback_query_handler(lambda c: c.data == "cancel", state="*")
    async def process_cancel(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)
    current_state = await state.get_state()

    if current_state:
    await state.finish()

    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Загрузить скриншот", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Помощь", callback_data="help"))

    await bot.send_message(
    callback_query.from_user.id,
    "Действие отменено. Чем еще могу помочь?",
    reply_markup=keyboard
    )

    # Обработчик инлайн-кнопки "Помощь"
    @dp.callback_query_handler(lambda c: c.data == "help")
    async def process_help_callback(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Загрузить скриншот", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Назад", callback_data="start"))

    await bot.send_message(
    callback_query.from_user.id,
    "Инструкция по использованию:\n"
    "1. Нажмите кнопку 'Загрузить скриншот'\n"
    "2. Отправьте мне изображение\n"
    "3. Я загружу его на Imgur и пришлю вам ссылку\n\n"
    "Для начала нажмите кнопку ниже:",
    reply_markup=keyboard
    )

    # Обработчик инлайн-кнопки "В начало"
    @dp.callback_query_handler(lambda c: c.data == "start")
    async def process_start_callback(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Загрузить скриншот", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Помощь", callback_data="help"))

    await bot.send_message(
    callback_query.from_user.id,
    "Привет! Я бот для загрузки скриншотов на Imgur. "
    "Чем могу помочь?",
    reply_markup=keyboard
    )

    # Обработчик для текстовых сообщений в режиме ожидания изображения
    @dp.message_handler(state=UploadStates.waiting_for_image)
    async def handle_text_in_upload_state(message: types.Message, state: FSMContext):
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Попробовать снова", callback_data="upload"))
    keyboard.add(InlineKeyboardButton("Отмена", callback_data="cancel"))

    await message.answer(
    "Пожалуйста, отправьте изображение для загрузки на Imgur.",
    reply_markup=keyboard
    )

    # Обработчик неизвестных callback_data
    @dp.callback_query_handler(lambda c: True)
    async def process_unknown_callback(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id, "Неизвестная команда")

    if __name__ == '__main__':
    # Запуск бота
    executor.start_polling(dp, skip_updates=True)
     
    1. View previous comments (4)
    2. пикми Topic starter
      сомния, да не сам, поверил что ли, я такой калик не написал бы сам
    3. сомния
      пикми, последнюю часть прочитай
    4. пикми Topic starter
      сомния, я не кодер, поэтому не знаю какие промты нормальные :(
Top
Loading...