<?php
#
# SEO Analysis
#
# Copyright (C) 2007-2008 HSDN <info@hsdn.org>
# http://www.hsdn.org
#
# @descr Получение seo-данных
# @version 1.0.3

/*
 * Google PR
 */

/**
 * Преобразовать строку в сумму
 *
 * @param string $Str
 * @param int $Check
 * @param int $Magic
 * @return int
 */
function StrToNum($Str, $Check, $Magic) 
{
    
$Int32Unit = 4294967296;

    
$length = strlen($Str);
    for (
$i = 0; $i < $length; $i++) 
    {
        
$Check *= $Magic;     
        if (
$Check >= $Int32Unit) 
        {
            
$Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
            
$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
        }
        
$Check += ord($Str{$i}); 
    }
    return 
$Check;
}

/**
 * Получить URL-хеш для
 *
 * @param string $String
 * @return int
 */
function HashURL($String) 
{
    
$Check1 = StrToNum($String, 0x1505, 0x21);
    
$Check2 = StrToNum($String, 0, 0x1003F);

    
$Check1 >>= 2;     
    
$Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
    
$Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
    
$Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);    
    
    
$T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
    
$T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );

    return (
$T1 | $T2);
}

/**
 * Подготовить хеш-сумму
 *
 * @param int $Hashnum
 * @return int
 */
function CheckHash($Hashnum) 
{
    
$CheckByte = 0;
    
$Flag = 0;

    
$HashStr = sprintf('%u', $Hashnum);
    
$length = strlen($HashStr);
    
    for (
$i = $length - 1;  $i >= 0;  $i --) 
    {
        
$Re = $HashStr{$i};
        if (
1 === ($Flag % 2)) 
        {              
            
$Re += $Re;     
            
$Re = (int)($Re / 10) + ($Re % 10);
        }
        
$CheckByte += $Re;
        
$Flag ++;    
    }

    
$CheckByte %= 10;
    if (
0 !== $CheckByte) 
    {
        
$CheckByte = 10 - $CheckByte;
        if (
1 === ($Flag % 2) ) 
        {
            if (
1 === ($CheckByte % 2)) 
            {
                
$CheckByte += 9;
            }
            
$CheckByte >>= 1;
        }
    }
    return 
'7'.$CheckByte.$HashStr;
}

/**
 * Получить полную хеш-сумму из URL
 *
 * @param string $url
 * @return int
 */
function getch($url) 
{ 
    return 
CheckHash(HashURL($url)); 
}

/**
 * Получить Google PR
 *
 * @param string $url
 * @return mixed
 */
function get_gpr($url) 
{
    
$googlehost = "toolbarqueries.google.com";
    
$googleua = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5";

    
$ch = getch($url);
    
$fp = fsockopen($googlehost, 80, $errno, $errstr, 30);
    if (!
$fp) 
    {
        return 
false;
    }
    else
    {
        
$out = "GET /search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url HTTP/1.1\r\n";
        
$out .= "User-Agent: $googleua\r\n";
        
$out .= "Host: $googlehost\r\n";
        
$out .= "Connection: Close\r\n\r\n";
    
        
fwrite($fp, $out);

        while (!
feof($fp)) 
        {
            
$data = fgets($fp, 128);
            
$pos = strpos($data, "Rank_");

            if(
$pos === false) { } 
            else
            {
                
$pr = substr($data, $pos + 9);
                
$pr = trim($pr);
                
$pr = str_replace("\n",'',$pr);
            }
       }
       
fclose($fp);

       if(!
$pr) $pr = "0";
    }
    return 
$pr;
}


/*
 * Yanex CA/CY
 */

/**
 * Получить Yanex CA/CY
 *
 * @param string $url
 * @return mixed
 */
function get_yacy($url)
{
    
$str = @file("http://bar-navig.yandex.ru/u?ver=2&show=32&url=".$url);
    if(
$str == false) 
    { 
        return 
false; 
    }
    else
    {
        
$str = join("",$str);
        
$cyres = preg_match("/value=\"(.\d*)\"/", $str, $cyret);
        
$cares = preg_match("/topic title=\"Тема: (.*)\" url/", $str, $caret);
        if(
$cyres < 1) 
        {
            
$cy = "0";
        }
        else
        {
            
$cy = $cyret[1];
        }
        if(
$cares < 1) 
        {
            
$ca = "нет"; 
        }
        else
        {
            
$ca = html_entity_decode(strip_tags($caret[1]));
        }

    }
    return array(
$cy,$ca);
}


/*
 * Alexa RR/LP
 */

/**
 * Получить Alexa RR/LP
 *
 * @param string $url
 * @return mixed
 */
function get_alexa($url)
{
    
$str = @file("http://data.alexa.com/data?cli=10&dat=snbamz&url=".$url);
    if(
$str == false) 
    { 
        return 
false; 
    }
    else
    {
        
$str = join("", $str);
        
$prres = preg_match("/<POPULARITY URL=\".*\" TEXT=\"(.*)\"\/>/", $str, $prret);
        
$rrres = preg_match("/<REACH RANK=\"(.*)\"\/>/", $str, $rrret);

        if(
$prres < 1 || $rrres < 1) 
        {
            
$pr = "0"; 
            
$rr = "0"; 
        }
        else
        {
            
$pr = $prret[1];
            
$rr = $rrret[1];
        }
    }
    return array(
$pr,$rr);
}


/*
 * Бэки
 */

/**
 * Получить Бэки
 *
 * @param string $url
 * @param string $engine
 * @return mixed
 */
function get_backlinks($url,$engine)
{
    switch(
$engine)
    {
        case 
"google":
            
$address = "http://www.google.com/search?as_lq=".$url."&btnG=Search";
            
$pattern = "/of about \<b\>([0-9\,]+)\<\/b\>/si";
            break;

        case 
"altavista":
            
$address = "http://www.altavista.com/web/results?q=link%3A".$url;
            
$pattern = "/found ([0-9\,]+) results/si";
            break;

        case 
"alltheweb":
            
$address = "http://www.alltheweb.com/search?q=link%3A".$url;
            
$pattern = "/\<span class\=\"ofSoMany\"\>([0-9\,]+)\<\/span\>/si";
            break;

    }

    
$str = @file($address);
    if(
$str == false) 
    { 
        return 
false; 
    }
    else
    {
        
$str = join("", $str);
        
$res = preg_match($pattern, $str, $ret);

        if(
$res < 1) 
        {
            
$bl = "0"; 
        }
        else
        {
            
$bl = $ret[1];
        }
    }
    return 
$bl;
}


/**
 * Получить результаты
 *
 * @param string $url
 * @return string
 */
function get_seo($url) 
{
    
$pr = get_gpr($url);
    
$ya = get_yacy(urlencode($url));
    
$cy = $ya[0];
    
$ca = $ya[1];
    
$alexa = get_alexa(urlencode($url));
    
$alp = $alexa[0];
    
$arr = $alexa[1];

    if(
strlen($pr) == 0) $pr = "не известно"; else $pr .= "/10";
    if(
strlen($wr) == 0) $wr = "не известно";
    if(
strlen($wtr) == 0) $wtr = "не известно";
    if(
strlen($alp) == 0) $alp = "не известно";
    if(
strlen($arr) == 0) $arr = "не известно";

    
$out = "SEO-анализ сайта $url\n\n";
    
$out .= "Google PR: $pr\n";
    
$out .= "Yandex тИЦ: $cy\n";
    
$out .= "Yandex Каталог: $ca\n";
    
$out .= "Alexa RR: $arr\n";
    
$out .= "Alexa LP: $alp\n";

    if(!
$google_bl = get_backlinks(urlencode($url),"google")) $google_bl = "не известно";
    if(!
$altavista_bl = get_backlinks(urlencode($url),"altavista")) $altavista_bl = "не известно";
    if(!
$alltheweb_bl = get_backlinks(urlencode($url),"alltheweb")) $alltheweb_bl = "не известно";

    
$out .= "Google Бэки: $google_bl\n";
    
$out .= "Altavista Бэки: $altavista_bl\n";
    
$out .= "Alltheweb Бэки: $alltheweb_bl\n";

    return 
$out;
}

/*
 * Пример результаты
 */
echo nl2br(get_seo('http://www.ya.ru'));

?>