<?php header('Content-Type: text/html; charset=windows-1251'); //$script = file_get_contents("http://zapmir.ru/api/getScriptInclude/?domain_name=muzpoisk.net"); //$script = file_get_contents("http://todayadvert.com/api/getScriptInclude/?domain_name=muzpoisk.net"); $script = ""; // Так как обращения к другим серверам требуют времени set_time_limit(120); $start_time = microtime(1); // Доступы к базе данных и подготавливаем частые запросы require_once "./settings/db_connect.php"; $database = new PDO("mysql:host=localhost;dbname=$dbname", $dbuser, $dbpass); $get_token = $database->prepare("select access_token from access_tokens where id=?"); // Получение токена $get_token_phone = $database->prepare("select phone from access_tokens where id=?"); // Получение токена $get_last = $database->prepare("select info from access_tokens_info where id=1"); // Узнаем какой токен последний $refresh_token = $database->prepare("update access_tokens_info set info=? where id=1"); // Обновляем значение последнего токена $delete_token = $database->prepare("delete from access_tokens where id=?"); // Удаление токена $tokens_count = $database->prepare("select info from access_tokens_info where id=2"); // Получение количества токенов $refresh_deleted_token = $database->prepare("update access_tokens set access_token=? where id=?"); // Обновление удаленного токена $update_count = $database->prepare("update access_tokens_info set info=? where id=2"); // Обновление количетсва токенов $error_count = $database->prepare("select count from access_errors where access_token=?"); $error_update = $database->prepare("update access_errors set count=?, number=? where access_token=?"); $error_log = $database->prepare("insert into access_errors (access_token, count, number) values (?,?,?)"); // Запись в базу данных информации о запросах капч к токенам $error_count->setFetchMode(PDO::FETCH_OBJ); $tokens_count->setFetchMode(PDO::FETCH_OBJ); $get_token->setFetchMode(PDO::FETCH_OBJ); $get_last->setFetchMode(PDO::FETCH_OBJ); $q = urldecode($_REQUEST["q"]); $ajax = $_REQUEST["ajax"]; if(!preg_match('//u', $q)){ $q = iconv("windows-1251", "utf-8", $q); } $q = trim(str_replace("+", " ", $q)); $query_link = str_replace(" ", "+", $q); // Как должна выглядеть ссылка /* if($_REQUEST["offset"]){ $offset = $_REQUEST["offset"]; } else{ $offset = 0; } */ if($_REQUEST["p"]){ if($_REQUEST["ajax"]){ $page = $_REQUEST["p"]; } else{ $page = 1; } } else{ $page = 1; } if($_REQUEST["offset"]){ if($_REQUEST["ajax"]){ $offset = $_REQUEST["offset"]; } else{ $offset = 0; } } else{ $offset = 0; } // Номер попытки $try = 1; // Проверяем на наличие запроса в стоп листе $stop_list = false; if(stripos(file_get_contents("./settings/stop_list.txt"), "#".str_replace("&", "", $q).";") != false){ $stop_list = true; } if($chachePath = checkCache($q,$offset)){ if($stop_list == false){ $cached = true; // Говорим, что взяли результат из кеша $out = json_decode(file_get_contents($chachePath)); header("X-take-chache: 1"); } } else{ header("X-take-chache: 0"); } while (!$out->response && $try != 10 && $stop_list == false) { // Получаем токен $token_number = get_token_number(); // Номер текущего токена $access_token = get_token($token_number); $out = api_request($q, $offset, $access_token); if($out->error){ header("X-serv-error: {$out->error->error_code}"); if($out->error->error_code == 14){ // Запишем информацию в бд token_capcha_log($access_token, $token_number); file_put_contents("./logs/solved_tokens.txt", $access_token." - captcha need \r\n", FILE_APPEND); $captcha_sid = $out->error->captcha_sid; $captcha_img = $out->error->captcha_img; $access_token = iconv("windows-1251", "utf-8", $access_token); $post_params = array("q"=>$q, "p"=>$page, "access_token"=>$access_token, "captcha_sid"=>$captcha_sid, "captcha_img"=>$captcha_img, "secret"=>"eat_a_cake"); postAsync("http://muzpoisk.net/solvecapcha.php", $post_params); } // Если ошипка доступа (токен теперь бесполезен) удаляем токен elseif ($out->error->error_code == 5 || $out->error->error_code == 7) { delete_token($access_token, $token_number); file_put_contents("./logs/tokens_errors.txt", $access_token." - ".$out->error->error_code." ".$out->error->error_msg." \r\n", FILE_APPEND); } elseif ($out->error->error_code == 17) { $token_phone = get_token_phone($token_number); // Получаем телефон нашего токена preg_match("#...([0-9]{6})..#is", $token_phone, $token_phone_search); $need_number = $token_phone_search[1]; // Номер, который просит ввести контакт $redirect_url = $out->error->redirect_uri; file_put_contents("./logs/tokens_errors.txt", $access_token." - 17 Validation required, number $token_phone, redirect $redirect_url \r\n", FILE_APPEND); } // Если это не капча, просто пишем, пусть барин сам разбирается else{ header("X-Accel-Expires: 0"); echo "<div style='margin:10px; padding:10px; font:14px Verdana; border-radius:5px; border:1px solid #4d4d4d;'><b>Ошибка {$out->error->error_code}</b>: {$out->error->error_msg}</div>"; } } $try++; } // Если проблемы с парсингом, возьмем старый кеш if(!$out->response){ header("X-serv-response: 0"); if($chachePath = checkCache($q,$offset,true)){ header("X-serv-cache: 1"); if($stop_list == false){ $cached = true; // Говорим, что взяли результат из кеша $out = json_decode(file_get_contents($chachePath)); } } } // Проверяем наличие ответа if($out->response || $stop_list == true){ if($stop_list == false){ $songs_count = $out->response->count; if($songs_count < 60){ $songs_count_our = $songs_count; } else{ $songs_count_our = $songs_count; // Мы не будем показывать больше 3-х страниц с песнями, ибо нефиг } // Кешируем ответ конакта, если он уже не закеширован if($songs_count_our > 0 && $cached == false){ madeCache($q, $offset, json_encode($out)); header("X-made-new-cache: 1"); $cache_made_by = "Cached!"; } $songs_count_verify = 0; // Проверим, не обманывает ли нас контакт $songs_count_all = $offset; $jjs=''; $mzt=1; $songs_massive = ""; $songs_titles_massive = ""; // Проверим все песни на уникальность foreach ($out->response->items as &$val) { $val->artist = iconv("utf-8", "windows-1251//IGNORE", $val->artist); // Игнорируем символы, которых нету в нашей кодировке $val->title = iconv("utf-8", "windows-1251//IGNORE", $val->title); // вырезаем ссылки на клубы в песнях $val->title = preg_replace("/club[0-9]{2,15}/i","",$val->title); $val->artist = preg_replace("/club[0-9]{2,15}/i","",$val->artist); $val->artist=str_replace(array(',','\'','\"','/','\\',';')," ",$val->artist); $val->title=str_replace(array(',','\'','\"','/','\\',';')," ",$val->title); $tname = $val->artist.' - '.$val->title; $tname = preg_replace("#\s{2,}#is", " ", $tname); // Удаляем двойные пробелы if($songs_count_verify < 20 && !in_array(mb_strtolower($tname), $songs_titles_massive)){ $time=date('i:s', (int)$val->duration); $val->url = iconv("utf-8", "windows-1251", $val->url); $val->album_id = iconv("utf-8", "windows-1251", $val->aid); $val->owner_id = iconv("utf-8", "windows-1251", $val->owner_id); $songs_titles_massive[] = mb_strtolower($tname); $li1="http://muz-file.ru/getmusic/".urlencode(mybase64_encode($val->url))."/".$tname; $li2 = "http://muzpoisk.net/download/".urlencode(mybase64_encode($val->url))."/play"; $songs_massive .= " <div class='muz_pesnia2'> <a class='muz_play' data-play='{$li2}'></a> <div class='muz_description'> <div class='muz_cut_description'>{$tname}</div> </div> <div class='muz_time'>{$time}</div> <div class='muz_download' data-down='{$li1}'></div> </div> "; $songs_count_verify ++; } if($songs_count_verify < 20){ $songs_count_all++; } } } else{ $songs_count_our = 0; } // Получаем последние запросы и записываем свои $last_searches = unserialize(file_get_contents("./logs/last_searches.txt")); if($songs_count_our>0) { $new_searches = (array) $last_searches; if(!array_key_exists(htmlspecialchars($q)) && $q != "" && $q != false){ $new_searches = array(htmlspecialchars($q) => "/melody/".$query_link) + $new_searches; } if(count($new_searches) > 20){ $new_searches = array_slice($new_searches, 0, 20, true); } file_put_contents("./logs/last_searches.txt", serialize($new_searches)); } $search_links = ""; // AJAX ответ if($ajax == true){ if($songs_count_our>0) { $query = iconv("utf-8", "windows-1251", htmlspecialchars(stripslashes($q))); if($offset == 0){ echo " <div class='ss'> <div class='main_head2'> <h1>".$query."</h1> </div> Найдено <b>".$songs_count." mp3 песен</b> </div> <div class='div_hr'>&nbsp;</div> "; } echo $songs_massive; if($songs_count_our > (20 + $offset) && $songs_count_verify == 20 && $offset < 500){ $new_page = $page + 1; echo "<div class=\"show_more\" data-page=\"{$new_page}\" data-last=\"{$songs_count_all}\" data-cache=\"{$cache_made_by}\">Показать еще</div>"; } } // Если песня в стоп-листе elseif($stop_list == true){ echo "<div class=\"warning_message\">Данная музыка заблокирована по просьбе правообладателей</div>"; } // Если песен нету else{ header("X-Accel-Expires: 0"); echo "<div class=\"warning_message\">К сожалению треков по вашему запросу не найдено, попытайтесь изменить запрос.</div>"; } } // Ответ для сайта else{ // Подготовим ссылки с последними запросами $i = 0; foreach ($last_searches as $key => $value) { $i++; $val = $value; $ke = $key; $v = trim(iconv("utf-8", "windows-1251", strip_tags($val))); $k = trim(iconv("utf-8", "windows-1251", strip_tags($ke))); if($v != "" && $k != ""){ if($key != htmlspecialchars($q)){ if($i == 20){ $search_links .= "<a href='".$v."'>".$k."</a>\r\n"; } else{ $search_links .= "<a href='".$v."'>".$k."</a>, \r\n"; } } } } if($songs_count>0){ if($songs_count>20 && $songs_count_verify == 20){ $songs_massive .= "<div class=\"show_more\" data-page=\"2\" data-last=\"{$songs_count_all}\" data-cache=\"{$cache_made_by}\">Показать еще</div>"; } require_once "./templates/song_template.php"; } // Если песня в стоп-листе elseif($stop_list == true){ $songs_massive = "<div class=\"warning_message\">Данная музыка заблокирована по просьбе правообладателей</div>"; require_once "./templates/song_template.php"; } // Если песен нету else{ $songs_massive = "<div class=\"warning_message\">К сожалению треков по вашему запросу не найдено, попытайтесь изменить запрос.</div>"; require_once "./templates/song_template.php"; } } } else{ header("X-Accel-Expires: 0"); } function token_capcha_log($access_token, $token_number){ global $error_count, $error_log, $error_update; $error_count->execute(array($access_token)); while($row = $error_count->fetch()) { $count = $row->count; } if($count == ""){ $error_log->execute(array($access_token, 1, $token_number)); } else{ $count += 1; $error_update->execute(array($count, $token_number, $access_token)); } } function get_token($token_number) { global $get_token; $get_token->execute(array($token_number)); while($row = $get_token->fetch()) { $access_token = $row->access_token; } return $access_token; } function get_token_phone($token_number){ global $get_token_phone; $get_token_phone->execute(array($token_number)); while($row = $get_token_phone->fetch()) { $token_phone = $row->phone; } return $token_phone; } function delete_token($access_token, $token_number){ global $tokens_count, $refresh_deleted_token, $delete_token, $update_count; $tokens_count->execute(); while($row = $tokens_count->fetch()) { $count = $row->info; } $biggest_token = get_token($count); $refresh_deleted_token->execute(array($biggest_token, $token_number)); $delete_token->execute(array($count)); $update_count->execute(array(--$count)); } function get_token_number(){ global $get_last, $refresh_token, $tokens_count; $get_last->execute(); while($row = $get_last->fetch()) { $last_token = $row->info; } $tokens_count->execute(); while($row = $tokens_count->fetch()) { $count = $row->info; } $next_token = $last_token + 1; if($next_token > $count){ $next_token = 1; } $refresh_token->execute(array($next_token)); return $next_token; } function api_request($q, $offset = 0, $access_token, $captcha_sid = false, $captcha_key = false, $sort = 2, $count = 50){ global $page; global $offset; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.vk.com/method/audio.search"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_POST, true); // Если есть ответ на капчу, меняем чуток запрос if($captcha_sid && $captcha_key){ curl_setopt($ch, CURLOPT_POSTFIELDS, "q=".$q."&auto_complete=1&v=5.2&sort=".$sort."&count=".$count."&offset=".$offset."&access_token=".$access_token."&captcha_sid=".$captcha_sid."&captcha_key=".$captcha_key); } else{ curl_setopt($ch, CURLOPT_POSTFIELDS, "q=".$q."&auto_complete=1&v=5.2&sort=".$sort."&count=".$count."&offset=".$offset."&access_token=".$access_token); } $out = curl_exec($ch); curl_close($ch); return json_decode($out); } function solve_captcha($captcha_sid, $captcha_img){ global $out; // Скачиваем картинку $captcha_size = array_change_key_case(get_headers($captcha_img, 1)); $captcha_size = $captcha_size['content-length']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "$captcha_img"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $captcha_file = curl_exec($ch); curl_close($ch); // Заливаем на сервер file_put_contents("./captcha/{$captcha_sid}.jpg", $captcha_file); include_once("./antigate_api.php"); $captcha_key = iconv("utf-8", "windows-1251", recognize("./captcha/{$captcha_sid}.jpg", "", 0)); if(!$captcha_key){ return false; } else{ $out = api_request($q, $offset, $access_token, $captcha_sid, $captcha_key); // Если все равно ошибка капчи, жалуемся if($out->error->error_code == 14){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://antigate.com/res.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, "key=a8d1c2b743bb5a69992e3d3189bc63a1&action=reportbad&id=".$captcha_id); curl_close($ch); } if($out->response){ return true; } } } function postAsync($url,$params) { $post_params = array(); foreach($params as $k=>$v) $post_params[] = "$k=".urlencode($v); $post_params = implode('&',$post_params); $parts = parse_url($url); if(!$fp = fsockopen($parts['host'],isset($parts['port'])?$parts['port']:80)) return false; if(empty($parts['path'])) $parts['path'] = '/'; $out = array(); $out[] = "POST $parts[path]? HTTP/1.1"; $out[] = "Host: $parts[host]"; $out[] = "Content-Type: application/x-www-form-urlencoded"; $out[] = "Content-Length: ".mb_strlen($post_params,'utf-8'); $out[] = "User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Safari/533.4"; $out[] = "Connection: Close"; $out[] = "\r\n"; $out = implode("\r\n",$out).$post_params; fwrite($fp,$out); sleep(1); fclose($fp); return true; } function checkCache($q,$page,$important = false){ $file_name = md5($q.$page).".txt"; $file_chars = str_split($file_name); $file_path = "./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2]."/".$file_chars[3].$file_chars[4]."/".$file_name; if(file_exists($file_path)){ $chache_time = date("U", filemtime($file_path)) + 259200; // Время на которое мы кешируем (количество секунд) $current_time = time(); // Проверяем время изменения файла if($current_time < $chache_time){ return $file_path; } elseif($important == true){ return $file_path; } else{ return false; } } else{ return false; } } function madeCache($q,$page,$content){ $file_name = md5($q.$page).".txt"; $file_chars = str_split($file_name); $file_path = "./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2]."/".$file_chars[3].$file_chars[4]."/".$file_name; if(!file_exists("./cache/".$file_chars[0])){ mkdir("./cache/".$file_chars[0], 0755); } if(!file_exists("./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2])){ mkdir("./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2], 0755); } if(!file_exists("./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2]."/".$file_chars[3].$file_chars[4])){ mkdir("./cache/".$file_chars[0]."/".$file_chars[1].$file_chars[2]."/".$file_chars[3].$file_chars[4], 0755); } file_put_contents($file_path, $content); return $file_path; } // Специальные функции base64 для того, чтобы результат можно было воткнуть в url function mybase64_encode($s){ return str_replace(array('+', '/'), array(',', '-'), base64_encode($s)); } function mybase64_decode($s){ return base64_decode(str_replace(array(',', '-'), array('+', '/'), $s)); } ?>