Недавно проснулась идея как-то интересно использовать API Вконтакте для интернет-радиостанции. Недолго думая, вспомнил, как в старой доброй Аське (icq) люди в статусе рассказывали, что они сейчас слушают. В своё время даже Я пользовался такими плагинами. Но сейчас не об этом.
Возможно, многие подумают, что это никому неинтересно и бессмысленно. Но кому-то надеюсь это пригодится.
Начну с конца, покажу, как оно всё работает.
В моём статусе во Вконтакте раз в 2 минуты автоматически обновляется статус о том, что происходит на Радиостанции. И выглядит всё именно так:
Для этого мне понадобился сервер с 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 приложение (получаем смс для подтверждения, называем его как-нибудь):
-Теперь лезем в настройки, смотрим ID приложения и указываем адресс сайта Open API (где будем хранить следующий файлик с запросом)
После этого начинаем делать сам запрос к 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 выглядит это примерно так:
Ну вот и всё.
P.S. Access_token в примере сгенерирован беспорядочным нажатием по клавишам.
Автор: Gudson