| Current Path : /var/www/element/data/www/opter.ru/ |
| 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=""> <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='Поиск'> "; }
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." </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);
}
?>