Введение: зачем нужен бот для управления компьютером
Представьте ситуацию: вы уходите из дома и вдруг вспоминаете, что забыли выключить компьютер. Или вам нужно срочно сделать скриншот рабочего стола коллеги, пока он отошел от монитора. А может быть, вы хотите запустить тяжелую задачу на домашнем ПК, находясь в дороге. Все эти задачи легко решаются с помощью 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, белые списки и переменные окружения для хранения токена.
Дальнейшее развитие может включать: управление файлами, мониторинг ресурсов в реальном времени, выполнение произвольных команд (с осторожностью!), интеграцию с умным домом и многое другое. Возможности ограничены только вашей фантазией!