Немного фона. После того, как Россия начала бомбить гражданскую инфраструктуру Украины, начались проблемы с электричеством. Бывают запланированные и незапланированные отключения электроэнергии, и когда вы находитесь в дороге, вы хотите знать, есть ли электричество дома прямо сейчас, чтобы лучше планировать свое время.
Все, что делает этот бот, — уведомляет вас о том, как долго он работает (команда uptime). Но, конечно, это не главное по сравнению с тем, что вы можете сделать.
В этой статье я использовал роутер RT-AC66U B1 от ASUS, если у вас другой фирмы, скорее всего алгоритм будет другой!
Этот бот был построен «с нуля» за пару часов, написан на Golang, и какие возможности:
- Белый IP нам не понадобится
- Нам не нужно прошивать роутер
- Нет необходимости во внешнем сервере
- Это будет работающий 24/7 бот (при наличии света и интернета)
- Работает по крону, т.е. отвечают раз в минуту, для личного пользования достаточно
Все, что нам понадобится, это роутер и флешка. Вот как это будет выглядеть:
Для начала подготовим телеграм-бота:
- Создайте нового бота через BotFather и сохраните токен
- Получить ID вашего профиля и других пользователей, чтобы бот мог отвечать только вам
Теперь переходим к роутеру.
- Перейти в панель администратора
- Зайдите в настройки «Администрирование»
- Включить SSH-доступ
- Откройте консоль и подключитесь к роутеру
ssh ROUTER_IP -l YOUR_LOGIN
- Я подготовил скрипт для быстрой настройки
https://github.com/oleksiikhr/router-telegram-bot/blob/main/setup.sh
Кратко о том, что здесь происходит.
Все пользовательские данные находятся в виде временных файлов /tmp, это значит, что если вы что-то здесь напишете, они будут удалены после перезагрузки роутера, а при постоянных отключениях — не вариант.
Есть 2 варианта:
- Добавьте файлы на флешку и используйте их оттуда.
- Добавьте файлы внутри /jffs — это единственная папка, которая имеет доступ на запись, и эти файлы не будут удалены после перезагрузки.
Я выбрал второй вариант. Этот скрипт загрузит бинарный файл последней версии (созданный для архитектуры ARM, см. здесь). Затем под своим пользователем добавьте cronjob для запуска этого бинарного файла.
mkdir -p /jffs/telegram wget -O /jffs/telegram/telegrambot https://github.com/oleksiikhr/router-telegram-bot/releases/latest/download/telegrambot chmod +x /jffs/telegram/telegrambot
Но cronjobs также удаляются после каждого перезапуска, флешка поможет нам это обойти. С помощью nvram мы можем добавить собственный скрипт, который будет запускаться каждый раз при подключении внешнего устройства, а также при его отключении.
cat > /jffs/telegram/$USER << EOF * * * * * /jffs/telegram/telegrambot -token $1 -chatIds $2 EOF cat > /jffs/telegram/init.sh << EOF cp /jffs/telegram/$USER /var/spool/cron/crontabs EOF chmod +x /jffs/telegram/init.sh nvram set script_usbmount="/jffs/telegram/init.sh" nvram commit
Поэтому мы создадим еще один скрипт init.sh, который просто переместит наши конфигурации cronjob в папку, где они хранятся в /var/spool/cron/crontabs.
Двигаемся дальше, так как не на всех маршрутизаторах есть curl, мы будем использовать wget.
wget -O - https://raw.githubusercontent.com/oleksiikhr/router-telegram-bot/main/setup.sh > setup.sh sh ./setup.sh API_TOKEN CHAT_IDS
Используйте свои данные вместо API_TOKEN и CHAT_IDS, например:
sh ./setup.sh myToken12345 12345,6789
Бот будет использовать токен myToken12345 и отвечать на 2 чата (пользователей) с идентификаторами 12345 и 6789.
Осталось воткнуть в роутер любую ненужную флешку и оставить там, чтобы скрипт продолжал работать даже после перезагрузки роутера.
Сделанный. Теперь начните чат с ботом /start. После чего он должен вывести сообщение с клавиатурой всех доступных команд, а это /ping.
Если все работает как надо, не забудьте отключить доступ по SSH.
Весь код доступен в репозитории Github: https://github.com/oleksiikhr/router-telegram-bot
Что хотелось бы сказать напоследок, сервер всегда с вами дома и работает 24/7, и даже без перепрошивки можно добиться интересных вещей.
Например, внутри роутера есть интересные логи и данные, можно настроить события, чтобы при подключении нового устройства — уведомлять вас. Или возможность подключить нового пользователя через телеграмм-бота и сохранить эти данные в файл, чтобы бот мог ответить новому пользователю без ручного редактирования.
Но если вам не нужны данные от роутера и у вас белый IP + сервер (хотя бы через cron в Github Actions), то можно реализовать по другому, просто пинговать свой IP.