parse('Blondie - Call Me'); $files = $vk_parser->getFiles(); *****************************************************************/ /** * Класс парсинга вконтактика * * @package classes * @author chez **/ class Vkontakte { private $_cookies; // Куки, ассоциативный массив private $_query; // Запрос, plain text private $_html; // HTML, полученый от вконтактика private $_files; // Распарсеные массивы с информацией о файле private $_bot_info; // Информация о боте public function __construct($bot_name = false) { if ($bot_name) { $this->_bot_info = Config::get('bot:'. $bot_name); } } /** * Оболочка парсера * * @param string $q Запрос * @return array Массив с файлами * @author chez **/ public function getTracks($q) { $this->_query = $q; $this->auth(); $cookie = array(); foreach ($this->_cookies as $key => $val) { $cookie[] = $key .'='. $val; } RemoteFile::setHeaders(array( 'Cookie: '. implode('; ', $cookie), 'Referer: http://vkontakte.ru/audio?album_id=0', 'X-Requested-With: XMLHttpRequest', 'Origin: http://vkontakte.ru', 'Content-Type: application/x-www-form-urlencoded', 'User-Agent: '. $this->_bot_info['user_agent'], 'Connection: close' )); $html = RemoteFile::getData('http://vkontakte.ru/audio', array( 'act' => 'search', 'al' => '1', 'gid' => '0', 'id' => $this->_bot_info['user_id'], 'offset' => '0', 'q' => urlencode($this->_query), 'sort' => '2' )); $this->setHtml($html); return (strlen($html) > 150); } /** * Пишет полученый html в член объекта * * @param string $html HTML * @return void * @author chez **/ public function setHtml($html) { $this->_html = $html; } /** * Возвращает хранимый html * * @return string HTML * @author chez **/ public function getHtml() { return $this->_html; } /** * Возвращает хранимый массив файлов * * @return array Список файлов * @author chez **/ public function getFiles() { return $this->_files; } /** * Проводит авторизацию на вконтактике и получает куки * Пока костыль, потом нужно будет переписать * * @return array Ассоциативный массив с куками * @author chez **/ private function auth() { $this->_cookies = array( 'remixchk' => $this->_bot_info['remixchk'], 'remixsid' => $this->_bot_info['remixsid'], 'remixlang' => 777 ); } /** * Разбирает HTML, полученый от вконтактика * * @return array Список файлов * @author chez **/ public function parseHtml() { preg_match_all('/(.*)<\/tr>/Usi', $this->_html, $m); $files = array(); if (count($m) > 0) foreach ($m[0] as $res) { $m1 = array(); preg_match('/(.*)<\/div>.*(.*)<\/a>.*\s-\s(.*)<\/div>/Usi', $res, $m1); if (count($m1) > 0) { $duration = explode(':', $m1[3]); $files[] = array( 'url' => $m1[1], 'duration' => $duration[0] * 60 + $duration[1], 'artist' => strip_tags($m1[4]), 'track' => strip_tags($m1[5]) ); } } $this->_files = $files; } }