Регулярная проверка радиостанции (Телеграм бот)

July 11, 2019

Что делать, если радио выключилось? Допустим, наш сервер работает как часы, а вот хост, который отправляет аудиопоток через Icecast, внезапно выключился. В моём случае это может быть вызвано, например, сбоями в сети у меня дома, где стоит Raspberry Pi, с которого играет музыка.

В конфиг-файле нашей радиостанции есть опция fallback-mount, которая срабатывает при отсутствии сигнала от хоста. Если по какой-то причине выключен компьютер, с которого идёт поток, на радио играет заглушка. Тут может быть всё, что угодно, от мелодии с голосовым сопровождением, поясняющим, что на радио временные неполадки, до музыки из лифта. Но пока мы не зайдём в панель управления или не решим послушать радио, оно будет тихо отдыхать. Тут мне поможет телеграм-бот.

Такой бот может отправлять как личные сообщения, так и публикации в канал (если в канале боту дан доступ к публикациям). Бот написан на php, и его необходимо расположить на заграничном сервере, потому что по сути он будет делать обычный http запрос, а https://api.telegram.org/ заблокирован на территории РФ. Могу порекомендовать https://www.000webhost.com/ в качестве бесплатного хостинга файлов. 

Простой скрипт для отправки сообщения в чат посредством перехода по ссылке на .php файл я описал в этом посте.

Осталось доработать код, чтобы бот взял информацию из json файла со статусом нашей станции, проверить его и отправить сообщение. Будем считать, что наша радиостанция находится по адресу http://192.168.0.1:8000/radio

Так выглядит наш файл check.php:

<?php 
$file = file_get_contents("http://192.168.0.1:8000/json.xsl"); //Читаем файл
$string = substr($file, 11, -7); //Отбрасываем ненужные символы. Колхоз, но работает 
$radio = json_decode($string, true); //Декодинг в JSON

$checkTitleRadio = ($radio["/radio"]["title"]);

if ($checkTitleRadio == "") {
    $message = "Radio is off!";
}
$botToken = "ВАШТОКЕН";
$chat_id = "-0123456789";
$bot_url    = "https://api.telegram.org/bot$botToken/";
$url = $bot_url."sendMessage?chat_id=".$chat_id."&text=".urlencode($message);
file_get_contents($url);
?>

Если у играющей на радио композиции нет названия, в 99% случаев радио не работает. Даже если оно работает, это хороший повод проверить, почему названия нет. Именно поэтому проверка проходит по пустому названию.

Таким образом, при переходе на domain.com/check.php срабатывает скрипт, и если радио не работает - бот об этом сообщит.

Теперь можно настроить скрипт в планировщике. Можно использовать бесплатные сервисы вроде http://cronjobs.co/, можно включить скрипт во встроенный планировщик в панели управления сервером (например ISPmanager), а можно настроить cron job на сервере вручную. Об этом как-нибудь в другой раз.

Команда простая: curl http://domain.com/check.php

В моём случае стоит ISPmanager, и дважды в день он проверяет, работает ли радио.