Для запуска этого бота вам потребуется: 1. Создать файл .env в той же директории, где находится скрипт, со следующим содержимым: BOT_TOKEN=ваш_токен_телеграм_бота IMGUR_CLIENT_ID=ваш_client_id_imgur Python BOT_TOKEN=ваш_токен_телеграм_бота IMGUR_CLIENT_ID=ваш_client_id_imgur 2. Установить необходимые библиотеки: pip install aiogram requests python-dotenv Python pip install aiogram requests python-dotenv 3. Получить токены: Токен Telegram бота можно получить у бот фазира в тг ботфазир Client ID для Imgur API нужно получить, зарегистрировавшись ТУТ img code 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) 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)