Google PR查詢接口checksum新算法第1/2頁
更新時間:2009年01月10日 21:45:43 作者:
前些日子一篇N久之前的老文忽然成了被閱讀的熱點,檢查之后才發(fā)現(xiàn)自己使用那段代碼來做pr查詢的頁面已經(jīng)不能正常得到URL的Page Rank值了
取而代之的是一大段“In your email, please send us the entire code displayed below”之類的Google terms_of_service錯誤提示信息??磥硎窃鹊慕涌谝呀?jīng)失效了。
但我裝在Firefox工具欄的擴展插件SearchStatus仍然能夠正常解析出每個受訪頁的PR值,找到 SearchStatus 的插件包解開來看源碼,果然是使用了不一樣的驗證碼生成算法,在原先的 checksum 生成之后,還需要再進行一次計算,兩次演算之后得到的才是正確的ch參數(shù)。
于是拿現(xiàn)成的js代碼改造一番之后,新的PHP版本的 Google PageRank 查詢接口方法就出來了。經(jīng)過本地測試之后,誰想傳到服務器之后又出現(xiàn)了該死的 terms_of_service 錯誤提示。把checksum的計算過程一步步打出來,發(fā)現(xiàn)經(jīng)過了幾次右位移之后本地和服務器上的數(shù)字就不一樣了。這才想到服務器是64位機,32位系統(tǒng)下位移之后應該被cut掉的bit在那里就活得好好的。加了個 trunkbitForce32bit 方法,對所有算術運算之后的數(shù)值進行高位屏蔽,算是搞定了64位系統(tǒng)下的多余位問題。結果拿到32位Linux環(huán)境下跑又不兼容了,原因是PHP在進行算術處理出現(xiàn)溢出時,會自動嘗試將int轉為float。當發(fā)生的是負數(shù)溢出時,這一操作在Windows下能正確保留精度,但在Linux下就有問題了。
下面這段代碼:
$a = -4294967295;
echo dechex($a)."<br />\n";
if ( $a < 0 ) $a += 4294967296;
echo dechex($a)."<br />\n";
第一個echo在Windows下能夠正確輸出該負數(shù)低32位的補碼,而在32位Linux機上輸出的則是int類型所能表示的最大負數(shù)0x80000000了。只有通過取巧的方式給這個溢出的大負數(shù)加上一個超出整數(shù)范圍的大整數(shù)來抵消掉溢出的部分,才能復原低32位應該有的樣子。
使用這些非常規(guī)手段,終于炮制出這個更新版的兼容Linux32/Linux64/Windows的Google PR值查詢接口的PHP腳本實現(xiàn)(含完整代碼)。
但我裝在Firefox工具欄的擴展插件SearchStatus仍然能夠正常解析出每個受訪頁的PR值,找到 SearchStatus 的插件包解開來看源碼,果然是使用了不一樣的驗證碼生成算法,在原先的 checksum 生成之后,還需要再進行一次計算,兩次演算之后得到的才是正確的ch參數(shù)。
于是拿現(xiàn)成的js代碼改造一番之后,新的PHP版本的 Google PageRank 查詢接口方法就出來了。經(jīng)過本地測試之后,誰想傳到服務器之后又出現(xiàn)了該死的 terms_of_service 錯誤提示。把checksum的計算過程一步步打出來,發(fā)現(xiàn)經(jīng)過了幾次右位移之后本地和服務器上的數(shù)字就不一樣了。這才想到服務器是64位機,32位系統(tǒng)下位移之后應該被cut掉的bit在那里就活得好好的。加了個 trunkbitForce32bit 方法,對所有算術運算之后的數(shù)值進行高位屏蔽,算是搞定了64位系統(tǒng)下的多余位問題。結果拿到32位Linux環(huán)境下跑又不兼容了,原因是PHP在進行算術處理出現(xiàn)溢出時,會自動嘗試將int轉為float。當發(fā)生的是負數(shù)溢出時,這一操作在Windows下能正確保留精度,但在Linux下就有問題了。
下面這段代碼:
$a = -4294967295;
echo dechex($a)."<br />\n";
if ( $a < 0 ) $a += 4294967296;
echo dechex($a)."<br />\n";
第一個echo在Windows下能夠正確輸出該負數(shù)低32位的補碼,而在32位Linux機上輸出的則是int類型所能表示的最大負數(shù)0x80000000了。只有通過取巧的方式給這個溢出的大負數(shù)加上一個超出整數(shù)范圍的大整數(shù)來抵消掉溢出的部分,才能復原低32位應該有的樣子。
使用這些非常規(guī)手段,終于炮制出這個更新版的兼容Linux32/Linux64/Windows的Google PR值查詢接口的PHP腳本實現(xiàn)(含完整代碼)。
您可能感興趣的文章:

