算法來(lái)源于 Internet,Greg Shaw稍作修改,直接打開(kāi)Socket,模擬ToolBar的行為,直接向www.google.com 提交查詢(xún)
如果有任何問(wèn)題,請到 論壇 討論.
下載地址:
http://www.upsdn.net/html/2005-01/337.htm演示:
http://tools.upsdn.net/pr (由于算法比較復雜,本站服務(wù)器有運行時(shí)間限制,所以復雜的URL可能會(huì )超時(shí),無(wú)法算出)
原理介紹:很多站長(cháng)對他們的站點(diǎn)在 Google Dance期間的Rank的改變很有興趣。
除此之外,很多人也想知道他們的新的PaneRank。一般而言,Google 工具欄
從www.google.com的實(shí)際DNS記錄的IP所指定的數據中心取得PageRank值。
所以,當Google Dance開(kāi)始時(shí),工具欄通常會(huì )顯示舊的PageRank值。
Google以一個(gè)簡(jiǎn)單的文本文件的形式提交PageRank給工具欄。在早些時(shí)候,是通過(guò)XML來(lái)
傳遞的。大概是在2002年8月份的時(shí)候換成文本形式的。PageRank文件能夠直接通過(guò)向Google提交請求
獲取PR:
http://www.google.com/search?client=navclient-auto&ch=0123456789&features=Rank&q=info:http://www.domain.com/在PageRank文件中,只有一行文字,最后的那部分就是PageRank值.
為了在瀏覽器顯示PageRank文件,上面的URL中的每個(gè)組成參數都是必須的:
1. "navclient-auto"是參數"client"的值,用來(lái)識別工具欄的。
2. 通過(guò)參數"q"來(lái)提交URL。
3. 參數"features"的值是"Rank",表示請求一個(gè)PageRank文件。如果忽略這個(gè)參數,Googles的
服務(wù)器還是返回舊的XML格式的文件。
4. 參數"ch"傳輸一個(gè)你想提交的URL的校驗和給Google。
當Google的工具欄的版本更新時(shí),校驗和可能被改變。
Google工具欄請求一個(gè)PageRank文件后可以被IE緩存。所以他們的URL和校驗和能夠簡(jiǎn)單地在
Internet臨時(shí)文件夾里面查看到。知道了你的URL,你就可以通過(guò)瀏覽器查看你的PageRank。因為
PageRank文件是被瀏覽器緩存的且以明文顯示,一旦請求之后不會(huì )清除。所以在瀏覽器里面
查看PageRank文件應該沒(méi)有違反Google的條款。然而,你應該要謹慎,因為工具欄是以他們自己的用戶(hù)代理
提交給Google的:
Mozilla/4.0 (compatible; GoogleToolbar 1.1.60-deleon; OS SE 4.10) 1.1.60-deleon 是工具欄的版本,當然它可能會(huì )改變。OS是你安裝的操作系統。所以,
如果沒(méi)有通過(guò)一個(gè)代理服務(wù)器并且瀏覽器ID 沒(méi)有被修改的話(huà),Google能夠識別瀏覽器的請求。
現在,讓我們來(lái)看看我們如何能夠取得新的PageRank值??纯碔E的換存,你將注意到PageRank文件
不是從www.google.com而是從IP地址 像216.239.33.102取得的。另外,PageRank文件的URL通常
含有一個(gè)"failedip"的參數,它的值被設置為像"216.239.35.102;1111"(它的功能還不是很清楚)
(
upsdn注釋:就是失效的服務(wù)器的IP地址,一般就是上次請求失敗的服務(wù)器,或者沒(méi)有更新索引的服務(wù)器)
然而,得到新的PageRank很簡(jiǎn)單。修改URL中的IP地址,新的請求就發(fā)給一個(gè)有了新的索引的數據
中心。
下面介紹用PHP模擬Toobar的行為直接獲取PageRank值:
===================
<?php
//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<strlen($string);$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 /><s mall>Provided by <a h ref="http:// www.upsdn.net/" target="_blank">upsdn.net</ a></s mall>‘;
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."</b ody></h tml>";
}
?>