Google PR查询接口checksum新算法
|
取而代之的是一大段“In your email,please send us the entire code displayed below”之类的Google terms_of_service错误提示信息。看来是原先的接口已经失效了。 但我装在Firefox工具栏的扩展插件SearchStatus仍然能够正常解析出每个受访页的PR值,找到 SearchStatus 的插件包解开来看源码,果然是使用了不一样的验证码生成算法,在原先的 checksum 生成之后,还需要再进行一次计算,两次演算之后得到的才是正确的ch参数。 于是拿现成的js代码改造一番之后,新的PHP版本的 Google PageRank 查询接口方法就出来了。经过本地测试之后,谁想传到服务器之后又出现了该死的 terms_of_service 错误提示。把checksum的计算过程一步步打出来,发现经过了几次右位移之后本地和服务器上的数字就不一样了。这才想到服务器是64位机,32位系统下位移之后应该被cut掉的bit在那里就活得好好的。加了个 trunkbitForce32bit 方法,对所有算术运算之后的数值进行高位屏蔽,算是搞定了64位系统下的多余位问题。结果拿到32位Linux环境下跑又不兼容了,原因是PHP在进行算术处理出现溢出时,会自动尝试将int转为float。当发生的是负数溢出时,这一操作在Windows下能正确保留精度,但在Linux下就有问题了。 下面这段代码: $a = -4294967295; 使用很简单,只要在需要的地方 http://forums.seochat.com/archive/t-17286/Php-Pagerank-checker;方法实现参考于Firefox的工具栏扩展插件SearchStatus的相关代码实现。 http://pagerankstatus.mozdev.org/source.html,可以从cvs上直接抓取完整的源代码(cvs用户密码 guest): cvs -d :pserver:guest@mozdev.org:/cvs login 一个专门提供pr显示接口的网站: http://www.prchecker.info/ ------------------------------------------------------------------pr.inc.php源文件如下(Updated 2008-05-04 14:29-- Google修改了checksum的计算算法,需要在原有的方法之后再套一层方法来得到正确的checksum,同时引发的php int overflow及64位机器兼容性问题请参照以下源代码的变化部分):代码如下:// url get method macro. define('G_PR_GET_TYPE_FILE',1); // use fopen() function define('G_PR_GET_TYPE_SOCKET',2); // use standard fsocketopen function // main function to be called function getPR($_url,$gettype=G_PR_GET_TYPE_SOCKET){ $url = 'info:'.$_url; $ch = GCH(strord($url)); $ch = NewGCH($ch); $url=str_replace("_","%5F",'info:'.urlencode($_url)); $googlePRUrl = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=6" .$ch."&ie=UTF-8&oe=UTF-8&features=Rank&q=".$url; $pr_str = retrieveURLContent($googlePRUrl,$gettype); return substr($pr_str,strrpos($pr_str,":")+1); } //unsigned shift right function zeroFill($a,$b){ $z = hexdec('8'.implode('',array_fill(0,PHP_INT_SIZE*2-1,'0'))); if ($z & $a){ $a = ($a>>1); $a &= (~$z); $a |= hexdec('4'.implode('','0'))); $a = ($a>>($b-1)); } else{ $a = ($a>>$b); } return $a; } // discard bits beyonds 32 bit. function trunkbitForce32bit($n){ if(PHP_INT_SIZE <= 4){ settype($n,'float'); if ( $n < 0 ) $n += 4294967296; return $n; } else{ $clearbit = ''; for($i=0;$i } for($i=0;$i<4;$i++){ $clearbit .= 'ff'; } return ($n & hexdec($clearbit)); } } function bigxor($m,$n){ //if(function_exists('gmp_init')){ // return floatval(gmp_strval(gmp_xor($m,$n))); / (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
