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

创建于:2024年10月6日

使用 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.

分享这个问答