简述:
通过计算URL的Checksum,模拟Google ToolBar直接向Google.com提交 PR查询请求
算法来源于 Internet,Greg Shaw稍作修改,直接打开Socket,模拟ToolBar的行为,直接向www.google.com 提交查询
如果有任何问题,请到 论坛 讨论.
下载地址:
http://www.upsdn.net/html/2005-01/337.htm
演示:
http://tools.upsdn.net/pr (由于算法比较复杂,本站服务器有运行时间限制,所以复杂的URL可能会超时,无法算出)
原理介绍:
很多站长对他们的站点在 Google Dance期间的Rank的改变很有兴趣。
除此之外,很多人也想知道他们的新的PaneRank。一般而言,Google 工具栏
从www.google.com的实际DNS记录的IP所指定的数据中心取得PageRank值。
所以,当Google Dance开始时,工具栏通常会显示旧的PageRank值。
Google以一个简单的文本文件的形式提交PageRank给工具栏。在早些时候,是通过XML来
传递的。大概是在2002年8月份的时候换成文本形式的。PageRank文件能够直接通过向Google提交请求
获取PR:
http://www.google.com/search?
client=navclient-auto&
ch=0123456789&
features=Rank&
q=info:http://www.domain.com/
在PageRank文件中,只有一行文字,最后的那部分就是PageRank值.
为了在浏览器显示PageRank文件,上面的URL中的每个组成参数都是必须的:
1. "navclient-auto"是参数"client"的值,用来识别工具栏的。
2. 通过参数"q"来提交URL。
3. 参数"features"的值是"Rank",表示请求一个PageRank文件。如果忽略这个参数,Googles的
服务器还是返回旧的XML格式的文件。
4. 参数"ch"传输一个你想提交的URL的校验和给Google。
当Google的工具栏的版本更新时,校验和可能被改变。
Google工具栏请求一个PageRank文件后可以被IE缓存。所以他们的URL和校验和能够简单地在
Internet临时文件夹里面查看到。知道了你的URL,你就可以通过浏览器查看你的PageRank。因为
PageRank文件是被浏览器缓存的且以明文显示,一旦请求之后不会清除。所以在浏览器里面
查看PageRank文件应该没有违反Google的条款。然而,你应该要谨慎,因为工具栏是以他们自己的用户代理
提交给Google的:
Mozilla/4.0 (compatible; GoogleToolbar 1.1.60-deleon; OS SE 4.10)
1.1.60-deleon 是工具栏的版本,当然它可能会改变。OS是你安装的操作系统。所以,
如果没有通过一个代理服务器并且浏览器ID 没有被修改的话,Google能够识别浏览器的请求。
现在,让我们来看看我们如何能够取得新的PageRank值。看看IE的换存,你将注意到PageRank文件
不是从www.google.com而是从IP地址 像216.239.33.102取得的。另外,PageRank文件的URL通常
含有一个"failedip"的参数,它的值被设置为像"216.239.35.102;1111"(它的功能还不是很清楚)
(upsdn注释:就是失效的服务器的IP地址,一般就是上次请求失败的服务器,或者没有更新索引的服务器)
然而,得到新的PageRank很简单。修改URL中的IP地址,新的请求就发给一个有了新的索引的数据
中心。
下面介绍用PHP模拟Toobar的行为直接获取PageRank值:
===================
//error_reporting(E_ALL);
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 $result[$i] = ord($string{$i});
}
return $result;
}
function ReadPR($link)
{
$fp = fsockopen ("www.google.com", 80, $errno, $errstr, 30);
//$ip = gethostbyname("www.google.com");
//$fp = fsockopen ($ip, 80, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)\n";
exit(1);
}
else
{
//$out = "GET $link HTTP/1.1\r\n";
$out = "GET $link HTTP/1.0\r\n";
$out .= "Host: toolbarqueries.google.com\r\n";
$out .= "User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114.9-big; Windows 5.2)\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
//while (!feof($fp))
// echo fgets ($fp,128);
do{
$line = fgets($fp, 128);
}while ($line !== "\r\n");
$data = fread($fp,8192);
fclose ($fp);
return $data;
}
}
function GetPR($url)
{
$url ='info:'.$url;
$ch = GoogleCH(strord($url));
$data = ReadPR("/search?client=navclient-auto&ch=6$ch&features=Rank&q=$url");
$rankarray = explode (':', $data);
return $rankarray[2];
}
$provider = '< br />< br />Provided by upsdn.net a>';
if ( isset($_POST['url']) && $_POST['url'] !== '' )
{
echo 'PageRank: '.GetPR($_POST['url']).$provider;
}
else
{
echo "< h tml >< t itle >Get PageRank From Google.com< /t itle >< body >PageRank(PR) Querying Script< b r / >";
echo "< f orm action='' method='post'>"."< b r />URL:< input name='url' value='http://' type='text' size=40>";
echo "< i nput name='submit' type='submit' value='Get PR'> f orm>".$provider."";
}
?> (DVOL本文转自:中国DV传媒 http://www.dvol.cn)