<?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($String0x15050x21);
    
$Check2 StrToNum($String00x1003F);

    
$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)) <<) | ($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 (
=== ($Flag 2)) 
        {              
            
$Re += $Re;     
            
$Re = (int)($Re 10) + ($Re 10);
        }
        
$CheckByte += $Re;
        
$Flag ++;    
    }

    
$CheckByte %= 10;
    if (
!== $CheckByte
    {
        
$CheckByte 10 $CheckByte;
        if (
=== ($Flag 2) ) 
        {
            if (
=== ($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($googlehost80$errno$errstr30);
    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($fp128);
            
$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 || $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'));

?>