130 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
 | 
						||
/*****************************************************************
 | 
						||
Пример использования:
 | 
						||
 | 
						||
$vk_parser = new Vkontakte();
 | 
						||
$vk_parser->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;	// Распарсеные массивы с информацией о файле
 | 
						||
	
 | 
						||
	/**
 | 
						||
	 * Оболочка парсера
 | 
						||
	 *
 | 
						||
	 * @param string $q	Запрос
 | 
						||
	 * @return array	Массив с файлами
 | 
						||
	 * @author chez
 | 
						||
	 **/
 | 
						||
	public function parse($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: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16',
 | 
						||
			'Connection: close'
 | 
						||
		));
 | 
						||
		$this->setHtml(RemoteFile::getData('http://vkontakte.ru/audio', array(
 | 
						||
			'act'			=>'search',
 | 
						||
			'al'			=>'1',
 | 
						||
			'gid'			=>'0',
 | 
						||
			'id'			=>'5728795',
 | 
						||
			'offset'		=>'0',
 | 
						||
			'q'				=> urlencode($this->_query),
 | 
						||
			'sort'			=>'2'
 | 
						||
		)));
 | 
						||
		$this->parseHtml();
 | 
						||
		return $this->_files;
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * Пишет полученый 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' => 5,
 | 
						||
			'remixsid' => 'c68c4362f62f218a25802bae87201d1bc46fadd0b5c64f71678430c9b63b'
 | 
						||
		);
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * Разбирает HTML, полученый от вконтактика
 | 
						||
	 *
 | 
						||
	 * @return array Список файлов
 | 
						||
	 * @author chez
 | 
						||
	 **/
 | 
						||
	public function parseHtml() {
 | 
						||
		preg_match_all('/<tr>(.*)<\/tr>/Usi', $this->_html, $m);
 | 
						||
		$files = array();
 | 
						||
		if (count($m) > 0) foreach ($m[0] as $res) {
 | 
						||
			$m1 = array();
 | 
						||
			preg_match('/<input.*value=\"(.*)\,(\d{2,4})\".*<div\sclass=\"duration.*>(.*)<\/div>.*<a.*>(.*)<\/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;
 | 
						||
	}
 | 
						||
} |