К написанию, этого анализатора, меня подтолкнул просто «спортивный» интерес. Хотя в сети очень много таких сервисов, которые предоставляют больше информации о ресурсе. Хотел показать пару функции для определения основных данных о сайте (PageRank, Тиц, Alexa Rank и тд.).

Первой функцией будет определение PageRank сайта

  1. define("GOOGLE_MAGIC", 0xE6359A60);
  2.  
  3. function zeroFill($a, $b){
  4.     $z = hexdec(80000000);
  5.     if ($z & $a){
  6.         $a = ($a>>1);
  7.         $a &= (~$z);
  8.         $a |= 0x40000000;
  9.         $a = ($a>>($b-1));
  10.     }else{
  11.         $a = ($a>>$b);
  12.     }
  13.     return $a;
  14. }
  15.  
  16. function mix($a,$b,$c) {
  17.     $a -= $b; $a -= $c; $a ^= (zeroFill($c,13));
  18.     $b -= $c; $b -= $a; $b ^= ($a<<8);
  19.     $c -= $a; $c -= $b; $c ^= (zeroFill($b,13));
  20.     $a -= $b; $a -= $c; $a ^= (zeroFill($c,12));
  21.     $b -= $c; $b -= $a; $b ^= ($a<<16);
  22.     $c -= $a; $c -= $b; $c ^= (zeroFill($b,5));
  23.     $a -= $b; $a -= $c; $a ^= (zeroFill($c,3));
  24.     $b -= $c; $b -= $a; $b ^= ($a<<10);
  25.     $c -= $a; $c -= $b; $c ^= (zeroFill($b,15));
  26.     return array($a,$b,$c);
  27. }
  28.  
  29. function GoogleCH($url, $length=null, $init=GOOGLE_MAGIC){
  30.     if(is_null($length)){
  31.         $length = sizeof($url);
  32.     }
  33.     $a = $b = 0x9E3779B9;
  34.     $c = $init;
  35.     $k =  0;
  36.     $len = $length;
  37.     while($len >= 12){
  38.         $a += ($url[$k+ 0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
  39.         $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
  40.         $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
  41.         $mix = mix($a,$b,$c);
  42.         $a = $mix[ 0]; $b = $mix[1]; $c = $mix[2];
  43.         $k += 12;
  44.         $len -= 12;
  45.     }
  46.     $c += $length;
  47.     switch($len){
  48.         case 11: $c+=($url[$k+10]<<24);
  49.         case 10: $c+=($url[$k+9]<<16);
  50.         case 9 : $c+=($url[$k+8]<<8);
  51.         case 8 : $b+=($url[$k+7]<<24);
  52.         case 7 : $b+=($url[$k+6]<<16);
  53.         case 6 : $b+=($url[$k+5]<<8);
  54.         case 5 : $b+=($url[$k+4]);
  55.         case 4 : $a+=($url[$k+3]<<24);
  56.         case 3 : $a+=($url[$k+2]<<16);
  57.         case 2 : $a+=($url[$k+1]<<8);
  58.         case 1 : $a+=($url[$k+ 0]);
  59.     }
  60.     $mix = mix($a,$b,$c);
  61.     return $mix[2];
  62. }
  63.  
  64. function strord($string)
  65. {
  66.     for ($i =  0; $i < strlen($string); $i++)
  67.     {
  68.         $result[$i] = ord($string{$i});
  69.     }
  70.     return $result;
  71. }
  72.  
  73. function get_google_pr($url, $proxy = '')
  74. {
  75.     $url = 'info:http://' . $url;
  76.     $checksum = GoogleCH(strord($url));
  77.     $google_url = sprintf('/search?client=navclient-auto&ch=6%u&features=Rank&q=' . $url, $checksum);
  78.  
  79.     $host = 'www.google.com';
  80.     $result = '';
  81.     if ($proxy == '')
  82.     {
  83.         $fp = @fsockopen($host, 80, $errno, $errstr, 20);
  84.         if ($fp)
  85.         {
  86.             $out = '';
  87.             $out .= "GET $google_url HTTP/1.1\r\n";
  88.             $out .= "Host: $host\r\n";
  89.             $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-icq, application/x-shockwave-flash, */*\r\n";
  90.             $out .= "Accept-Language: ru\r\n";
  91.             $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
  92.             $out .= "Connection: Close\r\n\r\n";
  93.             fwrite($fp, $out);
  94.             while (!feof($fp))
  95.                $result .= fgets($fp, 1024);
  96.  
  97.             fclose($fp);
  98.         }
  99.     }
  100.     else
  101.     {
  102.         preg_match('/^(?:http\:\/\/)?(.+)\:(\d{0,5})$/is', $proxy, $arr);
  103.         $ip = $arr[1];
  104.         $port = $arr[2];
  105.  
  106.         $fp = @fsockopen($ip, $port, $errno, $errstr, 20);
  107.         if ($fp)
  108.         {
  109.             $out = '';
  110.             $out .= "GET http://$host$google_url HTTP/1.1\r\n";
  111.             $out .= "Host: $host\r\n";
  112.             $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-icq, application/x-shockwave-flash, */*\r\n";
  113.             $out .= "Accept-Language: ru\r\n";
  114.             $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
  115.             $out .= "Connection: Close\r\n\r\n";
  116.             fwrite($fp, $out);
  117.             while (!feof($fp))
  118.                $result .= fgets($fp, 1024);
  119.  
  120.             fclose($fp);
  121.         }
  122.     }
  123.  
  124.     if ($result != '')
  125.     {
  126.         if (preg_match('/Rank_\d+\:\d+\:(\d+)/is', $result, $arr))
  127.             return intval($arr[1]);
  128.         else
  129.             return '-';
  130.     }
  131.     else
  132.         return '-';
  133. }
  134.  
  135. function google_pr($url, $proxy = '')
  136. {
  137.     if (!is_array($url))
  138.         $url = array($url);
  139.  
  140.     $pr_arr = array();
  141.  
  142.     foreach ($url as $key => $val)
  143.     {
  144.         if (preg_match('/^http\:\/\//is', $val))
  145.             $val = substr($val, 7);
  146.  
  147.         $url_www = $val;
  148.         if (preg_match('/^www\./is', $val))
  149.             $val = str_replace('www.', '', $val);
  150.         else
  151.             $url_www = 'www.' . $val;
  152.  
  153.         $pr = get_google_pr($val, $proxy);
  154.  
  155.         $pr_www = get_google_pr($url_www, $proxy);
  156.  
  157.         if ($pr_www > $pr)
  158.             $pr_arr[] = $pr_www;
  159.         else
  160.             $pr_arr[] = $pr;
  161.     }
  162.     rsort($pr_arr, SORT_NUMERIC);
  163.     return $pr_arr[ 0];
  164. }
  165.  
  166. function curl_getsource ( $url )
  167. {
  168.   $curl = curl_init();
  169.   curl_setopt ( $curl, CURLOPT_URL, $url );
  170.   curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
  171.   $source = curl_exec ( $curl );
  172.   curl_close ( $curl );
  173.   return $source;
  174. }

Пример использования:

  1. if (!eregi("://", $_GET['url'])) $url = "http://".$_GET['url'];
  2. else $url = $_GET['url'];
  3.  
  4. $pr = google_pr(trim($url));
  5.  
  6. echo 'PR сайта '.$url.': '.$pr;

Ждем продолжения поста…