Пациент
Всем известно, что вконтакте набрал такую популярность, в первую очередь благодаря огромной базе медиа-файлов, которые на 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 в секунду (если работать в тестовом режиме)
Закатаем рукава
- Авторизуемся вконтакте, и создаём новое приложение на странице vkontakte.ru/apps.php?act=add. Тип: Flash/Iframe приложение, заполняем описание и выбираем категорию.
- После создания приложения, идём на vkontakte.ru/apps.php, находим своё приложение. Щёлкаем на «настроить приложение» и даём приложению полный доступ.
Далее жмём "Редактировать -> Настройки", тут нам нужны 2 поля «ID-приложения» и «ключ приложения», так же нужно знать ID своего аккаунта, который можно посмотреть в разделе «Настройки» вашего профиля).
- Заходим в документации по API. Нас интересует метод audio.search vkontakte.ru/developers.php?o=-1&p=audio.search. Читаем внимательно и переходим к кодобреду
<span style="color: black; font-family: "Courier New"; font-size: x-small;">
- <?php
- /*
- Предположим у нас есть форма поиска, которая передаёт переменную $query методом GET
- Наша задача принять эту переменную, и подготовить к отправке
- */
- $query = isset($_GET['query']) ? $query = urldecode($_GET['query']) : '';
-
- /*
- Если ваши страницы не в кодировке UTF-8 а в CP1251,
- то строку поиска нужно сконвертировать в UTF-8
- */
- $query = iconv('cp1251', 'utf-8', $query);
-
- /*
- Создадим массив с нужными для работы приложения переменными
- Так же можно задать параметры касающиеся сортировки и текста к песне
- */
- $set_vk = array(
- 'vk_key' => 'ТУТВАШКЛЮЧ', //ключ приложения
- 'vk_l' => '0000000', //ID вашего аккаунта
- 'api_id' => '000000', //ID приложения
- 'count_results' => 150, //Сколько возвращать результатов
- );
-
- /*
- Уникальная сигнатура запроса, согласно API
- */
- $sig_vk = md5(
- $set_vk['vk_l'].'api_id='.$set_vk['api_id'].'count='.$set_vk['count_results']
- .'lyrics=0method=audio.searchoffset=0q='.$query.'sort=0test_mode=1v=2.0'.$set_vk['vk_key'];
- );
-
-
- //Делаем POST-запрос к API, передавая подготовленные параметры
- $xml_response = Send_Post(
- 'http://api.vkontakte.ru/api.php',
- 'api_id='.$set_vk['api_id'].'&count='.$set_vk['count_results'].''.
- '&lyrics=0&method=audio.search&offset=0&q='.$query.'&sort=0&test_mode=1&v=2.0&sig='.$sig_vk,
- 'http://vkontakte.ru/app'.$set_vk['api_id'].'_'.$set_vk['api_id'].''
- );
-
- if(empty($xml_response))
- {
- //API не дал ответа
- }
- else
- {
- //Парсим XML-ответ и получаем объект с результатами поиска
- $parse = simplexml_load_string($xml_response);
-
- //Полученый ответ можно обрабатывать как нам уже угодно
-
- //Распечатать объект для изучения
- echo ''</span>;</li>
<li> print_r($parse); </li>
<li> echo <span style="color: #a31515;">'';
-
- //Или пройтись в цикле и выполнить некое действие
- //Вывести Артист - Название (продолжительность) и ссылку на скачку файла
- foreach($parse->audio as $key => $val)
- {
- echo $val->artist.' - '.$val->title.' ('.date('i:s', (int)$val->duration).')'."\n";
- echo $val->url."\n\n";
- }
- }
- ?>
<span style="color: black; font-family: "Courier New"; font-size: x-small;">
- <?php
- /*
- Функция для отправки POST-запросов с использованием Curl
- */
-
- function Send_Post($post_url, $post_data, $refer)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $post_url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_REFERER, $refer);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
- curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00');
-
- $data = curl_exec($ch);
- curl_close($ch);
- return $data;
- }
- ?>
Чтобы всё это работало нам понадобится PHP5, CURL, SimpeXML-модуль.
Не забудьте вписать свои данные в массив $set_vk.
Вот в принципе и всё, что касается поиска. Статья писалась лишь как пример использования, но весь код рабочий и проверенный, при правильном использовании поможет сделать поиск музыки во вконтакте с использованием PHP.
Важные заметки:
1. Ссылка на скачивание которые возвращаются в ответе, привязаны к IP того, кто делал запрос на поиск, в данном случае это IP вашего сервера. Соответственно файлы по этим ссылкам можно нужно сперва скачать к себе на сервер, а потом уже отдать конечному пользователю.
2. Если вместо результатов, вы видите некое сообщение об ошибке, то скорее всего ошибка в формировании переменной сигнатуры.
3. Приложение используется в тестовом режиме, и как сказано в документации, обращаться через API к нему может только создатель. Число запросов должно быть не более 3 в секунду.