Немного фона. После того, как Россия начала бомбить гражданскую инфраструктуру Украины, начались проблемы с электричеством. Бывают запланированные и незапланированные отключения электроэнергии, и когда вы находитесь в дороге, вы хотите знать, есть ли электричество дома прямо сейчас, чтобы лучше планировать свое время.

Все, что делает этот бот, — уведомляет вас о том, как долго он работает (команда 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 варианта:

  1. Добавьте файлы на флешку и используйте их оттуда.
  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.