Привет! Сегодня я расскажу про то, как можно включать свой домашний компьютер из любой точки планеты. В каких случаях это может пригодиться? Ну например, если Вы забыли что-то важное на своем ПК, например файл отправить кому-то. Ну или например хочется что-то скачать, пока едете домой, а комп выключен. Таких сценариев довольно много. Так вот, ближе к делу.
Чтобы все заработало нам понадобится:
- Компьютер с поддержкой WakeOnLan (включается через BIOS, если это поддерживается материнской платой)
- Какой-нибудь девайс, подключенный к той же сети, что и компьютер. (В моем случае это роутер с кастомной прошивкой, но можно использовать любой компьютер, ноутбук, Raspberry Pi, какой-нибудь NAS, в общем-то что угодно, где есть сетевой интерфейс и python)
Итак, предположим, что у нас уже есть некий девайс, на котором установлен Python 3. Если нет, устанавливаем командой:
sudo apt-get install python3.7 python3-pip
Теперь нам понадобится установить библиотеку PyTelegramBotAPI:
pip install pytelegrambotapi
Находим в телеграме @BotFather, говорим ему, что хотим создать бота (/start или /newbot). Даем нашему боту имя, получаем токен бота (самая важная часть). Возвращаемся к нашему девайсу с Питоном и пишем вот такой простенький скрипт:
import telebot # подключение библиотеки pyTelegramBotAPI
import logging # библиотека журнала
# для запуска скриптов
from subprocess import call
# настройки для журнала
logger = logging.getLogger('log')
logger.setLevel(logging.INFO)
fh = logging.FileHandler('telegramBot.log')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s | %(levelname)-7s | %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
# создание бота с его токеном API
bot = telebot.TeleBot("ТокенВашегоБота")
chat_id = "ВашUserID"
# Разрешенный user-id
my_user_id = ВашUserID
# текст справки
help_string = []
help_string.append("Это мой домашний минибот.\n\n")
help_string.append("/start - выводит приветствие;\n")
help_string.append("/help - отображает эту справку;\n")
help_string.append("/router - присылает статус девайса;\n")
help_string.append("/powerpc- включает домашний компьютер.")
# --- команды
@bot.message_handler(commands=['start']) #Отвечаем на команду /start
def send_start(message):
# отправка простого сообщения
to_check_id = message.from_user.id #Получаем user-id пользователя, который обратился к нашему боту
if to_check_id == my_user_id: #Проверяем, совпадает ли этот user-id с тем, которому мы доверяем
response_message = "Привет, я домашний минибот! Отправьте мне /help для вывода справки."
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
bot.reply_to(message, response_message)
@bot.message_handler(commands=['help']) #Отвечаем на команду /help
def send_help(message):
# отправка сообщения с поддержкой разметки Markdown
to_check_id = message.from_user.id
if to_check_id == my_user_id:
bot.send_message(chat_id, "".join(help_string), parse_mode="Markdown")
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
@bot.message_handler(commands=['stats']) #Отвечаем на команду /stats
def send_router(message):
to_check_id = message.from_user.id
if to_check_id == my_user_id:
try:
# по этому пути лежит скрипт сбора информации по статусам девайса
call(["/opt/etc/telegrambot/statustotelegram.sh"])
# читает файл с результатами выполнения скрипта
status = open("/opt/etc/telegrambot/statustotelegram.txt", "rb").read()
bot.send_message(chat_id, status, parse_mode="Markdown")
except Exception as e:
logger.exception(str(e))
bot.send_message(chat_id, "Ошибка при получении статуса роутера. Подробности в журнале.")
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
@bot.message_handler(commands=['powerpc']) # Отвечаем на команду /powerpc
def send_wakepc(message):
to_check_id = message.from_user.id
if to_check_id == my_user_id:
try:
# тут скрипт включения компа
call(["/opt/etc/telegrambot/powerpc.sh"])
# пишем что команда выполнена
bot.send_message(chat_id, "Команда выполнена!")
except Exception as e:
logger.exception(str(e))
bot.send_message(chat_id, "Ошибка при выполнении скрипта. Подробности в журнале.")
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
# запуск приёма сообщений
bot.polling()
Там где написано ТокенВашегоБота соответственно прописать токен.
Там где написано ВашUserID соответственно прописать userID, который нужно получить например следующим образом:
Просто поменяем пару строчек кода.
@bot.message_handler(commands=['start']) # Отвечаем на команду /start
def send_start(message):
# отправка простого сообщения
to_check_id = message.from_user.id # Получаем user-id пользователя, который обратился к нашему боту
if to_check_id == to_check_id: # Проверка always TRUE
response_message = "to_check_id" # Просто получаем в ответе от бота ВашUserID
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
bot.reply_to(message, response_message)
После того, как Вы получили ВашUserID не забудьте вернуть обратно внесенные изменения в код телеграм бота.
Проверка UserID нужна для ограничения доступа к Вашему боту.
Мы же не хотим, чтобы кто-то включал Ваш компьютер, правда?
Если Вы попробуете написать Вашему боту из другого аккаунта телеграм, то Бот не будет слушать отправленные ему команды.
А вот так будет выглядеть наш скрипт включения компьютера:
#!/bin/bash
ether-wake -i br0 MacАдресВашегоПК
(Мак адрес пишем того сетевого интерфейса, который проводом подключен к сети)
br0 - тот сетевой интерфейс девайса, который ведет к компьютеру.
Сохраняем с именем powerpc.sh вот по этому пути /opt/etc/telegrambot/powerpc.sh (ну или в любой другой, но не забудьте поменять путь в telegrambot.py)
Перед тем как запускать наш бот лучше прям протестировать работает ли powerpc.sh просто выполнив это в командной строке. Бонус! Вот таким образом можно собирать небольшую статистику вашего девайса, на котором работает бот. (если там линукс) Вот тут мы ждем команду для запуска скрипта по сбору статистики:
@bot.message_handler(commands=['stats']) #Отвечаем на команду /stats
def send_router(message):
to_check_id = message.from_user.id
if to_check_id == my_user_id:
try:
# по этому пути лежит скрипт сбора информации по статусам девайса
call(["/opt/etc/telegrambot/statustotelegram.sh"])
# читает файл с результатами выполнения скрипта
status = open("/opt/etc/telegrambot/statustotelegram.txt", "rb").read()
bot.send_message(chat_id, status, parse_mode="Markdown")
except Exception as e:
logger.exception(str(e))
bot.send_message(chat_id, "Ошибка при получении статуса роутера. Подробности в журнале.")
else:
response_message = "Ты кто такой? Я тебя не знаю, уходи."
Вот тут сам скрипт сбора статистики:
#!/bin/bash
info_cpu="*CPU*
----------------------
$(cat /proc/loadavg | awk '{print $2" of 100 percents; running processes: "$4}')
"
info_ram="*RAM*
----------------------
Free: $(free -m | grep Mem | awk '{print $4 * 0.001 "MB of " $2 * 0.001 "MB total." $4 * 100 / $2 "% free"}')
"
info_hdd="*HDD*
----------------------
$(df /dev/sda1 -h | grep /dev/sda1 | awk '{print "Free: "$4". Used: "$5"%"}')
"
text=$(printf "$info_cpu$info_ram$info_hdd")
printf '%s\n' "$text" > /opt/etc/telegrambot/statustotelegram.txt
А вот в этот файл (/opt/etc/telegrambot/statustotelegram.txt) он будет записывать результат опроса, который потом передается в телеграм.
Приятного пользования =)