Загрузка...

Телеграм-бот для загрузки скриншотов на Imgur

Тема в разделе Python создана пользователем пикми 13 мар 2025. (поднята 17 мар 2025) 172 просмотра

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

    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. Посмотреть предыдущие комментарии (4)
    2. пикми Автор темы
      сомния, да не сам, поверил что ли, я такой калик не написал бы сам
    3. сомния
      пикми, последнюю часть прочитай
    4. пикми Автор темы
      сомния, я не кодер, поэтому не знаю какие промты нормальные :(
Загрузка...
Top