2012-10-01 79 views
1

我正在創建一個Mozilla Firefox工具欄來顯示當前網站的PageRank和Alexa排名。我知道的一種方法是在我的JavaScript文件中使用XMLHttpRequest以從我網站服務器上託管的PHP頁面獲取信息。Firefox的擴展名,以獲得谷歌PageRank和alexa排名

PHP類具有這樣的功能:

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 /tbr?client=navclient-auto&ch=".$this->checkHash($this->createHash($page)). 
      "&features=Rank&q=info:".$page."&num=100&filter=0 HTTP/1.1\r\n"; 
    $out .= "Host: toolbarqueries.google.com\r\n"; 
    $out .= "User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 

    // 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; 
} 

有沒有更好的辦法讓我的自定義工具欄的Firefox的網頁排名,而無需主機PHP服務?

// 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); 

}

//創建哈希

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; 

}

回答

0

校驗如果你的PHP代碼纔有那麼一個HTTP請求你可以從做同樣的請求Firefox擴展以及:

var request = new XMLHttpHeader(); 
request.open("http://toolbarqueries.google.com/tbr?client=navclient-auto&ch=..."); 
request.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)"); 
request.send(); 

但是,您應該明確是否使用Google服務器(特別是僞裝成Google工具欄)符合其服務條款。否則,您可能會發現自己面臨法律行爲或至少突然改變了此Web服務的工作方式。

至於散列函數:顯然你可以將這個算法轉換成JavaScript(從它的外觀來看,這很簡單),或者搜索周圍是否有人已經做過。例如。我找到了this JS-based hash algorithm implementation(這是一個不同的算法,它以8而不是7作爲前綴,但也要注意,這個前綴不是由哈希函數返回的,而是它的一部分)。

+0

謝謝你的回覆。這肯定會節省很多工作。就一件事。這個請求的URL使用HASH而不是Web域名。我已經編輯了這個問題以包含CreateHash函數。我可以直接在java腳本中執行此操作嗎? – Flamingo

+0

@Flamingo:在我的回答中添加了一段。 –

+0

嘗試了這段帶有前綴7的代碼。我不知道我是否得到錯誤的哈希代碼!我甚至嘗試過使用此功能:http://abhinavsingh.com/blog/2009/04/getting-google-page-rank-using-javascript-for-adobe-air-apps/#comments – Flamingo