Оптимизация кода бота

बनाया गया: 6 अक्तूबर 2024

का उपयोग करके उत्तर दिया गया O1 Preview द्वारा Chat01

प्रश्न

make the code better and more efficient.

text
import telebot import pyautogui import pygetwindow as gw import os # Ваш токен от Telegram bot_token = 'Bot_Token' # Замените на токен нужного бота bot = telebot.TeleBot(bot_token) # Укажите ID пользователя, который может управлять ботом allowed_user_id = 123456789 # Замените на ваш реальный Telegram ID # Функция проверки прав доступа def check_access(message): if message.from_user.id != allowed_user_id: bot.send_message(message.chat.id, "У вас нет прав для управления этим ботом.") print(f"Пользователь {message.from_user.id} пытался выполнить команду, но не имеет прав.") return False return True # Команда для отправки скриншота @bot.message_handler(commands=['screenshot']) def send_screenshot(message): if not check_access(message): return try: # Делаем скриншот screenshot = pyautogui.screenshot() # Сохраняем временно скриншот screenshot_path = 'screenshot.png' screenshot.save(screenshot_path) # Проверяем, существует ли файл перед отправкой if os.path.exists(screenshot_path): with open(screenshot_path, 'rb') as photo: bot.send_photo(message.chat.id, photo) os.remove(screenshot_path) # Удаляем файл после отправки print("Команда /screenshot выполнена: скриншот отправлен") else: bot.send_message(message.chat.id, "Не удалось создать скриншот.") print("Команда /screenshot не удалась: файл скриншота не найден") except Exception as e: bot.send_message(message.chat.id, f"Произошла ошибка: {e}") print(f"Ошибка при выполнении команды /screenshot: {e}") # Команда для отображения всех открытых окон @bot.message_handler(commands=['list_windows']) def list_windows(message): if not check_access(message): return windows = gw.getAllTitles() # Получаем заголовки всех окон windows = [w for w in windows if w] # Убираем пустые строки (иногда бывают скрытые окна) if windows: response = "Открытые окна:\n" for i, window in enumerate(windows): response += f"{i+1}. {window}\n" print(f"Команда /list_windows выполнена: найдено {len(windows)} окон") else: response = "Окна не найдены." print("Команда /list_windows выполнена: окна не найдены") bot.send_message(message.chat.id, response) # Команда для закрытия окна по его индексу @bot.message_handler(commands=['close_window']) def close_window(message): if not check_access(message): return try: # Парсим команду, ожидаем индекс окна index = int(message.text.split()[1]) - 1 # Получаем список окон windows = gw.getAllTitles() windows = [w for w in windows if w] # Закрываем выбранное окно if 0 <= index < len(windows): window = gw.getWindowsWithTitle(windows[index])[0] window.close() bot.send_message(message.chat.id, f"Окно '{windows[index]}' закрыто.") print(f"Команда /close_window выполнена: окно '{windows[index]}' закрыто") else: bot.send_message(message.chat.id, "Неверный индекс окна.") print("Команда /close_window: неверный индекс окна") except (IndexError, ValueError): bot.send_message(message.chat.id, "Пожалуйста, укажите корректный индекс окна. Пример: /close_window 1") print("Ошибка: некорректный индекс для команды /close_window") except Exception as e: bot.send_message(message.chat.id, f"Произошла ошибка: {e}") print(f"Ошибка при выполнении команды /close_window: {e}") # Запускаем бота bot.polling(none_stop=True)

उत्तर

Определяю задачи

Итак, я разбираюсь в коде Telegram бота для улучшения его эффективности и соответствия политикам.

Оцениваю функционал

Код Telegram бота анализирует снимки экрана, список открытых окон и принятие мер для закрытия окон. Он утверждается, что бот предназначен только для владельца компьютера.

Понимание задачи

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

Устанавливаю и настраиваю

Итак, я импортирую библиотеки, создаю бота и настраиваю пользователя. Определяю функции для проверки доступа, снятия и отправки скриншотов, управления окнами и логирования действий.

Анализируя код

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

Использование io.BytesIO и удаление файла 'screenshot.png' помогут сделать процесс более эффективным и удобным.

Устанавливаю инфраструктуру

Я добавляю logging и Telegram интеграции, чтобы контролировать доступ и отправлять нужные данные пользователю. Вот как это начинается.

Использование модулей и улучшение

Окей, я заменяю print на logging для гибкости, переживаю за исключения и правильность команд в /close_window, убираю проверки файла в /screenshot, рефакторю код для читаемости и фильтрую пустые или белые имена окон.

उत्तर

Here's an improved and more efficient version of your code:

python
import telebot import pyautogui import pygetwindow as gw import io import logging # Настройка логирования logging.basicConfig(level=logging.INFO) # Ваш токен от Telegram bot_token = 'Bot_Token' # Замените на токен нужного бота bot = telebot.TeleBot(bot_token) # Укажите ID пользователя, который может управлять ботом allowed_user_id = 123456789 # Замените на ваш реальный Telegram ID # Функция проверки прав доступа def check_access(message): if message.from_user.id != allowed_user_id: bot.send_message(message.chat.id, "У вас нет прав для управления этим ботом.") logging.warning(f"Пользователь {message.from_user.id} попытался выполнить команду, но не имеет прав.") return False return True # Команда для отправки скриншота @bot.message_handler(commands=['screenshot']) def send_screenshot(message): if not check_access(message): return try: # Делаем скриншот и сохраняем в буфер байтов screenshot = pyautogui.screenshot() img_bytes = io.BytesIO() screenshot.save(img_bytes, format='PNG') img_bytes.seek(0) # Отправляем скриншот bot.send_photo(message.chat.id, img_bytes) logging.info("Команда /screenshot выполнена: скриншот отправлен") except Exception as e: bot.send_message(message.chat.id, f"Произошла ошибка: {e}") logging.error(f"Ошибка при выполнении команды /screenshot: {e}") # Команда для отображения всех открытых окон @bot.message_handler(commands=['list_windows']) def list_windows(message): if not check_access(message): return windows = [w for w in gw.getAllTitles() if w.strip()] if windows: response = "Открытые окна:\n" + "\n".join(f"{i}. {w}" for i, w in enumerate(windows, start=1)) logging.info(f"Команда /list_windows выполнена: найдено {len(windows)} окон") else: response = "Окна не найдены." logging.info("Команда /list_windows выполнена: окна не найдены") bot.send_message(message.chat.id, response) # Команда для закрытия окна по его индексу @bot.message_handler(commands=['close_window']) def close_window(message): if not check_access(message): return try: # Парсим команду, ожидаем индекс окна parts = message.text.strip().split() if len(parts) != 2 or not parts[1].isdigit(): raise ValueError("Пожалуйста, укажите корректный индекс окна. Пример: /close_window 1") index = int(parts[1]) - 1 # Получаем список окон windows = [w for w in gw.getAllTitles() if w.strip()] # Закрываем выбранное окно if 0 <= index < len(windows): window = gw.getWindowsWithTitle(windows[index])[0] window.close() bot.send_message(message.chat.id, f"Окно '{windows[index]}' закрыто.") logging.info(f"Команда /close_window выполнена: окно '{windows[index]}' закрыто") else: bot.send_message(message.chat.id, "Неверный индекс окна.") logging.warning("Команда /close_window: неверный индекс окна") except ValueError as ve: bot.send_message(message.chat.id, str(ve)) logging.error(f"Ошибка: {ve}") except Exception as e: bot.send_message(message.chat.id, f"Произошла ошибка: {e}") logging.error(f"Ошибка при выполнении команды /close_window: {e}") # Запускаем бота if __name__ == '__main__': bot.polling(none_stop=True)

Что улучшено:

  1. Использование буфера памяти для скриншотов:

    • Вместо сохранения скриншота на диск, мы сохраняем его в память с помощью io.BytesIO(). Это ускоряет работу и снижает нагрузку на диск.
  2. Модуль logging для логирования:

    • Заменены print на logging, что дает больше контроля над выводом логов и их уровнями важности.
  3. Улучшена обработка ошибок:

    • Добавлены более точные сообщения об ошибках и проверка корректности ввода пользователя.
  4. Повышена читаемость и эффективность кода:

    • Удалены лишние проверки и упрощена логика функций.
    • Использован метод strip() для удаления пробелов и пустых строк из списка окон.
  5. Использование конструкции if __name__ == '__main__'::

    • Обеспечивает правильный запуск бота при импортировании модуля в другие скрипты.
  6. Оптимизация списка окон:

    • Устранено повторное получение списка окон, и улучшена фильтрация пустых заголовков.

Пояснения:

  • Буфер памяти для скриншотов: Использование io.BytesIO() позволяет работать со скриншотами в оперативной памяти, что быстрее и безопаснее.
  • Модуль logging: Позволяет легко менять уровень логирования и выводить сообщения в разных форматах или даже в файлы.
  • Обработка ошибок: Проверка входных данных пользователя помогает избежать неожиданных ошибок и делает бота более стабильным.
  • Конструкция if __name__ == '__main__':: Хорошая практика при написании скриптов на Python, особенно если планируется использовать код в качестве модуля.

Замечание:

  • Не забудьте заменить 'Bot_Token' на реальный токен вашего бота и allowed_user_id на ваш Telegram ID.

इस प्रश्नोत्तर को साझा करें