Добавить в корзинуПозвонить
Найти в Дзене
ИИ без страха

Как сделать Telegram-бота, который выполняет команды на ПК (выключение, скриншоты, запуск программ)

Введение: зачем нужен бот для управления компьютером
Представьте ситуацию: вы уходите из дома и вдруг вспоминаете, что забыли выключить компьютер. Или вам нужно срочно сделать скриншот рабочего стола коллеги, пока он отошел от монитора. А может быть, вы хотите запустить тяжелую задачу на домашнем ПК, находясь в дороге. Все эти задачи легко решаются с помощью Telegram-бота, который подключается к

Введение: зачем нужен бот для управления компьютером

Представьте ситуацию: вы уходите из дома и вдруг вспоминаете, что забыли выключить компьютер. Или вам нужно срочно сделать скриншот рабочего стола коллеги, пока он отошел от монитора. А может быть, вы хотите запустить тяжелую задачу на домашнем ПК, находясь в дороге. Все эти задачи легко решаются с помощью Telegram-бота, который подключается к вашему компьютеру и выполняет команды удаленно.

В этой статье мы пошагово создадим такого бота на Python. Он сможет выключать компьютер, делать скриншоты, запускать программы и выполнять другие полезные действия по команде из мессенджера. Для реализации нам понадобится базовое знание Python и немного терпения.

Что потребуется для создания бота

Перед началом работы подготовьте следующее:

Аккаунт в Telegram — для взаимодействия с BotFather

Python 3.7 или выше — язык программирования для написания бота

Библиотеки: python-telegram-bot, Pillow (для скриншотов), psutil (для системных команд)

Доступ к интернету — бот должен постоянно быть онлайн

Установите необходимые библиотеки через pip:

bash

pip install python-telegram-bot Pillow psutil

Создание бота через BotFather

Первый шаг — зарегистрировать нового бота в Telegram. Откройте чат с @BotFather (это официальный бот для создания других ботов).

Отправьте команду /newbot и следуйте инструкциям:

Придумайте имя для вашего бота (например, "PC Controller")

Создайте уникальное username (оно должно заканчиваться на "bot", например, my_pc_controller_bot)

Сохраните полученный токен доступа — это ключевой идентификатор вашего бота

Токен выглядит примерно так: 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz. Никому не показывайте этот токен!

Базовая структура бота

Создайте файл bot.py и напишите базовый код для подключения к Telegram API:

python

/shutdown - выключить компьютер

/reboot - перезагрузить компьютер

/screenshot - сделать скриншот

/lock - заблокировать экран

/run <программа> - запустить программу

/help - показать справку

    """

    await update.message.reply_text(help_text, parse_mode='Markdown')

def main():

    """Запуск бота"""

    application = Application.builder().token(TOKEN).build()

    

    # Добавляем обработчики команд

    application.add_handler(CommandHandler("start", start))

    application.add_handler(CommandHandler("help", start))

    

    logger.info("Бот запущен!")

    application.run_polling(allowed_updates=Update.ALL_TYPES)

if __name__ == '__main__':

    main()

import logging

from telegram import Update

from telegram.ext import Application, CommandHandler, ContextTypes

# Настройка логирования

logging.basicConfig(

    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',

    level=logging.INFO

)

logger = logging.getLogger(__name__)

# Токен вашего бота (получен от BotFather)

TOKEN = "ВАШ_ТОКЕН_ЗДЕСЬ"

# Список разрешенных пользователей (ваш chat_id)

ALLOWED_USERS = [123456789]  # Замените на ваш реальный chat_id

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Команда /start"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    help_text = """

🤖 *PC Controller Bot*

Доступные команды:

Чтобы узнать свой chat_id, отправьте сообщение созданному боту, затем перейдите по ссылке: https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates. В ответе JSON найдите поле "id" внутри объекта "chat".

Реализация функции выключения компьютера

Добавим возможность выключать и перезагружать компьютер. Для этого используем модуль os и platform для определения операционной системы:

python

except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

        logger.error(f"Ошибка при перезагрузке: {e}")

import os

import platform

import subprocess

async def shutdown(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Выключение компьютера"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    try:

        system = platform.system()

        

        if system == "Windows":

            os.system("shutdown /s /t 0")

        elif system == "Linux":

            os.system("sudo shutdown now")

        elif system == "Darwin":  # macOS

            os.system("sudo shutdown -h now")

        

        await update.message.reply_text("✅ Компьютер выключается...")

        

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

        logger.error(f"Ошибка при выключении: {e}")

async def reboot(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Перезагрузка компьютера"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    try:

        system = platform.system()

        

        if system == "Windows":

            os.system("shutdown /r /t 0")

        elif system == "Linux":

            os.system("sudo reboot")

        elif system == "Darwin":  # macOS

            os.system("sudo shutdown -r now")

        

        await update.message.reply_text("🔄 Компьютер перезагружается...")

Не забудьте добавить обработчики этих команд в функцию main():

python

application.add_handler(CommandHandler("shutdown", shutdown))

application.add_handler(CommandHandler("reboot", reboot))

Важно: На Linux и macOS для выполнения команд shutdown/reboot могут потребоваться права суперпользователя. Добавьте своего пользователя в группу sudoers без пароля или используйте polkit.

Создание скриншотов экрана

Одна из самых полезных функций — возможность удаленно делать скриншоты. Используем библиотеку Pillow для захвата изображения экрана:

python

except Exception as e:

        await update.message.reply_text(f"❌ Ошибка при создании скриншота: {str(e)}")

        logger.error(f"Ошибка скриншота: {e}")

from PIL import ImageGrab

import io

async def screenshot(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Сделать скриншот экрана"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    try:

        await update.message.reply_text("📸 Делаю скриншот...")

        

        # Захватываем изображение всего экрана

        screenshot = ImageGrab.grab()

        

        # Сохраняем в буфер памяти

        buffer = io.BytesIO()

        screenshot.save(buffer, format='PNG')

        buffer.seek(0)

        

        # Отправляем фото пользователю

        await update.message.reply_photo(photo=buffer, caption="📸 Скриншот готов!")

        

        logger.info("Скриншот успешно отправлен")

Добавьте обработчик:

python

application.add_handler(CommandHandler("screenshot", screenshot))

Если у вас несколько мониторов и нужно сделать скриншот конкретного, можно использовать:

python

# Скриншот определенной области (x1, y1, x2, y2)

screenshot = ImageGrab.grab(bbox=(100, 100, 1920, 1080))

Блокировка экрана

Иногда нужно быстро заблокировать компьютер, чтобы никто не получил доступ к вашим данным:

python

async def lock_screen(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Блокировка экрана"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    try:

        system = platform.system()

        

        if system == "Windows":

            # Использование rundll32 для блокировки Windows

            subprocess.run(["rundll32.exe", "user32.dll,LockWorkStation"])

        elif system == "Linux":

            # Для GNOME

            os.system("dbus-send --session --type=method-call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock")

        elif system == "Darwin":  # macOS

            os.system("/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession -suspend")

        

        await update.message.reply_text("🔒 Экран заблокирован!")

        

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

        logger.error(f"Ошибка блокировки: {e}")

Добавьте обработчик:

python

application.add_handler(CommandHandler("lock

Запуск программ по команде

Часто возникает необходимость запустить определенную программу удаленно. Реализуем команду /run, которая принимает название программы как аргумент:

python

try:

        # Ищем программу в белом списке

        if program_name.lower() in allowed_programs:

            program_path = allowed_programs[program_name.lower()]

            

            # Запускаем программу

            if platform.system() == "Windows":

                subprocess.Popen(program_path)

            else:

                subprocess.Popen([program_path], shell=True)

            

            await update.message.reply_text(f"✅ Программа '{program_name}' запущена!")

            logger.info(f"Запущена программа: {program_name}")

        else:

            await update.message.reply_text(

                f"❌ Программа '{program_name}' не в белом списке!\n"

                f"Разрешенные программы: {', '.join(allowed_programs.keys())}"

            )

            

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка запуска: {str(e)}")

        logger.error(f"Ошибка запуска программы: {e}")

async def run_program(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Запуск программы"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

    # Проверяем наличие аргумента

    if not context.args:

        await update.message.reply_text("❌ Укажите название программы!\nПример: /run notepad")

        return

    

    program_name = ' '.join(context.args)

    

    # Белый список разрешенных программ для безопасности

    allowed_programs = {

        'notepad': 'notepad.exe',

        'calc': 'calc.exe',

        'chrome': 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',

        'firefox': 'C:\\Program Files\\Mozilla Firefox\\firefox.exe',

        'vscode': 'C:\\Users\\YourUsername\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe',

        'spotify': 'C:\\Users\\YourUsername\\AppData\\Roaming\\Spotify\\Spotify.exe',

    }

    

Добавьте обработчик:

python

application.add_handler(CommandHandler("run", run_program))

Важно: Всегда используйте белый список программ! Это защитит ваш компьютер от выполнения вредоносных команд.

Получение информации о системе

Добавим полезную команду для получения информации о компьютере:

python

try:

        # Получаем информацию о системе

        cpu_percent = psutil.cpu_percent(interval=1)

        memory = psutil.virtual_memory()

        disk = psutil.disk_usage('/')

        boot_time = datetime.datetime.fromtimestamp(psutil.boot_time())

        uptime = datetime.datetime.now() - boot_time

        

        info_text = f"""

💻 *Информация о системе*

🔹 *Процессор:* {cpu_percent}% загрузки

🔹 *RAM:* {memory.percent}% использовано ({memory.used/1024/1024/1024:.1f} GB / {memory.total/1024/1024/1024:.1f} GB)

🔹 *Диск:* {disk.percent}% использовано

🔹 *Аптайм:* {uptime.days} дней, {uptime.seconds // 3600} часов

🔹 *ОС:* {platform.system()} {platform.release()}

        """

        

        await update.message.reply_text(info_text, parse_mode='Markdown')

        

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

        logger.error(f"Ошибка получения информации: {e}")

import psutil

import datetime

async def system_info(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Информация о системе"""

    user_id = update.effective_user.id

    

    if user_id not in ALLOWED_USERS:

        await update.message.reply_text("Доступ запрещен!")

        return

    

Добавьте обработчик:

python

application.add_handler(CommandHandler("info", system_info))

Безопасность: защита от несанкционированного доступа

Безопасность — критически важный аспект при создании бота для управления компьютером. Вот основные меры защиты:

1. Проверка chat_id

Всегда проверяйте, кто отправляет команды:

python

if user_id not in ALLOWED_USERS:

    await update.message.reply_text("Доступ запрещен!")

    return

2. Хранение токена в переменных окружения

Никогда не храните токен прямо в коде. Используйте переменные окружения:

python

import os

TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')

ALLOWED_USERS = [int(id) for id in os.getenv('ALLOWED_USERS', '').split(',')]

Запустите бот с переменными окружения:

bash

export TELEGRAM_BOT_TOKEN="your_token_here"

export ALLOWED_USERS="123456789

3. Белый список программ

Как показано выше, всегда используйте белый список для запускаемых программ.

4. Логирование действий

Ведите журнал всех выполненных команд:

python

logger.info(f"Пользователь {user_id

5. Двухфакторная аутентификация

Для критических операций (выключение, форматирование) можно добавить подтверждение:

python

# Создаем словарь для хранения ожидающих подтверждений

pending_confirmations = {}

async def confirm_shutdown(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Подтверждение выключения"""

    user_id = update.effective_user.id

    confirmation_code = context.args[0] if context.args else None

    

    if confirmation_code and confirmation_code in pending_confirmations:

        if pending_confirmations[confirmation_code] == user_id:

            del pending_confirmations[confirmation_code]

            # Выполняем выключение

            os.system("shutdown /s /t 0")

            await update.message.reply_text("✅ Выключение подтверждено!")

        else:

            await update.message.reply_text("❌ Неверный код подтверждения!")

    else:

        await update.message.reply_text("❌ Неверный или истекший код!")

Автозапуск бота при старте системы

Чтобы бот работал постоянно, настройте его автозапуск.

Для Windows:

Нажмите Win + R, введите shell:startup

Создайте ярлык для скрипта Python

Или используйте Task Scheduler для более надежного запуска

Для Linux:

Создайте systemd service файл /etc/systemd/system/telegram-bot.service:

ini

[Unit]

Description=Telegram PC Controller Bot

After=network.target

[Service]

Type=simple

User=your_username

WorkingDirectory=/home/your_username/bot

Environment=TELEGRAM_BOT_TOKEN=your_token

Environment=ALLOWED_USERS=123456789

ExecStart=/usr/bin/python3 /home/your_username/bot/bot.py

Restart=always

RestartSec=10

[Install]

WantedBy=multi-user.target

Активируйте сервис:

bash

sudo systemctl enable telegram-bot.service

sudo systemctl start

Расширенные возможности

Вот несколько идей для улучшения функционала бота:

1. Управление файлами

python

async def list_files(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Список файлов в директории"""

    path = ' '.join(context.args) if context.args else '.'

    

    try:

        files = os.listdir(path)

        file_list = '\n'.join(files[:20])  # Ограничиваем вывод

        await update.message.reply_text(f"📁 Файлы в {path}:\n{file_list}")

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

2. Мониторинг процессов

python

async def processes(update: Update, context: ContextTypes.DEFAULT_TYPE):

    """Список запущенных процессов"""

    try:

        processes = []

        for proc in psutil.process_iter(['pid', 'name', 'memory_percent']):

            try:

                processes.append(f"{proc.info['pid']} - {proc.info['name']} ({proc.info['memory_percent']:.1f}%)")

            except (psutil.NoSuchProcess, psutil.AccessDenied):

                pass

        

        # Показываем топ-10 процессов по использованию памяти

        processes.sort(key=lambda x: float(x.split('(')[-1].replace('%)', '')), reverse=True)

        top_processes = '\n'.join(processes[:10])

        

        await update.message.reply_text(f"🔝 Топ процессов по RAM:\n{top_processes}")

    except Exception as e:

        await update.message.reply_text(f"❌ Ошибка: {str(e)}")

3. Уведомления о событиях

Бот может отправлять уведомления, когда происходит определенное событие:

python

import threading

import time

def monitor_cpu():

    """Фоновый мониторинг CPU"""

    while True:

        cpu_percent = psutil.cpu_percent(interval=5)

        if cpu_percent > 90:

            # Отправляем предупреждение всем разрешенным пользователям

            for user_id in ALLOWED_USERS:

                try:

                    application.bot.send_message(

                        chat_id=user_id,

                        text=f"⚠️ Высокая нагрузка на CPU: {cpu_percent}%"

                    )

                except:

                    pass

        time.sleep(60)

# Запускаем мониторинг в отдельном потоке

monitor_thread = threading.Thread(target=monitor_cpu, daemon=True)

monitor_thread.start()

Полный код бота

Вот полный рабочий пример бота со всеми рассмотренными функциями:

python

application.run_polling(allowed_updates=Update.ALL_TYPES)

if __name__ == '__main__':

    main()

Заключение

Мы создали полнофункционального Telegram-бота для удаленного управления компьютером. Теперь вы можете:

Выключать и перезагружать ПК

Делать скриншоты экрана

Запускать программы из белого списка

Получать информацию о системе

Блокировать экран

Этот бот особенно полезен для системных администраторов, разработчиков и всех, кто хочет иметь удаленный доступ к своему компьютеру. Помните о безопасности: всегда используйте проверку chat_id, белые списки и переменные окружения для хранения токена.

Дальнейшее развитие может включать: управление файлами, мониторинг ресурсов в реальном времени, выполнение произвольных команд (с осторожностью!), интеграцию с умным домом и многое другое. Возможности ограничены только вашей фантазией!