Оптимизация кода бота
बनाया गया: 6 अक्तूबर 2024
का उपयोग करके उत्तर दिया गया O1 Preview द्वारा Chat01
बनाया गया: 6 अक्तूबर 2024
का उपयोग करके उत्तर दिया गया O1 Preview द्वारा Chat01
make the code better and more efficient.
textimport 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:
pythonimport 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)
Что улучшено:
Использование буфера памяти для скриншотов:
io.BytesIO(). Это ускоряет работу и снижает нагрузку на диск.Модуль logging для логирования:
print на logging, что дает больше контроля над выводом логов и их уровнями важности.Улучшена обработка ошибок:
Повышена читаемость и эффективность кода:
strip() для удаления пробелов и пустых строк из списка окон.Использование конструкции if __name__ == '__main__'::
Оптимизация списка окон:
Пояснения:
io.BytesIO() позволяет работать со скриншотами в оперативной памяти, что быстрее и безопаснее.logging: Позволяет легко менять уровень логирования и выводить сообщения в разных форматах или даже в файлы.if __name__ == '__main__':: Хорошая практика при написании скриптов на Python, особенно если планируется использовать код в качестве модуля.Замечание:
'Bot_Token' на реальный токен вашего бота и allowed_user_id на ваш Telegram ID.