Hello,
J'étais vraiment curieux de savoir comment on calcule un page rank. Du
coup je suis parti fouiner sur le web et j'avoue avoir eu une peine
énorme pour trouver comment faire! Le problème est de chopper
l'algorithme qui calcul le checksum de la page désirée sans lequel
google refuse de fournir le page rank... c'est chose faite :)
Ce post est à titre INDICATIF, c'est pour la curiosité
intellectuelle. Si les admins considèrent qu'il s'apparente trop à du
hack, qu'il soit enlevé sans autre!
Ceci dit, je vous livre mes investigations du matin...
En exécutant le code suivant (qui n'est pas de moi) avec l'url désirée
en paramètres (par exemple
"
http://tonsite.com/pagerank.php/url'http://www.phpcs.com)
<?php
/*
Written and contributed by
Alex Stapleton,
Andy Doctorow,
Tarakan,
Bill Zeller,
Vijay "Cyberax" Bhatter
traB
This code is released into the public domain
*/
header("Content-Type: text/plain; charset= utf-8");
define('GOOGLE_MAGIC', 0xE6359A60);
//unsigned shift right
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)
/* all the case statements fall through */
{
case 11: $c+=($url[$k+10]<<24);
case 10: $c+=($url[$k+9]<<16);
case 9 : $c+=($url[$k+8]<<8);
/* the first byte of c is reserved for the length */
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]);
/* case 0: nothing left to add */
}
$mix = mix($a,$b,$c);
/*-------------------------------------------- report the result */
return $mix[2];
}
//converts a string into an array of integers containing the numeric value of the char
function strord($string) {
for($i=0;$i<strlen($string);$i++) {
$result[$i] = ord($string{$i});
}
return $result;
}
// converts an array of 32 bit integers into an array with 8 bit values. Equivalent to (BYTE *)arr32
function c32to8bit($arr32) {
for($i=0;$i<count($arr32);$i++) {
for ($bitOrder=$i*4;$bitOrder<=$i*4+3;$bitOrder++) {
$arr8[$bitOrder]=$arr32[$i]&255;
$arr32[$i]=zeroFill($arr32[$i], 8);
}
}
return $arr8;
}
$url = 'info:'.$_GET['url'];
$ch = GoogleCH(strord($url));
$ch=sprintf("%u", $ch);
$ch = ((($ch/7) << 2) | (((int)fmod($ch,13))&7));
$prbuf = array();
$prbuf[0] = $ch;
for($i = 1; $i < 20; $i++) {
$prbuf[$i] = $prbuf[$i-1]-9;
}
$ch = GoogleCH(c32to8bit($prbuf), 80);
$ch = sprintf("6%u",$ch);
$url2 = 'http://www.google.com/search?client=navclient-auto&ch='.$ch.'&feature=Rank&q=info:'.$_GET['url'];
echo $url2;
?>
on obtient:
http://www.google.com/search?client=navclient-auto&ch=62400035933&feature=Rank&q=info:http://www.phpcs.com
ou ch est le checksum de
q.
Si on suit ce lien dans google, on arrive sur une page XML qui contient entre autre:
Tout le monde aura remarqué la balise
<RK>...
Du coup, reste à récupérer ce RK:
$source = implode ('', file ("$url2"));
$source = strstr($source, '<RK>');
$sup = strstr($source, '</RK>');
$rank = str_replace("$sup","", $source);
$rank = str_replace("<RK>","", $rank);
echo 'Le page rank de '.$_GET['url'].' est de '.$rank;
La dernière ligne va afficher dans cet exemple:
Le page rank de
http://www.phpcs.com est de 5
Voili voilà. En gros je trouve ça assez
inutile, je l'avoue mais le page rank semble être la grosse
préoccupation de beaucoup de monde!
Ce bout de code permet d'afficher son pagerank sur son site par exemple, ce qui est sympa. Sans plus
Sur ce, bonne journée à tous, c'est le week-end et je vais essayer de faire autre chose que de l'ordi
Enjoy, ++
Malik7934