Simple PageRank Retrieval

Discussion in 'Programming' started by -NB-, Feb 10, 2007.

  1. #1
    This is a simple script that will retrieve the Google PageRank of any given website.
    <?php
    	define('GOOGLE_MAGIC', 0xE6359A60);
    	class pagerank extends pagerank32 {
    		function xor32 ($a, $b) {
    			return $this->int32($a) ^ $this->int32($b);
    		}
    		function int32 ($x) {
    			return unserialize("i:$x;");
    		}
    		function mix ($a,$b,$c) {
    			$a -= $b; $a -= $c; $a = $this->xor32($a, $this->zeroFill($c, 13));
    			$b -= $c; $b -= $a; $b = $this->xor32($b, $a << 8);
    			$c -= $a; $c -= $b; $c = $this->xor32($c, $this->zeroFill($b, 13));
    			$a -= $b; $a -= $c; $a = $this->xor32($a, $this->zeroFill($c, 12));
    			$b -= $c; $b -= $a; $b = $this->xor32($b, $a << 16);
    			$c -= $a; $c -= $b; $c = $this->xor32($c, $this->zeroFill($b, 5));
    			$a -= $b; $a -= $c; $a = $this->xor32($a, $this->zeroFill($c, 3));
    			$b -= $c; $b -= $a; $b = $this->xor32($b, $a << 10);
    			$c -= $a; $c -= $b; $c = $this->xor32($c, $this->zeroFill($b, 15));
    			return array($a, $b, $c);
    		}
    	}
    	class pagerank32 {
    		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 ^= ($this->zeroFill($c, 13));
    			$b -= $c; $b -= $a; $b ^= ($a << 8);
    			$c -= $a; $c -= $b; $c ^= ($this->zeroFill($b, 13));
    			$a -= $b; $a -= $c; $a ^= ($this->zeroFill($c, 12));
    			$b -= $c; $b -= $a; $b ^= ($a << 16);
    			$c -= $a; $c -= $b; $c ^= ($this->zeroFill($b, 5));
    			$a -= $b; $a -= $c; $a ^= ($this->zeroFill($c, 3));
    			$b -= $c; $b -= $a; $b ^= ($a << 10);
    			$c -= $a; $c -= $b; $c ^= ($this->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 = $this->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 = $this->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 pagerank ($url){
    			$ch = '6' . $this->GoogleCH($this->strord("info:$url"));
    			$pagerank = 0;
    			$fp = fsockopen('www.google.com', 80, $errno, $errstr, 30);
    			if (!$fp) {
    				echo "$errstr ($errno)<br />\n";
    			} else {
    				$out = "GET /search?client=navclient-auto&ch=" . $ch .  "&features=Rank&q=info:" . $url . " HTTP/1.1\r\n" ;
    				$out .= "Host: www.google.com\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{
    					$pagerank = trim(substr($data, $pos + 9));
    					}
    				}
    				fclose($fp);
    			}
    			echo $pagerank;
    		}
    	}
    	$pr = new pagerank('http://www.google.com');
    ?>
    PHP:
    Simply paste the code into your website. To call the PageRank at any time, use this code:
    $pr = new pagerank('http://www.google.com');
    PHP:
    Just remember to replace http://www.google.com with the desired website.

    Please leave comments / + rep if you enjoyed this contribution :)
     
    -NB-, Feb 10, 2007 IP
  2. Nick_Mayhem

    Nick_Mayhem Notable Member

    Messages:
    3,486
    Likes Received:
    338
    Best Answers:
    0
    Trophy Points:
    290
    #2
    So using this script we won't need any Google API key.

    Right?

    And if we query the G without AP key will it be any good?
     
    Nick_Mayhem, Feb 10, 2007 IP
  3. -NB-

    -NB- Peon

    Messages:
    153
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    0
    #3
    Yup, no API key required. It'll work fine :)
     
    -NB-, Feb 10, 2007 IP
  4. MeetHere

    MeetHere Prominent Member

    Messages:
    15,399
    Likes Received:
    994
    Best Answers:
    0
    Trophy Points:
    330
    #4
    Should I replace every www.google.com ( which are in php code also ?)
     
    MeetHere, Feb 10, 2007 IP
  5. -NB-

    -NB- Peon

    Messages:
    153
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    0
    #5
    NO. Only the one in the call section ($pr = new pagerank('http://www.google.com'); ).

    :)
     
    -NB-, Feb 10, 2007 IP
  6. lpstong

    lpstong Notable Member

    Messages:
    3,292
    Likes Received:
    216
    Best Answers:
    0
    Trophy Points:
    230
    #6
    Sweet. I have an open domain I could possibly use this script on. Thanks for sharing.
     
    lpstong, Feb 10, 2007 IP
  7. MeetHere

    MeetHere Prominent Member

    Messages:
    15,399
    Likes Received:
    994
    Best Answers:
    0
    Trophy Points:
    330
    #7
    Any live demo you have - I would like to see before installing on my site :)
     
    MeetHere, Feb 10, 2007 IP
  8. -NB-

    -NB- Peon

    Messages:
    153
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    0
    #8
    Setting up a quick demo in a bit. Give me some time, PHP just got removed from my server by accident :eek:
     
    -NB-, Feb 10, 2007 IP
  9. Red_Virus

    Red_Virus Well-Known Member

    Messages:
    3,756
    Likes Received:
    249
    Best Answers:
    0
    Trophy Points:
    135
    #9
    NICE script.. i am waiting for a demo...
     
    Red_Virus, Feb 11, 2007 IP
  10. krakjoe

    krakjoe Well-Known Member

    Messages:
    1,795
    Likes Received:
    141
    Best Answers:
    0
    Trophy Points:
    135
    #10
    Doesn't work on my server. and theres an error on line 85, ($ i)
     
    krakjoe, Feb 11, 2007 IP
  11. -NB-

    -NB- Peon

    Messages:
    153
    Likes Received:
    7
    Best Answers:
    0
    Trophy Points:
    0
    #11
    Whoops!

    function strord ($string) {
                for($ i= 0; $i < strlen($string); $i++) {
                    $result[$i] = ord($string{$i});
                }
                return $result;
            }
    PHP:
    Please replace that with:
    function strord ($string) {
                for($i = 0; $i < strlen($string); $i++) {
                    $result[$i] = ord($string{$i});
                }
                return $result;
            }
    PHP:
     
    -NB-, Feb 11, 2007 IP
  12. joesgraphics

    joesgraphics Peon

    Messages:
    206
    Likes Received:
    2
    Best Answers:
    0
    Trophy Points:
    0
    #12
    If it does not work on your server it is because google has blocked your server from querying there pr server.
     
    joesgraphics, Feb 11, 2007 IP
  13. ThomasNederman

    ThomasNederman Peon

    Messages:
    112
    Likes Received:
    4
    Best Answers:
    0
    Trophy Points:
    0
    #13
    I cant get it to work, when i add on line 102 "echo $data"; i can see the 403 access deny sign.
     
    ThomasNederman, Feb 13, 2007 IP
  14. krakjoe

    krakjoe Well-Known Member

    Messages:
    1,795
    Likes Received:
    141
    Best Answers:
    0
    Trophy Points:
    135
    #14
    Nope, it doesnt work on my local machine, nor my server, other pr scripts do.....
     
    krakjoe, Feb 13, 2007 IP
  15. ccoonen

    ccoonen Well-Known Member

    Messages:
    1,606
    Likes Received:
    71
    Best Answers:
    0
    Trophy Points:
    160
    #15
    ccoonen, Feb 13, 2007 IP