Your IP : 172.69.59.17


Current Path : /var/www/element/data/www/opter.ru/
Upload File :
Current File : /var/www/element/data/www/opter.ru/linkator.php

<?php

 
//phpinfo();

set_time_limit(0);
if(empty($argv[1])){
echo '<html>
<style>
a:link {
  color: green;
  background-color: transparent;
  text-decoration: none;
}

a:visited {
  color: green;
  background-color: transparent;
  text-decoration: none;
}

a:hover {
  color: green;
  background-color: transparent;
  text-decoration: underline;
}

a:active {
  color: green;
  background-color: transparent;
  text-decoration: underline;
}

    *,
    *::before,
    *::after {
      box-sizing: border-box;
    }

    body {
      margin: 10px;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
      font-size: 12px;
      font-weight: 400;
      line-height: 1.5;
      color: #212529;
      text-align: left;
      background-color: #fff;
    }
    
    table {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
      font-size: 12px;
      font-weight: 400;
    }

    .tabs {
      font-size: 0;
      max-width: 100%;
      margin-left: auto;
      margin-right: auto;
    }

    .tabs>input[type="radio"] {
      display: none;
    }

    .tabs>div {
      /* скрыть контент по умолчанию */
      display: none;
      border: 1px solid #e0e0e0;
      padding: 10px 15px;
      font-size: 12px;
    }

    /* отобразить контент, связанный с вабранной радиокнопкой (input type="radio") */
    #tab-btn-1:checked~#content-1,
    #tab-btn-2:checked~#content-2,
    #tab-btn-3:checked~#content-3 {
      display: block;
    }

    .tabs>label {
      display: inline-block;
      text-align: center;
      vertical-align: middle;
      user-select: none;
      background-color: #f5f5f5;
      border: 1px solid #e0e0e0;
      padding: 2px 8px;
      font-size: 12px;
      line-height: 1.5;
      transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out;
      cursor: pointer;
      position: relative;
      top: 1px;
    }

    .tabs>label:not(:first-of-type) {
      border-left: none;
    }

    .tabs>input[type="radio"]:checked+label {
      background-color: #fff;
      border-bottom: 1px solid #fff;
    }

</style>
<body>';

}

//=============================AUTH=============================================
if(empty($argv[1])){

   
    if($_POST['pwd']){
    //echo $_POST['pwd'];
    setcookie('linkator_pwd',md5($_POST['pwd']));
    echo "<script>window.location.replace('/linkator.php');</script>";
    }

 
$version="1.03";

echo "<h1>LINKATOR v$version</h1><hr>";


$linkator_PWD=explode("\n", file_get_contents("https://www.optimism.ru/linkator_PWD.txt"));
$linkator_password=$linkator_PWD[0];
$linkator_version=$linkator_PWD[1];

if($linkator_version!==$version){echo "Ошибка: неизвестная версия $version, обновите линкатор на версию $linkator_version. "; die(); }

if($_COOKIE['linkator_pwd']!==md5($linkator_password)){
    

   echo '
    <form method=POST action="/linkator.php">
    Password:<br>
    <input type="password" name="pwd" value="">&nbsp;&nbsp;<input type="submit" value=">>>">
    </form>
    ';
    die();
}}
//============================================================================







function count_files($dir){
$files1 = scandir($dir);
$i = 0;
foreach ($files1 as $key => $value){
if (!in_array($value, array(".", ".."))){
    if(is_file($dir.'/'.$value) && stristr($value,".htm")){ $i = $i + 1; }
    if(is_dir($dir.'/'.$value)){$i += count_files($dir.'/'.$value);}
} 
}
return $i;
}



function get_content($folder,&$all_files){ 
	$fp=opendir($folder);
	while($cv_file=readdir($fp)){ 
		if(is_file($folder."/".$cv_file) && stristr($cv_file,".htm")){
			$all_files[$folder."/".$cv_file]=file_get_contents($folder."/".$cv_file);
		}
		elseif($cv_file!="."&&$cv_file!=".."&&is_dir($folder."/".$cv_file)){
			get_content($folder."/".$cv_file,$all_files);
		}
	}
	closedir($fp); //print_r($all_files);
}

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

    function unZip($file){

        $zip=zip_open(realpath(".")."/".$file);
        if(!$zip) {return("Unable to proccess file '{$file}'");}

        $e='';

        while($zip_entry=zip_read($zip)) {
           $zdir=dirname(zip_entry_name($zip_entry));
           $zname=zip_entry_name($zip_entry);

           if(!zip_entry_open($zip,$zip_entry,"r")) {$e.="Unable to proccess file '{$zname}'";continue;}
           if(!is_dir($zdir)) mkdirr($zdir,0777);

           #print "{$zdir} | {$zname} \n";

           $zip_fs=zip_entry_filesize($zip_entry);
           if(empty($zip_fs)) continue;

           $zz=zip_entry_read($zip_entry,$zip_fs);

           $z=fopen($zname,"w");
           fwrite($z,$zz);
           fclose($z);
           zip_entry_close($zip_entry);

        }
        zip_close($zip);

        return($e);
    }

    function mkdirr($pn,$mode=null) {

      if(is_dir($pn)||empty($pn)) return true;
      $pn=str_replace(array('/', ''),DIRECTORY_SEPARATOR,$pn);

      if(is_file($pn)) {trigger_error('mkdirr() File exists', E_USER_WARNING);return false;}

      $next_pathname=substr($pn,0,strrpos($pn,DIRECTORY_SEPARATOR));
      if(mkdirr($next_pathname,$mode)) {if(!file_exists($pn)) {return mkdir($pn,$mode);} }
      return false;
    }

    
if(empty($argv[1])){ 

if($_GET['backup']=='create'){
   Zip('./', './linkator_backup.zip');
   
   echo "<script> alert('Бекап создан'); window.location.replace('/linkator.php');</script>";
}

if($_GET['backup']=='restore'){
  unZip('./linkator_backup.zip');
  echo "<script> alert('Бекап восстановлен'); window.location.replace('/linkator.php');</script>";
}




//check backup
if(file_exists('./linkator_backup.zip')){ $backup_exist=true; }else{ $backup_exist=false; }


if(!$_POST['keys']){
   $keys_field=file_get_contents("linkator_keys.txt");
      if($keys_field==""){
      $keys_field="продвижение сайтов|12|https://www.optimism.ru\nконтекстная реклама|5|https://www.optimism.ru";
      }
   }
else{ $keys_field=$_POST['keys']; }

if (isset($_POST['uploadBtn']) && $_POST['uploadBtn'] == 'Загрузить') {
if (isset($_FILES['uploadedFile']) && $_FILES['uploadedFile']['error'] === UPLOAD_ERR_OK) {
  // get details of the uploaded file 
  $fileTmpPath = $_FILES['uploadedFile']['tmp_name'];
  $fileName = $_FILES['uploadedFile']['name'];
  $fileSize = $_FILES['uploadedFile']['size'];
  $fileType = $_FILES['uploadedFile']['type'];
  $fileNameCmps = explode(".", $fileName);
  $fileExtension = strtolower(end($fileNameCmps));
  if($fileExtension!=='csv'){ die('Загруженный файл не является csv файлом'); }
  

  $keys_field=str_replace(";","|",file_get_contents($_FILES['uploadedFile']['tmp_name']));
  $keys_field=str_replace(array("||\n","\n\n"),"",$keys_field);
  
}
}

$count_files=count_files(dirname(__FILE__));

$settings=explode("\n",file_get_contents("linkator_settings.txt"));
$_L=$settings[0]; if($_L==''){ $_L=8; }
$_N=$settings[1]; if($_N==''){ $_N=3; }
$_M=$settings[2]; if($_M==''){ $_M=4; }
$_P_LIMIT=$settings[3]; if($_P_LIMIT==''){ $_P_LIMIT=100; }


echo "Обнаружено htm/html файлов: <b>".$count_files."</b><br><br>";
echo "


<table>
<tr><td>
<form method='POST' action='linkator.php' enctype='multipart/form-data'>
Загрузить .csv (в кодировке utf-8):<br>
<input type='file' name='uploadedFile' />
    <input type='submit' name='uploadBtn' value='Загрузить' />
</form>

<form action='linkator.php' method='post'>
Ключевое слово|Лимит замен на сайте|Url для замены:<br>
<textarea rows='10' cols='85' name='keys'>".$keys_field."</textarea>
<br><br>
<input type='text' size='3' name='L' value='".$_L."' style='margin-top:5px;'> L — минимальная длина слова для обрезки окончания и поиска словоформ<br>
<input type='text' size='3' name='N' value='".$_N."' style='margin-top:5px;'> N — длина окончания, обрезаемого в исходном слове<br>
<input type='text' size='3' name='M' value='".$_M."' style='margin-top:5px;'> M — длина окончания для поиска словоформ<br>
<input type='text' size='3' name='P_LIMIT' value='".$_P_LIMIT."' style='margin-top:5px;'> P_Limit — % страниц сайта для простановки ссылок<br>
</td>
<td valign=top><br><br><br><br><br><br>
<fieldset style='border-color:#F00;'>Перед заменой необходимо обязательно сделать бекап
<br><br>";

if($backup_exist==false){ echo "Бекап не обнаружен <a href=linkator.php?backup=create style='fontcolor:red'>[Сделать бекап]</a>"; }
if($backup_exist==true){ echo "Бекап обнаружен './linkator_backup.zip' <a href=linkator.php?backup=restore>[Восстановить из бекапа]</a> <a href=linkator_backup.zip>[Скачать бекап]</a>"; }

echo "
</fieldset>
<br>
<center>";

if($backup_exist==true){ echo "<input type='submit' name='action' value='Поиск'>&nbsp;&nbsp;"; }
if($backup_exist==true && $_GET['show']=='report'){ echo "<input type='submit' name='action' value='Замена'>"; }
if($backup_exist==false){ echo "Операции не доступны пока не создан бекап"; }

echo "</center>
</td>
</tr>
</table>

</form>";


}

if(empty($argv[1])){

if($_POST['keys']){
   
  //write keys to file
  file_put_contents("linkator_keys.txt",$_POST['keys']);
  
  
  $_L=(int)$_POST['L'];
  $_N=(int)('-'.abs($_POST['N']));
  $_M=(int)$_POST['M'];
  $_P_LIMIT=(int)$_POST['P_LIMIT'];
  
  //write config to file
  file_put_contents("linkator_settings.txt",$_L."\n".$_POST['N']."\n".$_M."\n".$_P_LIMIT);
  
  
  

  if($_POST['action']=='Поиск'){ $act="search"; }
  if($_POST['action']=='Замена'){ $act="replace"; }
  
  $cmd="php -f ".$_SERVER['SCRIPT_FILENAME']." $act ".$_SERVER['DOCUMENT_ROOT']." $_L $_N $_M $_P_LIMIT > /dev/null &";
  system($cmd);
  echo "<script>  window.location.replace('/linkator.php?show=process&act=$act');</script>";
  
  //echo $cmd; die();
  
}

if($_GET['show']=='process'){
   
  $done_count=file_get_contents("linkator_stats.txt");
  echo "Обработано $done_count из $count_files. Для обновления: F5<br>";
  if((int)$done_count!==(int)$count_files){
  if($_GET['act']=='search'){ echo "<b style='color:red;'>Идет процесс поиска...</b><br>";}
  if($_GET['act']=='replace'){ echo "<b style='color:red;'>Идет процесс замены...</b><br>";}
  
  //exec("ps aux | grep ".$_SERVER['SCRIPT_FILENAME'],$process);
  //print_r($process);
  
  }else{
   echo "<a href=linkator.php?show=report><b>[Отчет]</b></a>";
  }
  
}

if($_GET['show']=='report'){
   $report=file_get_contents("linkator_result.txt");
   echo $report;
}


}

if($argv[1]=='search' or $argv[1]=='replace'){
   
   
  $_L=$argv[3];
  $_N=$argv[4];
  $_M=$argv[5];
  $_P_LIMIT=$argv[6];
  
  $dir=$argv[2];
  
  $action=$argv[1];
  
  $data=explode("\n",file_get_contents($argv[2]."/linkator_keys.txt"));
  foreach($data as $dt){
  $dt=str_replace(array("\n","\r","\t"),"",$dt);
  if($dt==""){ continue; }
  $dt=explode("|",$dt);
  $keys[]=$dt[0];
  $limits[$dt[0]]=$dt[1];
  $pages[$dt[0]]=$dt[2];
  $used[$dt[0]]=0;
  }
  
  $report="";
  $report.= '
  <div class="tabs">
    <input type="radio" name="tab-btn" id="tab-btn-1" value="" checked>
    <label for="tab-btn-1">Процесс</label>
    <input type="radio" name="tab-btn" id="tab-btn-2" value="">
    <label for="tab-btn-2">Общая статистика</label>
    <input type="radio" name="tab-btn" id="tab-btn-3" value="">
    <label for="tab-btn-3">Замена</label>


    <div id="content-1">';
  


    //echo "<b>Подготавливаем регулярки:</b><br>";
    


    foreach($keys as $i => $key){
     $key=str_replace(array("\n","\r","\t"),"",$key);
     $words=explode(" ",$key);
     $words_count[$key]=count($words);
     $bulk_words = array();

     $result=array();
     foreach ($words as $v) {
         if (mb_strlen($v) >= $_L) { 
          $v=mb_substr($v,0,$_N);
          $v=$v."[а-яё]{0,".$_M."}"; 
         }
         $result[]=$v;
     }
     $result=implode("[ -]",$result);
     //echo $result."<br>";
     $regexp[$key]=$result;
     }
     
     
     
    
    function sortarray(){
      global $used,$words_count,$limits;
      //echo "<br><b>Сортируем массив:</b><br>";
      
     array_multisort($used, SORT_ASC, $words_count, SORT_DESC);
     
     /*
     $report.= "<table>";
     foreach($used as $key=>$usd){
      if($usd==$limits[$key]){ $status_key ='<font color=red>'.$key.'</font>'; } else { $status_key=$key; }

      $report.= "<tr><td>".$status_key." &nbsp;&nbsp;&nbsp;</td><td>Used: ".$usd."</td><td>Limit: ".$limits[$key]."</td></tr>";
     }
     $report.= "</table><br>";
     */
     
    }
    
     
     sortarray();
     
     

    
    $all_files=array();
    get_content($dir,$all_files);
    $cn=1;
    foreach($all_files as $filename => $ct){
        $result=array();
        
      echo $filename."\n";
      file_put_contents("linkator_stats.txt","$cn");

      //check if optimism link exist
      if(preg_match("/<a href=\'https:\/\/www.optimism.ru/ui",$ct)){
        $optimism_link_exist[]=$filename;
        $cn++; continue;
      }
      
      //pages limit
      $current_percent=(count($found_urls) / count($all_files)) * 100;
      if($current_percent>$_P_LIMIT){
         $report.= "<br><br>Достигнут лимит % размещения ключей на страницах";
         file_put_contents("linkator_stats.txt",count($all_files));
         break;
      }

        $found_keys="";
        $found_strings="";
        
        foreach($used as $original_key => $usd){
        $exp=$regexp[$original_key];
        //$report.= $exp."<br>";
        if($used[$original_key]==$limits[$original_key]){ continue; }

        //$report.= $result;
      
       
        $global_exp="((?:(?:(?:<(?!(?:script|style|link|title|applet|button|canvas|code|fieldset|head|label|input|legend|listing|menu|nav|noscript|object|optgroup|option|output|samp|select|textarea|title|thead|tfoot|var|meta|a |h[1-6]))[a-z]{1,10}[^>]*>)|(?:<\/[a-z]{1,10}>))(?:[^>^<]*)?)(?:(?:(?:<(?!(?:script|style|link|title|applet|button|canvas|code|fieldset|head|label|input|legend|listing|menu|nav|noscript|object|optgroup|option|output|samp|select|textarea|title|thead|tfoot|var|meta|a |h[1-6]+))[a-z]{1,10}[^>]*>)|(?:<\/[a-z]{1,10}>))(?:[^>^<]*)?))\b(".$exp.")\b((?:(?:[^<^>]*)?(?:(?:<\/(?!(?:script|style|link|title|applet|button|canvas|code|fieldset|head|label|input|legend|listing|menu|nav|noscript|object|optgroup|option|output|samp|select|textarea|title|thead|tfoot|var|meta|a>|h[1-6]+>))[a-z]{1,10}[^>]*>)|(?:<[a-z]{1,10}[^>]*>)))(?:(?:[^<^>]*)?(?:(?:<\/(?!(?:script|style|link|title|applet|button|canvas|code|fieldset|head|label|input|legend|listing|menu|nav|noscript|object|optgroup|option|output|samp|select|textarea|title|thead|tfoot|var|meta|a>|h[1-6]+))[a-z]{1,10}[^>]*>)|(?:<[a-z]{1,10}[^>]*>))))";


        preg_match_all("/".$global_exp."/iu",$ct,$values);

        if(count($values[2])>0){
          $found_strings=$values[0][0];
          $found_keys=$values[2][0];
          $orig_key=$original_key;
          
          //replace in pages works
          if($action=='replace'){
            $set_link="$1<a href='".$pages[$original_key]."'>$2</a>$3";
            $new_html=preg_replace("/".$global_exp."/iu", $set_link, $ct, 1);
            
 
            file_put_contents($filename,$new_html);
            
            $replace_log[$filename]['orig_key']=$orig_key;
            $replace_log[$filename]['found_key']=$found_keys;
          }else{
            
            $replace_log=array();
            
          }
          
          
          
          
            break;        
          }
        }
        //print_r($found_keys);
        
        
        if($found_keys!==''){
          $replace_key=$found_keys;
        
        
          $used[$orig_key]=$used[$orig_key]+1;
          

          $found_urls[]=$filename;
          $found_urls_global[$filename]['orig_key']=$orig_key;
          $found_urls_global[$filename]['found_key']=$replace_key;
          

          
        }else{
          $not_found_urls[]=$filename;
        }
        
        
        $link=str_replace('/var/www/drops/data/www/','https://',$filename);
        $report.= "<br><a href=".$link." target=_blank><b>".$link."</b></a> <b>".$filename."</b>  --><br>";
        if($found_keys!==''){ $report.= "Найден ключ [$found_keys] оригинал: [$orig_key] в строке:<br>"; 
        $report.= "<textarea rows='5' cols='180'>".$found_strings."</textarea>";
        }else{
            $report.= "Ключей не найдено";
        }

        $report.= "<hr>";
    
     sortarray();
     $cn++;
    }
    
    
    
    
    $report.= '
    </div>
    <div id="content-2">';
   
    foreach($used as $key=>$usd){
      if($usd==$limits[$key]){ $total_placed[]=$key." | Размещен $usd раз при лимите в ".$limits[$key]; }
      if($usd<$limits[$key] && $usd!==0){ $partialy_placed[]=$key." | Размещен $usd раз при лимите в ".$limits[$key]; }
      if($usd==0){ $not_placed[]=$key." | Размещен $usd раз при лимите в ".$limits[$key]; }
    }
    
    $report.= "Страницы с найденными ключами:<br><br>";
    $report.= "<table>";
    $report.= "<tr><td><b>Страница</b></td><td><b>Исходный ключ</b></td><td><b>Найденный ключ</b></td></tr>";
    foreach($found_urls_global as $file => $keys){
    $link=str_replace('/var/www/drops/data/www/','https://',$file);
    $report.= "<tr><td><a href='".$link."' target=_blank>".$link."</a></td><td>".$keys['orig_key']."</td><td>".$keys['found_key']."</td></tr>";
    }
    $report.= "</table><br><br>";
    
    
    $report.= "<table>
    <tr><td>Всего страниц:<hr></td><td>".count($all_files)."<hr></td></td></tr>
    <tr><td>Всего страниц c найдеными ключами:</td><td>".count($found_urls)." = ".round((count($found_urls) / count($all_files)) * 100,1)."%</td></td></tr>
    <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($found_urls as $fu){
      $link=str_replace('/var/www/drops/data/www/','https://',$fu);
      $report.= $link."\n";
    }
    $report.= "</textarea></td></tr>
    <tr><td>Всего страниц с не найденными ключами:</td><td>".count($not_found_urls)."</td></td>
        <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($not_found_urls as $fu){
      $link=str_replace('/var/www/drops/data/www/','https://',$fu);
      $report.= $link."\n";
    }
    $report.= "</textarea></td></tr>
    <tr><td>Всего страниц где уже установлена ссылка на optimism.ru (поиск ключей не производился):</td><td>".count($optimism_link_exist)."</td></td>
        <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($optimism_link_exist as $fu){
      $link=str_replace('/var/www/drops/data/www/','https://',$fu);
      $report.= $link."\n";
    }
    $report.= "</textarea></td></tr>
    <tr><td colspan=2><br><br><br></td></tr>
    <tr><td>Всего ключей:<hr></td><td>".count($used)."<hr></td></td></tr>
    <tr><td>Ключи полностью размещенные:</td><td>".count($total_placed)."</td></td></tr>
    <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($total_placed as $fu){

      $report.= $fu."\n";
    }
    $report.= "</textarea></td></tr>
    <tr><td>Ключи частично размещенные:</td><td>".count($partialy_placed)."</td></td></tr>
    <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($partialy_placed as $fu){

      $report.= $fu."\n";
    }
    $report.= "</textarea></td></tr>
    <tr><td>Ключи совсем не размещенные:</td><td>".count($not_placed)."</td></td></tr>
    <tr><td colspan=2><textarea rows='10' cols='150'>";
    foreach($not_placed as $fu){

      $report.= $fu."\n";
    }
    $report.= "</textarea></td></tr>
    </table>";
    
    $report.= '</div>';
    
    $report.= '<div id="content-3">';
    if(count($replace_log)>0){
      $report.= "<b>Всего замен произведено: ".count($replace_log)."</b><br><br>";

    $report.= "<table>";
    $report.= "<tr><td><b>Страница</b></td><td><b>Исходный ключ</b></td><td><b>Найденный ключ</b></td></tr>";
    foreach($replace_log as $file => $keys){
    $link=str_replace('/var/www/drops/data/www/','https://',$file);
    $report.= "<tr><td><a href='".$link."' target=_blank>".$link."</a></td><td>".$keys['orig_key']."</td><td>".$keys['found_key']."</td></tr>";
    }
    $report.= "</table><br><br>";
    $report.= "<script>alert('Замена произведена!');</script>";
    }else{
      $report.= "Замена не производилась";
    }
    
    $report.= '</div>';
    $report.= '</div>';
    
    
    $report.= "</body></html>";
    
    
    file_put_contents("linkator_result.txt",$report);

}



?>