Google PageRank Component

This article is also available in the following languages:
By chadsmith729
Google Page Ranking is being used less and less, but it's still out there and offered by accessing google's servers. When talking about Search Engine Optimization the main items to look at are Trust and Authority, however Google/Yahoo/Bing are not releasing the ability to get that information yet. Page Rank will just have to do for the time being.
This component will access google.com and and find the Google PageRank for any given URL. You could also add other domains to the $googleDomains variable, but doing so adds to the response time.

/app/controllers/components/googlepagerank.php

Component Class:

<?php 
class GooglepagerankComponent {
    
//Public vars
    
var $googleDomains = Array("www.google.com");
        
// You can add more google owned domains here to check, but it increases the time to execute.
    
    
var $debugResult = Array();
    var 
$userAgent "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204";
    var 
$cacheDir "/tmp";
    var 
$maxCacheAge 86400// = 24h (yes, in seconds)
    
var $useCache false;
    var 
$debug false;

    
//Private vars
    
var $PageRank = -1;
    var 
$cacheExpired false;


    function 
GetPR($url,$forceNoCache false) {
        
$total_exec_start $this->microtimeFloat();
        
$result=array("",-1);

        if ((
$url.""!="")&&($url.""!="http://")) {

            
$this->debugRes("url"$url);

            
$this->cacheDir .= (substr($this->cacheDir,-1) != "/")? "/":"";

            
// check for protocol
            
$url_ = ((substr(strtolower($url),0,7)!="http://")? "http://".$url:$url);
            
$host $this->googleDomains[mt_rand(0,count($this->googleDomains)-1)];
            
$target "/search";
            
$querystring sprintf("client=navclient-auto&ch=%s&features=Rank&q=%s",
                
$this->CheckHash($this->HashURL($url_)),urlencode("info:".$url_));
            
$contents="";

            
$this->debugRes("host"$host);
            
$this->debugRes("query_string"$querystring);
            
$this->debugRes("user_agent"$this->userAgent);

            
$query_exec_start $this->microtimeFloat();

            if (
$forceNoCache == true) {
                
$this->debugRes("force_no_cache""true");
            } elseif (
$contents $this->readCacheResult($url)) {
                
$this->debugRes("read_from_cache""true");
            } else {
                
$this->cacheExpired true;
            }


            
// let's get ranking
            
if (strlen(trim($contents)) == 0)
            if (@
function_exists("curl_init")) {

                
// allways use curl if available for performance issues
                
$ch curl_init();
                
curl_setopt($chCURLOPT_URL"http://".$host.$target."?".$querystring);
                
curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
curl_setopt($chCURLOPT_HTTP_VERSIONCURL_HTTP_VERSION_1_0);
                
curl_setopt($chCURLOPT_USERAGENT$this->userAgent);
                if (!(
$contents trim(@curl_exec($ch)))) {
                    
$this->debugRes("error","curl_exec failed");
                }
                
curl_close ($ch);
                
$this->debugRes("method""curl");

            } else {
                
$this->debugRes("error","curl not installed, trying to use fsockopen");
                
// use fsockopen as secondary method, to submit user agent
                
if ($socket  = @fsockopen($host"80"$errno$errstr30)) {

                    
$request  "GET $target?$querystring HTTP/1.0\r\n";
                    
$request .= "Host: $host\r\n";
                    
$request .= "User-Agent: ".$this->userAgent."\r\n";
                    
$request .= "Accept-Language: en-us, en;q=0.50\r\n";
                    
$request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
                    
$request .= "Accept: text/xml,application/xml,application/xhtml+xml,";
                    
$request .= "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,";
                    
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
                    
$request .= "Connection: close\r\n";
                    
$request .= "Cache-Control: max-age=0\r\n\r\n";

                    
stream_set_timeout $socket,10);
                    
fwrite$socket$request );
                    
$ret '';
                    while (!
feof($socket)) {
                        
$ret .= fread($socket,4096);
                    }
                    
fclose($socket);
                    
$contents trim(substr($ret,strpos($ret,"\r\n\r\n") + 4));
                    
$this->debugRes("method""fsockopen");
                } else {
                    
$this->debugRes("error","fsockopen failed, trying file_get_contents");
                    
// this way could cause problems because the Browser Useragent is not set...
                    
if ($contents trim(@file_get_contents("http://".$host.$target."?".$querystring))) {
                        
$this->debugRes("method""file_get_contents");
                    } else {
                        
$this->debugRes("error","file_get_contents failed");
                    }
                }

            }

            if (
$this->cacheExpired == true)
            
$this->updateCacheResult($url,$contents);

            
$this->debugRes("query_exec_time",$this->microtimeFloat() - $query_exec_start);

            
$result[0]=$contents;
            
// Rank_1:1:0 = 0
            // Rank_1:1:5 = 5
            // Rank_1:1:9 = 9
            // Rank_1:2:10 = 10 etc
            
$p=explode(":",$contents);
            if (isset(
$p[2])) $result[1]=$p[2];
        }

        if(
$result[1] == -1$result[1] = 0;
        
$this->PageRank =(int)$result[1];
        
$this->debugRes("total_exec_time"$this->microtimeFloat() - $total_exec_start);
        
$this->debugRes("result"$result);
        return 
$this->PageRank;

    }


    function 
debugRes($what,$sowhat) {
        if(
$this->debug == true) {
            
$debugbt debug_backtrace();
            
$what trim($what);
            
$sowhat trim($sowhat) . " (Line : ".$debugbt[0]["line"].")";
            if (
$what == "error") {
                
$this->debugResult[$what][] = $sowhat;
            } else {
                
$this->debugResult[$what] = $sowhat;
            }
        }
    }

    function 
microtimeFloat() {
        list(
$usec$sec) = explode(" "microtime());
        return ((float)
$usec + (float)$sec);
    }


    function 
readCacheResult($url) {
        if (
$this->useCache != true) {
            return 
false;
        }

        if (!
is_dir($this->cacheDir)) {
            
$this->debugRes("error","please create {$this->cacheDir}");
            return 
false;
        }

        
$urlp parse_url($url);
        
$host_ explode(".",$urlp["host"]);
        
$path_ = (strlen($urlp["query"])>0)? urlencode($urlp["path"].$urlp["query"]):"default";

        
$cache_file $this->cacheDir;

        for (
$i count($host_)-1;$i>=0;$i--) {
            
$cache_file .= $host_[$i]."/";
        }

        
$cache_file .= $path_;
        
$this->debugRes("cache_file"$cache_file);
        if (
file_exists($cache_file)) {
            
$mtime filemtime($cache_file);
            if (
time() - $mtime $this->maxCacheAge) {
                
$this->debugRes("cache""expired");
                
$this->cacheExpired true;
                return 
false;
            } else {
                
$this->cacheExpired false;
                
$this->debugRes("cache_age"time() - $mtime);
                return 
file_get_contents($cache_file);
            }
        }
        
$this->debugRes("error","cache file not exists (reading)");
        return 
false;
    }

    function 
updateCacheResult($url,$content) {
        if (
$this->useCache != true) {
            return 
false;
        }

        if (!
is_dir($this->cacheDir)) {
            
$this->debugRes("error","please create {$this->cacheDir}");
            return 
false;
        }

        
$urlp parse_url($url);
        
$host_ explode(".",$urlp["host"]);
        
$path_ = (strlen($urlp["query"])>0)? urlencode($urlp["path"].$urlp["query"]):"default";

        
$cache_file $this->cacheDir;
        for (
$i count($host_)-1;$i>=0;$i--) {
            
$cache_file .= $host_[$i]."/";
        }

        
$cache_file .= $path_;

        if (!
file_exists($cache_file)) {
            
$this->debugRes("error","cache file not exists (writing)");
            
$cache_file_tmp substr($cache_file,strlen($this->cacheDir));
            
$cache_file_tmp explode("/",$cache_file_tmp);
            
$cache_dir_ $this->cacheDir;
            for (
$i 0;$i<count($cache_file_tmp)-1;$i++) {
                
$cache_dir_ .= $cache_file_tmp[$i]."/";
                if (!
file_exists($cache_dir_)) {
                    if (!@
mkdir($cache_dir_,0777)) {
                        
$this->debugRes("error","unable to create cache dir: $cache_dir_");
                        
//break;
                    
}
                }
            }
            if (!@
touch($cache_file)) $this->debugRes("error","unable to create cache file");
            if (!@
chmod($cache_file,0777)) $this->debugRes("error","unable to chmod cache file");
        }

        if (
is_writable($cache_file)) {
            if (!
$handle fopen($cache_file'w')) {
                
$this->debugRes("error""unable to open $cache_file");
                return 
false;
            }
            if (
fwrite($handle$content) === FALSE) {
                
$this->debugRes("error""unable to write to $cache_file");
                return 
false;
            }
            
fclose($handle);
            
$this->debugRes("cached"date("Y-m-d H:i:s"));
            return 
true;
        }
        
$this->debugRes("error""$cache_file is not writable");
        return 
false;

    }

    
//convert a string to a 32-bit integer
    
function StrToNum($Str$Check$Magic) {
        
$Int32Unit 4294967296;  // 2^32
        
$length strlen($Str);
        for (
$i 0$i $length$i++) {
            
$Check *= $Magic;     
            
//If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31), 
            //  the result of converting to integer is undefined
            //  refer to http://www.php.net/manual/en/language.types.integer.php
            
if ($Check >= $Int32Unit) {
                
$Check = ($Check $Int32Unit * (int) ($Check $Int32Unit));
                
//if the check less than -2^31
                
$Check = ($Check < -2147483648) ? ($Check $Int32Unit) : $Check;
            }
            
$Check += ord($Str{$i}); 
        }
        return 
$Check;
    }

    
//genearate a hash for a url
    
function HashURL($String) {
        
$Check1 $this->StrToNum($String0x15050x21);
        
$Check2 $this->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);
    }
    
    
//genearate a checksum for the hash string
    
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;
    }
}
?>

Now we have the component set up and working. Let's access and run a test.

Controller - /app/controllers/googlepageranks_controller.php

Controller Class:

<?php 
class GooglepageranksController extends AppController {
    var 
$name 'Googlepageranks';
    var 
$components = array('Googlepagerank');
    
    
/*-----------------------------------------------------------
        Google Page Rank
    -------------------------------------------------------------*/
    
function googlepr($theURL){
        
$this->autoRender false;
        
$this->autoLayout false;
        
// Send to google.com and get the PageRank
        
echo $this->Googlepagerank->GetPR($theURL);
    }
}
?>

Open a web browser and go to http://{domain}/googlepageranks/googlepr/http%3a%2f%2fintegrascan.com
The output should say something like: 4

This is also available as a free API courtesy of The Easy API http://theeasyapi.com.

Happy Baking,
Chad

Comments

  • Posted 07/15/11 10:07:55 AM
    Hello, a big thank you also from me, so Google PR is indeed directly accessible.
    I´am currently running some tests with this code, will get back to you with some reviews, though.
    Best wishes
    News
  • Posted 03/26/11 10:55:52 PM
    thanks for sharing us this great code. I will use it for my Filma Shqip site.
  • Posted 02/13/11 06:44:05 PM
    Hello, is this PR Code a copy? I used the script in my website: http://www.profischnell.com a translation agency / Übersetzungsbüro this script is very nice he works very good.
  • Posted 11/25/10 05:02:06 PM
    Thank you for the PHP Code.
  • Posted 11/15/10 05:37:52 PM
    i get an error that the databasetable is missing...
  • Posted 08/23/10 08:11:42 PM
    Page Ranking is the code that we all for when considering our current status with on line marketing and business. In order to achieve a higher ranking it is in fact important to have a starting rank for your web page. Then you should move to articles and linking your page to directories. This is where google will allocate your key words. How important those keywords are is unquestionable. FOllowing this campaign you would begin do some blogs that are recant and meaningful to your business. I am looking froward to Google being able to identify integrity with PR. It will make our role a lot simpler and provide greater professionalism.
  • Posted 04/13/10 11:00:43 PM
    I think PR will always be around but all it really shows is how often a page gets spidered. My potty training site was PR2 and now after the update it has gone to a PR4.
  • Posted 04/12/10 08:35:03 AM
    Thanks for the code, i always believed Google PR was something that wasn't directly accessible and had to be somehow 'stolen' indirectly from the Google toolbar.
    Will check it and see if it works(i'm sure it does though).
    Regards,
    seo articles

Comments are closed for articles over a year old