Анализ сайта средствами PHP (определяем PR)
К написанию, этого анализатора, меня подтолкнул просто «спортивный» интерес. Хотя в сети очень много таких сервисов, которые предоставляют больше информации о ресурсе. Хотел показать пару функции для определения основных данных о сайте (PageRank, Тиц, Alexa Rank и тд.).
Первой функцией будет определение PageRank сайта
- define("GOOGLE_MAGIC", 0xE6359A60);
- function zeroFill($a, $b){
- $z = hexdec(80000000);
- if ($z & $a){
- $a = ($a>>1);
- $a &= (~$z);
- $a |= 0x40000000;
- $a = ($a>>($b-1));
- }else{
- $a = ($a>>$b);
- }
- return $a;
- }
- function mix($a,$b,$c) {
- $a -= $b; $a -= $c; $a ^= (zeroFill($c,13));
- $b -= $c; $b -= $a; $b ^= ($a<<8);
- $c -= $a; $c -= $b; $c ^= (zeroFill($b,13));
- $a -= $b; $a -= $c; $a ^= (zeroFill($c,12));
- $b -= $c; $b -= $a; $b ^= ($a<<16);
- $c -= $a; $c -= $b; $c ^= (zeroFill($b,5));
- $a -= $b; $a -= $c; $a ^= (zeroFill($c,3));
- $b -= $c; $b -= $a; $b ^= ($a<<10);
- $c -= $a; $c -= $b; $c ^= (zeroFill($b,15));
- return array($a,$b,$c);
- }
- function GoogleCH($url, $length=null, $init=GOOGLE_MAGIC){
- if(is_null($length)){
- $length = sizeof($url);
- }
- $a = $b = 0x9E3779B9;
- $c = $init;
- $k = 0;
- $len = $length;
- while($len >= 12){
- $a += ($url[$k+ 0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
- $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
- $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
- $mix = mix($a,$b,$c);
- $a = $mix[ 0]; $b = $mix[1]; $c = $mix[2];
- $k += 12;
- $len -= 12;
- }
- $c += $length;
- switch($len){
- case 11: $c+=($url[$k+10]<<24);
- case 10: $c+=($url[$k+9]<<16);
- case 9 : $c+=($url[$k+8]<<8);
- case 8 : $b+=($url[$k+7]<<24);
- case 7 : $b+=($url[$k+6]<<16);
- case 6 : $b+=($url[$k+5]<<8);
- case 5 : $b+=($url[$k+4]);
- case 4 : $a+=($url[$k+3]<<24);
- case 3 : $a+=($url[$k+2]<<16);
- case 2 : $a+=($url[$k+1]<<8);
- case 1 : $a+=($url[$k+ 0]);
- }
- $mix = mix($a,$b,$c);
- return $mix[2];
- }
- function strord($string)
- {
- for ($i = 0; $i < strlen($string); $i++)
- {
- $result[$i] = ord($string{$i});
- }
- return $result;
- }
- function get_google_pr($url, $proxy = '')
- {
- $url = 'info:http://' . $url;
- $checksum = GoogleCH(strord($url));
- $google_url = sprintf('/search?client=navclient-auto&ch=6%u&features=Rank&q=' . $url, $checksum);
- $host = 'www.google.com';
- $result = '';
- if ($proxy == '')
- {
- $fp = @fsockopen($host, 80, $errno, $errstr, 20);
- if ($fp)
- {
- $out = '';
- $out .= "GET $google_url HTTP/1.1\r\n";
- $out .= "Host: $host\r\n";
- $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-icq, application/x-shockwave-flash, */*\r\n";
- $out .= "Accept-Language: ru\r\n";
- $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
- $out .= "Connection: Close\r\n\r\n";
- fwrite($fp, $out);
- while (!feof($fp))
- $result .= fgets($fp, 1024);
- fclose($fp);
- }
- }
- else
- {
- preg_match('/^(?:http\:\/\/)?(.+)\:(\d{0,5})$/is', $proxy, $arr);
- $ip = $arr[1];
- $port = $arr[2];
- $fp = @fsockopen($ip, $port, $errno, $errstr, 20);
- if ($fp)
- {
- $out = '';
- $out .= "GET http://$host$google_url HTTP/1.1\r\n";
- $out .= "Host: $host\r\n";
- $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-icq, application/x-shockwave-flash, */*\r\n";
- $out .= "Accept-Language: ru\r\n";
- $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
- $out .= "Connection: Close\r\n\r\n";
- fwrite($fp, $out);
- while (!feof($fp))
- $result .= fgets($fp, 1024);
- fclose($fp);
- }
- }
- if ($result != '')
- {
- if (preg_match('/Rank_\d+\:\d+\:(\d+)/is', $result, $arr))
- return intval($arr[1]);
- else
- return '-';
- }
- else
- return '-';
- }
- function google_pr($url, $proxy = '')
- {
- if (!is_array($url))
- $url = array($url);
- $pr_arr = array();
- foreach ($url as $key => $val)
- {
- if (preg_match('/^http\:\/\//is', $val))
- $val = substr($val, 7);
- $url_www = $val;
- if (preg_match('/^www\./is', $val))
- $val = str_replace('www.', '', $val);
- else
- $url_www = 'www.' . $val;
- $pr = get_google_pr($val, $proxy);
- $pr_www = get_google_pr($url_www, $proxy);
- if ($pr_www > $pr)
- $pr_arr[] = $pr_www;
- else
- $pr_arr[] = $pr;
- }
- rsort($pr_arr, SORT_NUMERIC);
- return $pr_arr[ 0];
- }
- function curl_getsource ( $url )
- {
- $curl = curl_init();
- curl_setopt ( $curl, CURLOPT_URL, $url );
- curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 );
- $source = curl_exec ( $curl );
- curl_close ( $curl );
- return $source;
- }
Пример использования:
- if (!eregi("://", $_GET['url'])) $url = "http://".$_GET['url'];
- else $url = $_GET['url'];
- $pr = google_pr(trim($url));
- echo 'PR сайта '.$url.': '.$pr;
Ждем продолжения поста…