segunda-feira, 20 de junho de 2011

Classe PHP para o PageRank do Google


Enquanto desenvolvedores e designers podem debater sobre a importância de diferentes estratégias para a otimização dos mecanismos de busca, uma métrica que simplesmente não pode ser discutida é o PageRank de uma página, ou sua importância em gerar tráfego para o site. Atingir um PageRank melhor foi uma das considerações ao refazermos o design do nosso blog. Podemos discutir como alcançar um PageRank melhor em outra ocasião, mas este artigo irá focar em como você pode recuperar o PageRank de uma página usando uma pequena classe PHP que criei.

O PHP

As funções básicas dentro dessa classe foram criadas por Jamie Scott – todo o crédito das funções básicas vão para ele. Eu simplesmente coloquei a funcionalidade dentro do formato da classe PHP para facilitar o uso e para atualizar o código para que ele fosse um pouco mais transparente. No que diz respeito às classes PHP, esta é bem pequena:
// Declare the class
class GooglePageRankChecker {

    // Track the instance
    private static $instance;

    // Constructor
    function getRank($page) {
        // Create the instance, if one isn't created yet
        if(!isset(self::$instance)) {
            self::$instance = new self();
        }
        // Return the result
        return self::$instance->check($page);
    }


    // Convert string to a number
    function stringToNumber($string,$check,$magic) {
        $int32 = 4294967296;  // 2^32
        $length = strlen($string);
        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 >= $int32) {
                $check = ($check - $int32 * (int) ($check / $int32));
                //if the check less than -2^31
                $check = ($check < -($int32 / 2)) ? ($check + $int32) : $check;
            }
            $check += ord($string{$i}); 
        }
        return $check;
    }

    // Create a url hash
    function createHash($string) {
        $check1 = $this->stringToNumber($string, 0x1505, 0x21);
        $check2 = $this->stringToNumber($string, 0, 0x1003F);

        $factor = 4;
        $halfFactor = $factor/2;

        $check1 >>= $halfFactor;
        $check1 = (($check1 >> $factor) & 0x3FFFFC0 ) | ($check1 & 0x3F);
        $check1 = (($check1 >> $factor) & 0x3FFC00 ) | ($check1 & 0x3FF);
        $check1 = (($check1 >> $factor) & 0x3C000 ) | ($check1 & 0x3FFF); 

        $calc1 = (((($check1 & 0x3C0) << $factor) | ($check1 & 0x3C)) << $halfFactor ) | ($check2 & 0xF0F );
        $calc2 = (((($check1 & 0xFFFFC000) << $factor) | ($check1 & 0x3C00)) << 0xA) | ($check2 & 0xF0F0000 );

        return ($calc1 | $calc2);
    }

    // Create checksum for hash
    function checkHash($hashNumber)
    {
        $check = 0;
        $flag = 0;

        $hashString = sprintf('%u', $hashNumber) ;
        $length = strlen($hashString);

        for ($i = $length - 1;  $i >= 0;  $i --) {
            $r = $hashString{$i};
            if(1 === ($flag % 2)) {     
                $r += $r;  
                $r = (int)($r / 10) + ($r % 10);
            }
            $check += $r;
            $flag ++; 
        }

        $check %= 10;
        if(0 !== $check) {
            $check = 10 - $check;
            if(1 === ($flag % 2) ) {
                if(1 === ($check % 2)) {
                    $check += 9;
                }
                $check >>= 1;
            }
        }

        return '7'.$check.$hashString;
    }

    function check($page) {

        // Open a socket to the toolbarqueries address, used by Google Toolbar
        $socket = fsockopen("toolbarqueries.google.com", 80, $errno, $errstr, 30);

        // If a connection can be established
        if($socket) {
            // Prep socket headers
            $out = "GET /search?client=navclient-auto&ch=".$this->checkHash($this->createHash($page))."&features=Rank&q=info:".$page."&num=100&filter=0 HTTP/1.1rn";
            $out .= "Host: toolbarqueries.google.comrn";
            $out .= "User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)rn";
            $out .= "Connection: Closernrn";

            // Write settings to the socket
            fwrite($socket, $out);

            // When a response is received...
            $result = "";
            while(!feof($socket)) {
                $data = fgets($socket, 128);
                $pos = strpos($data, "Rank_");
                if($pos !== false){
                    $pagerank = substr($data, $pos + 9);
                    $result += $pagerank;
                }
            }
            // Close the connection
            fclose($socket);

            // Return the rank!
            return $result;
        }
    }
}
Os métodos createHash e checkHash geram as operações matemáticas profundas. Uma vez que elas estiverem fora do caminho, o método check se conecta ao servidor da barra de ferramentas do Google, disfarçando-se como uma barra de ferramenta através do cabeçalho User-Agent, para chegar ao PageRank da página. Um padrão único é usado, uma vez que criar instâncias individuais não é importante:

$rank = GooglePageRankChecker::getRank("davidwalsh.name"); // returns "5"

O número fornecido representa o PageRank para a URL fornecida! Essa classe PHP pode ser usada sozinha, mas eu criei um script comandado pelo MooTools para recuperar o endereço do PageRank através de um simples AJAX.

O MooTools JavaScript

Este script quick inline do MooTools responde ao clique de um botão, gerando um chamado AJAX para um script PHP que executa a classe fornecida acima:
// When the DOM is ready
window.addEvent("domready",function() {

    // When the form is submitted...
    var form = document.id("rankForm"), request, display, domain;
    form.addEvent("submit",function(e) {
        // Stop the event
        if(e) e.stop();

        // Create request, if not already created
        if(!request) {
            domain = document.id("domain");
            display = document.id("rankerDisplay");
            request = new Request({
                url: "pagerank-checker.php", 
                method: "post",
                onComplete: function(response) {
                    display.setStyle("display","block").set("text","Page rank for " + domainValue + " is: " + response);
                }
            });
        }

        // Get the value fo the URL
        domainValue = domain.get("value");

        // Send the request
        request.send({ data: { domain: domainValue } });
    });

});
Utilizando este pedaço de Javascript como no exemplo, você pode facilmente adicionar um verificador javascript para o Google PageRank com o framework que você escolher.

Texto original em disponível em http://davidwalsh.name/google-pagerank
Fonete: Imasters.com.br

Nenhum comentário :

Postar um comentário

Total de visualizações de página