ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   PHP (https://forum.antichat.io/forumdisplay.php?f=37)
-   -   [VKCS class] - работа с контентом ВКонтакте (https://forum.antichat.io/showthread.php?t=166127)

m0Hze 25.12.2009 22:37

[VKCS class] - работа с контентом ВКонтакте
 
И так, решил я все же отдать вам на растерзание этот не домученный класс VKCS - Vkontakte Content Searcher.Я сам удивляюсь как он может работать,но все же это так.
Представляю вашему вниманию,класс для поиска музыки и видео по вконтакте.Это аналог Vpleer.ru, давно работал над этой идеей,и даже запускал свой проэкт,но нехватило сил его поддерживать.Так что ловите.
(Сразу предупрежу,когда я писал этот класс,мои познания в ООП были настолько скудны,что мне даже стыдно.Когда я его на харде открыл,переписал некоторые методы,для работы с актуальной авторизацией вк.Поэтому основная часть класса - это сплошь и рядом говнокод.)
Не большое описание,что умеет.

1) Работает как с базой MySQL так и с файлами.Все это указываеться при инициализации класса.
2) Можно искать как музыку,так и видео(функция не совсем доделана,ибо забросил).
3) Есть минималистичный дебаг,который тоже можно отключить.Также настраиваться вид вывода ошибок,цвет и размер шрифта.Но это я делал просто от нечего делать похоже :)
4) Фильтрация результатов.Актуально только для поиска музыки, и используеться фильтрация только по названию.Можно добавить и по времени,но как-то лень.

Базовая инициализация:
PHP код:

include ('./vkcs.class.php');
$vk = new VKCS('file','accounts.txt',false);
$vk->SetQueryPage('System of a Down');
$music = $vk->GetMusic();
$video = $vk->Getvideo();
print_r($music); 

Описание методов которые могу пригодиться:

VKCS($type, $nameb, $debug) - конструктор.принимает значения: Тип БД(file of sql),Имя базы\файла,дебаг - on\off.
setColorError($type, $color) - установка цвета ошибок.
setSizeError($type, $size) - установка размера ошибок.
SetQueryPage($query, $page = 1) - установка запроса, то что мы будем искать.Принимает значения: Название, Страница на которой искать.
GetError() - мини дебагер,отвечает за вывод ошибки на экран, если это было включено при инициализации конструктора.
GetMusic() - собственно,основной метод..Осуществляет поиск музыки и ее фильтрацию(если захотите,вынесите в отдельный метод).
GetVideo() - аналог пред идущего метода,только для видео и нет фильтрации.
GetCookie() - авторизация,получение куков и запись их в нужную переменную.
Класс можно взять здесь: Вот он
Тут:
PHP код:

<?php
/**
 * @author m0hze
 * @copyright 2009
 * @site http://m0hze.ru
 * @hello : https://forum.antichat.ru
 */
error_reporting(0);
class 
VKCS
{
    var 
$_COOKIE, $_PASSWORD, $_USER, $_SEARCH, $_TABLE, $_FILE, $_ERROR, $_QUERY, $_DEBUG,
        
$_TYPE, $_NAMEB;
    var 
$color_head = 'red', $color_text = 'black', $size_head = 3, $size_text = 3;
    public function 
VKCS($type, $nameb, $debug)
    {
        
$this->SelectBase($type,$nameb);
        
$this->setVar('_DEBUG',$debug);
    }
    public function 
setColorError($type, $color)
    {
        if (
strtolower($type) == 'head') {
            
$this->color_head = $color;
        } elseif (
strtolower($type) == 'text') {
            
$this->color_text = $color;
        } else {
            
$this->setVar('_ERROR',
                
"Options not correctly in <i>method</i> <b>setColorError()</b>! Please, change options and restart programm!");
            return (
$this->GetError());
            break;
        }
    }
    public function 
setSizeError($type, $size)
    {
        if (
strtolower($type) == 'head') {
            
$this->size_head = $size;
            return (
true);
        } elseif (
strtolower($type) == 'text') {
            
$this->size_text = $size;
            return (
true);
        }
        
$this->setVar('_ERROR',
            
"Options not correctly in <i>method</i> <b>setSizeError()</b> ! Please, change options and restart programm!");
        return (
$this->GetError());
    }


    private function 
setVar($var, $set)
    {
        if (isset(
$var)) {
            
$this->$var .= $set;
        } else {
            
$this->$var = $set;
        }

        return (
$this->$var == $set ? true : false);
    }
    private function 
SelectBase($type, $file = 'accounts.txt')
    {
        
$this->setVar('_TYPE', $type);
        if (
strtolower($this->_TYPE) == 'file') {
            
$this->setVar('_FILE', $file);
        } elseif (
strtolower($this->_TYPE) == 'sql') {
            
$this->setVar('_TABLE', $file);
        }
    }
    public function 
SetQueryPage($query, $page = 1)
    {
        if (
strlen($query) < 4) {
            
$this->setVar('_ERROR',
                
"<b>QUERY</b> > <b>4</b> byte! Please, send me true <b>QUERY</b>\r\n");
            return (
$this->GetError());
            break;
        } elseif (
$page < 0) {
            
$this->setVar('_ERROR',
                
"<b>PAGE</b> > <b>0</b> byte! Please, send me true <b>PAGE</b>\r\n");
            return (
$this->GetError());
            break;
        }
        
$this->setVar('_QUERY', urlencode(str_replace(' ', '_', trim($query))));
        
$this->setVar('_PAGE', $page);
        return (
true);
    }
    private function 
GetError()
    {
        if (
$this->_DEBUG) {
            return (die(
'<b><font size="' . $this->size_head . '" color="' . $this->
                
color_head . '">ERROR!</b></font><br><font size="' . $this->size_text .
                
'" color="' . $this->color_text . '">' . nl2br($this->_ERROR) . '</font>'));
        } else {
            return;
        }


    }
    private function 
GetUser_Base()
    {
        
$query = mysql_query("SELECT * FROM " . $this->_TABLE .
            
" ORDER BY rand() LIMIT 1");
        if (!
$query) {
            
$this->setVar('_ERROR', mysql_error() . "\r\n");
            return (
$this->GetError());
            break;
        }
        
$array = mysql_fetch_assoc($query);
        
$this->setVar('_USER', $array['user']);
        
$this->setVar('_PASSWORD', $array['password']);
        return (
true);
    }
    private function 
GetUser_File()
    {
        
$open = file($this->_FILE);
        if (
$open) {
            
$count = count($open);
            
$data = explode(':', $open[rand(0, $count - 1)]);
            
$this->setVar('_USER', trim($data[0]));
            
$this->setVar('_PASSWORD', trim($data[1]));
            return (
true);
            break;
        } else {
            
$this->setVar('_ERROR', "Can'not open <b>'" . $this->_FILE .
                
"'</b> base, or <b>FILE</b> size = <b>0</b> byte ! Please create <b>FILE</b> in directory!\r\n");
        }
        return (
$this->GetError());
        break;
    }
    public function 
GetMusic()
    {
        if (!isset(
$this->_QUERY)) {
            
$this->setVar('_ERROR',
                
"<b>QUERY</b> size = <b>0</b>, or > <b>3</b> byte! Please, send me true <b>QUERY</b>\r\n");
            return (
$this->GetError());
            break;
        }
        
$this->GetCookie();
        
$exec = curl_init('http://vkontakte.ru/gsearch.php?section=audio&q=' . $this->
            
_QUERY . '&offset=' . $this->_PAGE . '00');
        if (!
$exec) {
            
$this->setVar('_ERROR', "Library <b>cURL</b> not work!\r\n Please, change options <b>ERROR</b> on you <b>php.ini</b>! \r\n");
            return (
$this->GetError());
            break;
        }
        
curl_setopt($exec, CURLOPT_RETURNTRANSFER, 1);
        
curl_setopt($exec, CURLOPT_REFERER, 'http://vkontakte.ru/index.php');
        
curl_setopt($exec, CURLOPT_HEADER, 1);
        
curl_setopt($exec, CURLOPT_COOKIE, $this->_COOKIE);
        
$page = curl_exec($exec);
        
preg_match('#Найдено (.*) аудиозап#isU', $page, $coll_page);
        if (!
$coll_page) {
            
$this->setVar('_ERROR', "For you <b>QUERY</b> music not found!\r\n");
            return (
$this->GetError());
            break;
        }
        
$coll = str_replace(' ', '', trim($coll_page[1]));
        
$total = $coll / 1;
        if (
$total > 11) {
            
$total = 11;
        } elseif (
$total < 0) {
            
$total = 1;
        }
        
preg_match_all('#<b id=\"performer.*\">(.*)<\/b> - <span id=\"title.*\">(.*)<\/span>#isU',
            
$page, $name);
        
preg_match_all('#return operate(.*,(.*),(.*),\'(.*)\',.*)#isU', $page, $url);
        
preg_match_all('#<div class=\"duration\">(.*)<\/div>#isU', $page, $time);
        
$nouniqname = array_map("strtolower", array_map("trim", $name[2]));
        
$uniquename = array_unique($nouniqname);
        
$count = count($url[2]);
        for (
$i = 0; $i < count($url[2]); $i++) {
            if (
$uniquename[$i] == $nouniqname[$i] or $uniquetime[$i] == $nouniqtime[$i]) {
                
$data['group'][$i] = substr(strip_tags($name[1][$i]), 0, 15);
                
$data['name'][$i] = substr(strip_tags($name[2][$i]), 0, 25);
                
$data['server'][$i] = $url[2][$i];
                
$data['id'][$i] = $url[3][$i];
                
$data['hash'][$i] = $url[4][$i];
            }

        }
        
$data['page'] = $total;
        return (
$data);
    }
    public function 
GetVideo()
    {
        if (!isset(
$this->_QUERY)) {
            
$this->setVar('_ERROR',
                
"<b>QUERY</b> size = <b>0</b>, or > <b>3</b> byte! Please, send me true <b>QUERY</b>\r\n");
            return (
$this->GetError());
            break;
        }
        
$this->GetCookie();
        
$exec = curl_init('http://vkontakte.ru/gsearch.php?section=video&q=' . $this->
            
_QUERY . '&offset=' . $this->_PAGE . '00');
        if (!
$exec) {
            
$this->setVar('_ERROR', "Library <b>cURL</b> not work!\r\n Please, change options <b>ERROR</b> on you <b>php.ini</b>! \r\n");
            return (
$this->GetError());
            break;
        }
        
curl_setopt($exec, CURLOPT_RETURNTRANSFER, 1);
        
curl_setopt($exec, CURLOPT_REFERER, 'http://vkontakte.ru/index.php');
        
curl_setopt($exec, CURLOPT_HEADER, 1);
        
curl_setopt($exec, CURLOPT_COOKIE, $this->_COOKIE);
        
$page = curl_exec($exec);
        
preg_match('#Найдено (.*) видео#isU', $page, $coll_page);
        if (!
$coll_page) {
            
$this->setVar('_ERROR', "For you <b>QUERY : \"" . $this->_QUERY . "\"</b> video not found!\r\n");
            return (
$this->GetError());
            break;
        }
        
preg_match_all('#<img src=\'http://(.*).vk.jpg\'#isU', $page, $image);
        
preg_match_all('#<a href=\"video.*\">(.*)</a>#isU', $page, $name);
        
$image = $image[1];
        
print_r($name);

    }
    private function 
GetCookie()
    {

        if (!isset(
$this->_TYPE)) {
            
$this->setVar('_ERROR',
                
"Base TYPE not selecte! Please select: <b>SQL</b> or <b>FILE</b>!\r\n Code include: \$this->setVar('_TYPE','SQL');\r\n");
            return (
$this->GetError());
            break;
        }
        if (
strtolower($this->_TYPE) == 'sql') {
            
$this->GetUser_Base();
        } elseif (
strtolower($this->_TYPE) == 'file') {
            
$this->GetUser_File($_FILE);
        } else {
            
$this->setVar('_ERROR',
                
"Don't know selected BASE! Please, change: <b>SQL</b> or <b>FILE</b>\r\n");
            return (
$this->GetError());
            break;
        }
        
$exec = curl_init('http://vkontakte.ru/login.php');
        if (!
$exec) {
            
$this->setVar('_ERROR', " Library <b>cURL</b> not work!\r\n Please, change options <b>ERROR</b> on you <b>php.ini</b>! \r\n");
            return (
$this->GetError());
            break;
        }
        
$post = 'email=' . $this->_USER . '&pass=' . $this->_PASSWORD;
        
curl_setopt($exec, CURLOPT_RETURNTRANSFER, 1);
        
curl_setopt($exec, CURLOPT_POSTFIELDS, $post);
        
curl_setopt($exec, CURLOPT_REFERER, 'http://vkontakte.ru/index.php');
        
curl_setopt($exec, CURLOPT_HEADER, 1);
        
curl_setopt($exec, CURLOPT_COOKIEJAR, 'cookie.txt');
        
curl_setopt($exec, CURLOPT_COOKIEFILE, 'cookie.txt');
        
$page = curl_exec($exec);
        
preg_match('#remixsid=(.*)\;#isU', $page, $match);
        if (
$match) {
            
$cookie = 'remixsid=' . $match[1];
            
$this->setVar('_COOKIE', $cookie);
            return (
true);
        } else {
            
$this->setVar('_ERROR', "<b>USER</b> or <b>PASSWORD</b> not true!\r\n Please, change this <b>ERROR</b> on you <b>BASE</b>! \r\n");
            return (
$this->GetError());
            break;
        }
    }

}
?>

Я не нуждаюсь в критике,ибо не думаю что когда нибудь возьмусь его доводить до ума.Выкладываю только по тому,что может кому-то пригодиться,и он решит составить конкуренцию vpleer.ru, у меня на это сил и денег не хватило.
Я вспомнил! Я на нем учился как раз основам ООП :D точно

Deathdreams 25.12.2009 22:46

Давно хотел написать класс, да всё руки не доходили.
Сейчас будем пробовать:)
Молодец

--------------------------------------
Функций маловато.
ИМХО душный класс.

m0Hze 25.12.2009 22:56

Цитата:

Сообщение от Deathdreams
Давно хотел написать класс, да всё руки не доходили.
Сейчас будем пробовать:)
Молодец

--------------------------------------
Функций маловато.
ИМХО душный класс.

Ну я в первом посте все сказал) это из ряда первого секса с ооп на пхп.Кому нужно перепишут\доделают.Мне он просто не нужен, ибо как я уже сказал нет ни времени ни денег.Все,ушел отсюда,я плоxо критику ереношу :)

b3 25.12.2009 23:52

Добавь сразу конструкт функцию для инициализации БД и Входа в ВК, и замени var на public и будет ОК.

m0Hze 26.12.2009 00:33

Цитата:

Сообщение от b3
Добавь сразу конструкт функцию для инициализации БД и Входа в ВК, и замени var на public и будет ОК.

Ну я же написал =), я не собираюсь его дописывать\исправлять.это - сырье,пускай тот кому нужно исправляет,готового в жизни ничего не бывает.Да и лень мне,пускай отдельным методом будет,расход памяти не сильно увеличиться,ведь метод используеть всего 1 раз,значит и копируеться в память всего 1 копия.Будет примерно тоже самое,если я вынесу все это в (add, ну да,он же еще инитиализируеться, + к памяти,но всеравно лень)конструктор.Ну и опять же - лень =)
изос - жди конкурентов :o

Gifts 26.12.2009 14:34

m0Hze Если вы не собираетесь править/поддерживать код, то нахрена создавать отдельную тему, если есть топик для мелких скриптов. Захотелось дешевого пЕара, и чтобы вам сказали, какой вы молодец? Так вот - вы не молодец и даже не рядом, код - говно, его не дорабатывать надо, а удалять. Если, конечно, целью не было показать - как НЕ надо делать

m0Hze 26.12.2009 14:48

Цитата:

Сообщение от Gifts
m0Hze Если вы не собираетесь править/поддерживать код, то нахрена создавать отдельную тему, если есть топик для мелких скриптов. Захотелось дешевого пЕара, и чтобы вам сказали, какой вы молодец? Так вот - вы не молодец и даже не рядом, код - говно, его не дорабатывать надо, а удалять. Если, конечно, целью не было показать - как НЕ надо делать

Невнимательно читал,об этом тоже есть в первом посте.Пускай b3 перенесет, создал отдельный тред ибо много букв.

LStr1ke 26.12.2009 15:45

Цитата:

error_reporting(0);
Всегда считал такое невежеством. (Извини)
Цитата:

я не собираюсь его дописывать\исправлять.это - сырье,пускай тот кому нужно исправляет
Мда. А это смахивает на быдланство. (опять извини) Мог бы соврать и сказать, что потом, как появится время - исправишь )
Хорошо, что хоть не в избранное запостил ). А так, некоторым будет полезна реализация, с точки зрения общего развития.

Isis 26.12.2009 20:58

Реклама проплачена, не беспокойтесь

Winst0n 16.01.2010 10:43

нужная штука, только что то не правильно он хеш показывает...
у тебя:
http://cs4429.vkontakte.ru/u2512752/audio/ea140768a06e.mp3
у http://www.puzzleclub.ru/files/vkontakte_ru_audio.js:
http://cs4429.vkontakte.ru/u2512752/audio/5aef650b1770.mp3
запрос "Simple Song (Original Mix)"

в чем может быть проблема ?
в классе посмотрел, вроде регулярка ок, откуда он такой хеш О_о


Время: 22:42