Pull to refresh

PHP Поиск музыки с использованием Vkontakte-API

Пациент

Всем известно, что вконтакте набрал такую популярность, в первую очередь благодаря огромной базе медиа-файлов, которые на 101% нарушают все авторские права. В общем получается такая лакомная файло-помойка, в которой можно найти практически любую музыку. Так давайте же приложим и свою руку к этому кусочку, и попробуем урвать себе эти файлики. Писать будем поиск по базе mp3-файлов вконтакте, с использованием PHP.

Диагностика

Задачу мы поставили, теперь надо определится с возможными способами её решения. Предполагается что аккаунт вконтакте у нас уже есть, если нет, то нужно зарегистрировать.

Способ поиска №1

  • Суть заключается в том, что мы будем эмулировать работу браузера, т.е. авторизуемся, открываем страницу поиска музыки.
  • Отправляем запрос на поиск
  • Парсим регулярками полученный HTML-документ и получаем результат

Плюсы
(+) — практически нет.
Минусы
(-) — Сложность авторизации, эмуляция работы с cookies.
(-) — Большое количество лишних HTTP-запросов.
(-) — Большой размер данных для парсинга (150Кб HTML-страница с результатами поиска), и привязка к дизайну страницы (достаточно ВК сменить структуру страниц,
и поиск сломался бы).
(-) — Можем получить лишь 100 треков за раз, чтобы получить больше, нужно делать переходы по страницам + парсинг, что опять же лишние HTTP-запросы.

Способ поиска №2 (правильный)

  • Суть заключается в том, что мы будем использовать VK-API для flash-приложений.
  • Отправляем специально сформированный запрос API, и получаем готовый ответ в формате XML или JSON который разбирается на раз-два.

Плюсы
(+) — Не требуется авторизация вконтакте, но аккаунт всё-же понадобится.
(+) — Экономичность способа (мало запросов + лёгкие ответы).
(+) — XML/JSON легко разбирать, размер ответа маленький.
(+) — Можно задать любое количество возвращаемых результатов (1-100-1000...).
(+) — Использование API вполне легально, а за грабинг способом №1 вполне могут и забанить.
Минусы
(-) — Небольшая сложность в освоении API
(-) — Лимиты на число запросов к API в секунду (если работать в тестовом режиме)

Закатаем рукава

  1. Авторизуемся вконтакте, и создаём новое приложение на странице vkontakte.ru/apps.php?act=add. Тип: Flash/Iframe приложение, заполняем описание и выбираем категорию.



  2. После создания приложения, идём на vkontakte.ru/apps.php, находим своё приложение. Щёлкаем на «настроить приложение» и даём приложению полный доступ.



    Далее жмём "Редактировать -> Настройки", тут нам нужны 2 поля «ID-приложения» и «ключ приложения», так же нужно знать ID своего аккаунта, который можно посмотреть в разделе «Настройки» вашего профиля).

    image

  3. Заходим в документации по API. Нас интересует метод audio.search vkontakte.ru/developers.php?o=-1&p=audio.search. Читаем внимательно и переходим к кодобреду

<span style="color: black; font-family: "Courier New"; font-size: x-small;">
  1. <?php
  2. /*
  3. Предположим у нас есть форма поиска, которая передаёт переменную $query методом GET
  4. Наша задача принять эту переменную, и подготовить к отправке
  5. */
  6. $query = isset($_GET['query']) ? $query = urldecode($_GET['query']) : '';
  7.  
  8. /*
  9. Если ваши страницы не в кодировке UTF-8 а в CP1251,
  10. то строку поиска нужно сконвертировать в UTF-8
  11. */
  12. $query = iconv('cp1251', 'utf-8', $query);
  13.  
  14. /*
  15. Создадим массив с нужными для работы приложения переменными
  16. Так же можно задать параметры касающиеся сортировки и текста к песне
  17. */
  18. $set_vk = array(
  19.   'vk_key' => 'ТУТВАШКЛЮЧ', //ключ приложения
  20.   'vk_l' => '0000000', //ID вашего аккаунта
  21.   'api_id' => '000000', //ID приложения
  22.   'count_results' => 150, //Сколько возвращать результатов
  23. );
  24.  
  25. /*
  26. Уникальная сигнатура запроса, согласно API
  27. */
  28. $sig_vk = md5(
  29.   $set_vk['vk_l'].'api_id='.$set_vk['api_id'].'count='.$set_vk['count_results']
  30.   .'lyrics=0method=audio.searchoffset=0q='.$query.'sort=0test_mode=1v=2.0'.$set_vk['vk_key'];
  31. );
  32.  
  33.  
  34. //Делаем POST-запрос к API, передавая подготовленные параметры
  35. $xml_response = Send_Post(
  36.   'http://api.vkontakte.ru/api.php',
  37.   'api_id='.$set_vk['api_id'].'&count='.$set_vk['count_results'].''.
  38.   '&lyrics=0&method=audio.search&offset=0&q='.$query.'&sort=0&test_mode=1&v=2.0&sig='.$sig_vk,
  39.   'http://vkontakte.ru/app'.$set_vk['api_id'].'_'.$set_vk['api_id'].''
  40. );
  41.  
  42. if(empty($xml_response))
  43. {
  44.   //API не дал ответа  
  45. }
  46. else
  47. {
  48.   //Парсим XML-ответ и получаем объект с результатами поиска
  49.   $parse = simplexml_load_string($xml_response);
  50.   
  51.   //Полученый ответ можно обрабатывать как нам уже угодно
  52.   
  53.   //Распечатать объект для изучения
  54.   echo ''</span>;</li> <li>  print_r($parse);    </li> <li>  echo <span style="color: #a31515;">''; 
  55.   
  56.   //Или пройтись в цикле и выполнить некое действие
  57.   //Вывести Артист - Название (продолжительность) и ссылку на скачку файла
  58.   foreach($parse->audio as $key => $val)
  59.   {
  60.     echo $val->artist.' - '.$val->title.' ('.date('i:s', (int)$val->duration).')'."\n";
  61.     echo $val->url."\n\n";
  62.   }
  63. }
  64. ?>



<span style="color: black; font-family: "Courier New"; font-size: x-small;">
  1. <?php
  2. /*
  3. Функция для отправки POST-запросов с использованием Curl
  4. */
  5.  
  6. function Send_Post($post_url, $post_data, $refer)
  7. {
  8.   $ch = curl_init();
  9.   curl_setopt($ch, CURLOPT_URL, $post_url);
  10.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  11.   curl_setopt($ch, CURLOPT_REFERER, $refer);
  12.   curl_setopt($ch, CURLOPT_POST, 1);
  13.   curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  14.   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  15.   curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00');
  16.  
  17.   $data = curl_exec($ch);
  18.   curl_close($ch);
  19.   return $data;
  20. }
  21. ?>




Чтобы всё это работало нам понадобится PHP5, CURL, SimpeXML-модуль.
Не забудьте вписать свои данные в массив $set_vk.

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

Важные заметки:
1. Ссылка на скачивание которые возвращаются в ответе, привязаны к IP того, кто делал запрос на поиск, в данном случае это IP вашего сервера. Соответственно файлы по этим ссылкам можно нужно сперва скачать к себе на сервер, а потом уже отдать конечному пользователю.
2. Если вместо результатов, вы видите некое сообщение об ошибке, то скорее всего ошибка в формировании переменной сигнатуры.
3. Приложение используется в тестовом режиме, и как сказано в документации, обращаться через API к нему может только создатель. Число запросов должно быть не более 3 в секунду.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.