<?php

// Анализатор «Перспектива» 
// Сделано Тормозом :)
// http://BrokenBrake.biz/
// В сотрудничестве с фрилансером
// Вячеславом (http://www.free-lance.ru/users/trunker)

//header('Content-Type: text/plain; charset=UTF-8');
header('Content-Type: text/html; charset=UTF-8');
mb_internal_encoding("UTF-8");

$error = $password = '';

$host = $_SERVER['HTTP_HOST'];

if (!empty($_POST))
{
	$in = trim($_POST['URL']);
if (!(strpos($in, 'http://') === 0))
	$in = 'http://'.$in;

$host = parse_url($in, PHP_URL_HOST);
$host = str_replace('www.', '', $host);
$hostUnDot = str_replace('.', '', $host);
$password = trim($_POST['password']);
if (!empty($password))
	setcookie($hostUnDot, $password, time()+5184000); // Примерно 2 месяца
}

$host = str_replace('www.', '', $host);
$hostUnDot = str_replace('.', '', $host);
if (empty($password) AND isset($_COOKIE[$hostUnDot]))
	$password = $_COOKIE[$hostUnDot];

/* Number of maximum statistic pages on liru. */
define('MAXPAGENUM', '5');
/* Timeout for IO-operations in seconds. */
define('IOTIMEOUT', '2');

function get_liru_statistic($SITE, $PASSWORD="")
/* Returs liru statistic as array. If liru' statistic isn't protected by
* password, call this function with one parameter. */
{
 function _get_page($url)
 /* Just get content of page by URL */
 {
	  $data = "";
	  if (($fp = @fopen($url, 'r')))
	  {
			stream_set_timeout($fp, IOTIMEOUT);
			while (!feof($fp)) $data .= fread($fp, 4096);
	  }
	  return $data;
 }

 function get_first_page($site, $password)
 /* Get first liru page. Session ID is returned with this page. */
 {
        $url = "http://pda.liveinternet.ru/stat/$site/"
        ."search_share.html?period=week;page=1;password=$password";
        return _get_page($url);
    }

    function parse_ssid($page)
    /* Parse page to get just Session ID. */
    {
        return preg_match("/session=([\d]+)[^\d]/", $page, $m) ? $m[1] : 0;
    }

    function get_page($site, $ssid, $pagenum)
    /* Get numbered page from liru by ssid and number of page. */
    {
        $url = "http://pda.liveinternet.ru/stat/$site/"
            ."search_share.html?period=week;page=$pagenum;"
            ."session=$ssid";
        return _get_page($url);
    }

    function get_report_data($page)
    /* Cut from page report only. */
    {
        $start = strstr($page, "<!-- prev, next links  -->");
        $end = strpos($start, "<!-- table  -->");
        return trim(substr($start, 0, $end));
    }

    function parse_draft($draft)
    /* Parse draft and return array. */
    {
        preg_match_all("|<tr.*/tr>|U", $draft, $m);
        $cnt = 0;
        foreach ($m[0] as $line)
        {
            if (strstr($line, "<b>")) continue;
            preg_match("|<td[^>]+>(.*)</td>[^<]*<td>(.*)</td>[^<]*<td>(.*)%[\s]*</td>[^<]*<td>(.*)</td>|U", $line, $l);
            #print "$l[1] $l[2] $l[3] $l[4]\n";
            $stat[$cnt]["request"] = trim($l[1]);
            $stat[$cnt]["counter"] = trim($l[2]);
            $stat[$cnt]["portion"] = trim($l[3]);
            $stat[$cnt++]["place"] = trim($l[4]);
        }
        return $stat;
    }

    if (!($page1 = get_first_page($SITE, $PASSWORD)))
        return "Couldn't connect to lirushechka :-)";

    if (!($ssid = parse_ssid($page1)) && $PASSWORD != "")
        return "Couldn't get session. (Check password or site-name.)";

    /* Get needed number of pages and parse it to draft. */
    $draft = get_report_data($page1);
    for ($n = 2; $n < MAXPAGENUM; $n++)
    {
        $page = get_page($SITE, $ssid, $n);
        if (strstr($page, "nFilePageSize == 0")) break;
        $draft .= get_report_data($page);
    }

    return parse_draft($draft);
}


$raw = get_liru_statistic($host, $password);


if (empty($raw))
{
	$result = "<p class='ahtung'>
		Сайт $host не зарегистрирован в статистике liveinternet,
		либо под паролем, и вы его неправильно набрали.
		Либо поисковый трафик на сайте слишком мал, его недостаточно для анализа.
		</p>";
}
else
{	
	
foreach ($raw as $val)
{
	if ($val['place'] == 1)
	{
		$temp[] = $val['portion'];
	}
	else
	{
		$val['portion'] = str_replace(' ', '', $val['portion']);
		if ($val['portion'] < 1) $val['portion'] = 1;
		if (!strpos($val['request'], ']')) 	$new[] = $val;
	}
}


# Вычесление медианы массива (http://brokenbrake.biz/2009/09/14/mediana)
function mediana($arr)
{
sort($arr);
$count = count($arr);
$n1 = floor($count / 2);
$n2 = $n1 + 1;
return ($arr[$n1] + $arr[$n2]) / 2;
} # echo mediana(array(5,5,5,5,5,5,10000)); # 5

$mediana =  mediana($temp);

foreach ($new as $val)
{
	$specific = ($val['counter'] / $val['portion']) * $mediana;
	$potential = round(($specific - $val['counter']) / 7, -1);
	if ($potential > 10)
		$result[$potential] = $val['request'];
}
if (!empty($result))
{
krsort($result);
//print_r($result);
//print_r($new);

foreach ($result as $key => $val)
{
	$cnt = $cnt + 1;
	$eo = 'eo'.($cnt & 1);
	$sum += $key;
	$q = urlencode($val);
	$yURL = "http://yandex.ru/yandsearch?text=$q";
	$gURL = "http://www.google.ru/search?q=$q";
	$rows .= "<tr class='$eo'>
		<td>$val</td>
		<td>+$key</td>
		<td><a href='$yURL'>Я</a> <a href='$gURL'>G</a></td>
		</tr>";
}

$table = "<table>
	<tr>
	<th>Поисковый запрос</th>
	<th>Суточный потенциал</th>
	<th>Выдача</th>
	</tr>
	$rows</table>";


	$result = "$table
	<footer>
	<p>В итоге улучшение позиций по данным поисковым запросам
	может дать суточный прирост трафика от $sum уникальных посетителей.
	Успехов в продвижении! :)</p>
	<p>«Перспективу» сделал Тормоз. <a href='http://brokenbrake.biz/2009/11/16/perspective'
	title='Свободная цена'>Спасибо за покупку</a>.</p>
	</footer>";
}
else // Если $result пустой
{
	$result = "<p class='ahtung'>Перспективы по запросам из «доли поискового трафика» 
		для этого сайта не стоят внимания (менее 10 уников в сутки на каждый запрос).</p>";
}
}

echo "
	<!doctype HTML>
	<html>

	<head>
	<meta charset='UTF-8' />
	<title>Перспектива</title>
	<style>
	html, body {padding:0; margin:0; 
background:#ddd;
color:black;
text-align:left;
font-size:x-large;
font-family:sans-serif;}
header span {font-size:x-large;}
fieldset * {font-size:large;}
header, footer {display:block; padding:.6em 1em;}
table {text-align:left;
width:100%;
line-height:1.6em;
border-collapse:collapse;
background:white;
color:black;}
td, th {padding:0 .9em;}
.eo0 {background:#eee;}
.eo1 {background:#eaeaea;}
tr:hover {background:#FFF;}
label {white-space:nowrap; padding-right:.6em;}
input[type='password'] {width:4em;}
.ahtung {padding:1em; color:red;}
</style>
</head>

<body>

<header>
	<h1>Перспектива <span>для сайта $host</span></h1>
<form method='post'>
<fieldset>
<legend>Для другого сайта</legend>
<label>URL
<input name='URL' />
</label>
<label>Пароль от статистики
<input name='password' type='password' />
</label>
<button>Анализируй это</button>
</fieldset>
</form>
	</header>
$result
	</body>
	</html>";

