Рассказываем друзьям в статусе во Вконтакте о текущей композиции на интернет-радиостанции (icecast2)

в 12:11, , рубрики: cron, icecast2, php, Песочница, статус, метки: , , , , ,

Недавно проснулась идея как-то интересно использовать API Вконтакте для интернет-радиостанции. Недолго думая, вспомнил, как в старой доброй Аське (icq) люди в статусе рассказывали, что они сейчас слушают. В своё время даже Я пользовался такими плагинами. Но сейчас не об этом.
Возможно, многие подумают, что это никому неинтересно и бессмысленно. Но кому-то надеюсь это пригодится.

Начну с конца, покажу, как оно всё работает.

В моём статусе во Вконтакте раз в 2 минуты автоматически обновляется статус о том, что происходит на Радиостанции. И выглядит всё именно так:
Рассказываем друзьям в статусе во Вконтакте о текущей композиции на интернет радиостанции (icecast2)

Для этого мне понадобился сервер с icecast2 (а точнее доступ к веб-интерфейсу), cron-планироващик (в моём примере буду показывать, как это выглядит в панели ISPmanager lite и немного PHP.

А теперь всё по-порядку:
1) Нужно сделать скрипт, который будет собирать информацию с веб-интерфейса icecast2 (по умолчанию, расположенном по адрессу IP_adress:8000).
Файлик я назвал stat.php

<?php
header('Content-type:text/html; charset=utf-8');

$icecast_url='http://127.0.0.1:8000';

$output = file_get_contents($icecast_url);

$search='#<div class="newscontent">.*?Point /(.*?)<.*?href="(.*?)">M3U<.*?Listeners.*?class="streamdata">(.*?)<.*?Song:.*?class="streamdata">(.*?)<.*?</div>#si';
preg_match_all($search, $output, $matches);

$j=count($matches[0]);
for ($i=0;$i<$j; $i++) {

    $point_name=$matches[1][$i];
    $pount_m3u=$icecast_url.$matches[2][$i];
    $point_listners_count=$matches[3][$i];
    $point_current_song=$matches[4][$i];
//
    //echo 'mount point: <b>'.$point_name.'</b><br>';
    //echo 'm3u: <a href="'.$pount_m3u.'">'.$pount_m3u.'</a><br>';
    //echo 'listners_count: <b>'.$point_listners_count.'</b><br>';
	$string = $point_current_song;
$string = iconv('utf-8', 'cp1252', $string);
$string = iconv('cp1251', 'utf-8', $string);
echo $string;
	
}

?>

Я использовал уже готовый код, который расположен на github gist.github.com/OrangeFox/1706904
Закомментировал Я то, что мне в статусе не пригодится. А именно: название точки монтирования /mount, ссылку к m3u файлу и количество слушателей. Но и без отсебятины не обошлось. Как известно, icecast2 не дружит с кириллицей, и эту проблему нужно было решить. Как видно выше, я добавил 2 строки, которые решили эту проблему:

$string = iconv('utf-8', 'cp1252', $string);
$string = iconv('cp1251', 'utf-8', $string);

В моём случае скрипт выводит только название композиции, которая на данный момент проигрывается на радио. Дабы не возникло дальше вопросов, версия icecast2 у меня 2.3.2.

Если здесь у Вас всё работает, и stat.php действительно выводит название текущей композиции, то идём дальше.

2) Теперь самое интересное. Нам нужно выведенное в stat.php название композиции передать в свой статус во Вконтакте.
Для этого мне понадобился метод status.set. Документацию можно почитать здесь.
Прежде чем приступить к написанию запроса, нужно немного пошаманить. А точнее создать собственное standalone приложение, у которого мы получим свой access_token для доступа к статусу через API.

Тут тоже ничего сложного нет.

-Заходим в раздел разработчикам

-Создаём Standalone приложение (получаем смс для подтверждения, называем его как-нибудь):
Рассказываем друзьям в статусе во Вконтакте о текущей композиции на интернет радиостанции (icecast2)

-Теперь лезем в настройки, смотрим ID приложения и указываем адресс сайта Open API (где будем хранить следующий файлик с запросом)
Рассказываем друзьям в статусе во Вконтакте о текущей композиции на интернет радиостанции (icecast2)

После этого начинаем делать сам запрос к API. Выглядит он примерно так: https://api.vkontakte.ru/method/status.set?text=##ТЕКСТ##&access_token=#ПОЛУЧЕННЫЙ_ACCESS_TOKEN##
Но для начала нам нужно получить тот самый токен (иначе говоря, получить право изменения статуса с помощью нашего standalone приложения)
А для этого нужно ввести в адрессную строку вот такую ссылку:
https://oauth.vk.com/authorize?client_id=IDприложения&redirect_uri=http://api.vk.com/blank.html&scope=status,offline&display=page&response_type=token
Где client_id= наш ID приложения
scope=status,offline — какие права нам нужно получить (в данном случае нужно получить доступ к статусу с помощью status и доступ к API в любое время со стороннего сервера с помощью offline), подробнее можно почитать здесь.

После перехода по нужной нам ссылке, появится окошко, где Вам скажут: Приложение запрашивает доступ к Вашему аккаунту. И перечислит, какие именно права вы даёте приложению. Мы всё ему разрешаем и видим такую картину:
1. Предупреждение: Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту. (отнеситесь к этому серьезно, не публикуйте ваш token)
2. В адрессной строке мы видим адресс: http://api.vk.com/blank.html#access_token=54dassa4d5sadsa4dsa6d5sa4d6sadsa4d5sa5s4ds5a6dsa5d4s5a6d8489ad84sad&expires_in=0&user_id=0000000
Но со всего адресса нам нужна только вот эта часть: access_token=54dassa4d5sadsa4dsa6d5sa4d6sadsa4d5sa5s4ds5a6dsa5d4s5a6d8489ad84sad Это и есть полученный нами token

И вот мы подошли к предпоследнему шагу, а именно делаем сам скрипт запроса, который я обозвал status.php

<?php
//https://oauth.vk.com/authorize?client_id=1&redirect_uri=http://api.vk.com/blank.html&scope=status,offline&display=page&response_type=token 
//пример получения токена.
//client_id=ID нашего desktop приложения, которому вы разрешаете доступ к вашему статусу
//scope= какие права мы разрешаем. В нашем случае status - доступ к обновлению Вашего статуса, offline - доступ к API в любое время 
$token='54dassa4d5sadsa4dsa6d5sa4d6sadsa4d5sa5s4ds5a6dsa5d4s5a6d8489ad84sad'; //access token 

$content = file_get_contents("http://адресс,_где_расположен_stat.php/stat.php"); //получаем исходный код на странице со статусом текущей песенки

$text= "Сейчас в эфире  ".$content; //текст, который уйдёт в статус
$text=urlencode($text); //преобразовываем текст в формат для url
$sRequest = "https://api.vkontakte.ru/method/status.set?text=$text&access_token=$token"; 
echo $text; //Выведем полученый в статусе текст
// ответ от Вконтакте
$oResponce = json_decode(file_get_contents($sRequest));
?>

Если Вы сделали всё правильно, то при переходе по ссылке http://yourdomen.ru/status.php ваш статус во Вконтакте обновится.
Но ведь неинтересно каждый раз самому его обновлять, тогда смысла в этом всём точно нет. И тут я использовал cron-планировщик.

Команда: /usr/bin/wget -O /dev/null http://yourdomen.ru/status.php — запускаем скрипт
Период: каждые две минуты, */02 * * * * — запускаем его каждые две минуты

В ISPmanager Lite выглядит это примерно так:

Рассказываем друзьям в статусе во Вконтакте о текущей композиции на интернет радиостанции (icecast2)
Ну вот и всё.
P.S. Access_token в примере сгенерирован беспорядочным нажатием по клавишам.

Автор: Gudson

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js