2007年1月

1. vBulletin 官方中文版春节优惠……

2007年1月23日00时开始,到2007年2月26日24时止,我们向广大中文用户提供如下价格优惠:

  • vBulletin 永久使用许可证原价人民币 1280 元,现价人民币 400 元。
  • vBulletin 许可证更新原价人民币 240 元,现价人民币 80 元。

2. vBulletin 中文许可协议更新及其它注意事项……

2007年1月23日00时起,我们对许可协议做了如下修改:

  • 增加条款:Jelsoft 对在 vBulletin-China.cn 购买的许可证仅提供中文支持
  • 去除所有与按年租用许可证相关的条款,并停止按年租用许可证的销售

需要获得更详细的信息,请访问:

中文官方:http://www.vbulletin-china.cn
活动公告:http://forum.vbulletin-china.cn/showpost.php?p=1900
相关讨论:http://forum.vbulletin-china.cn/showthread.php?t=267

[更新日志]

070118: 再次修正 ChinaRank.org.cn Rank…… 真麻烦啊……
061224: 修正 ChinaRank.org.cn Rank……
061220: 添加中搜 ChinaRank.org.cn 的 Rank 值获取及显示……
061125: 修正 Firefox 显示不正常的 CSS 问题……

AlexaGoogle 的 Rank 值大伙儿都不会陌生……
前些日子又出来一个 Sogou PR ……
很多查询站点已经推出了它的查询服务……
之前我释出的文件只提供了 Alexa 和 Google 的查询……
恰逢有热心的朋友电邮到我希望我更新……
于是乎花了点时间写了一个类文件来处理以上三种 Rank 值的查询……
(2006-12-20 更新了所谓的 ChinaRank …… 所以是“四”种)
不多说了……
源码释出……

PS:推荐对 Rank 值进行缓存……
否则被谷歌封掉你的 IP 就哭去吧……
(有此惨痛经验的人飘过……)
本类中不含缓存过程……
有兴趣的同学可以看这里……

PS2:默认使用了 curl 系列函式来处理……
如未开启该扩展则进而使用 fopen 方法……
如 allow_url_fopen 未开启……
再进而使用 fsockopen 方式……
如果连它也未开启……
您就不要尝试了……
OTZ .......

PS3:传说 PS3 已经被炒到 RMB 9K ……
我还是玩我的 PSP 去吧……

在线演示http://Demo.QuChao.com/Rank/
打包下载http://www.live-share.com/files/196154/rank.rar.html

目录:

给出使用方法……

Usage:

注意:
域名不要带协议,
比如 http://www.quchao.com 请去掉 'http://'

当前仅支持 alexa 、 google 、 sogou 、 chinarank 四个类型名
其它值将被忽略

一下是调用的例子……

< ?php // +-----------------------------------------------------------------------+ // | Name Rank Fetcher | // | Version 1.4 | // | Author Chappell Wat | // | E-Mail Chappell.Wat@Gmail.com | // | URL http://www.quchao.com/?p=64 | // | Date 2007-1-18 | // +-----------------------------------------------------------------------+ include './class_rank.php'; // set up your domain $rank = new Rank('www.quchao.com'); // output the alexa rank echo $rank->process('alexa'); // output the google page rank echo $rank->process('google'); // output the sogou page rank echo $rank->process('sogou'); // output the chinarank echo $rank->process('chinarank'); ?>

目录:

这里给出 class_rank.php 文件的代码

// +-----------------------------------------------------------------------+ // | Name Rank Fetcher | // | Version 1.4 | // | Author Chappell Wat | // | E-Mail Chappell.Wat@Gmail.com | // | URL http://www.quchao.com/?p=64 | // | Date 2007-1-18 | // +-----------------------------------------------------------------------+ /** * Rank class */ class Rank { // {{{ properties /** * Domain to process. * @var string */ var $_domain = 'www.quchao.com'; /** * Error Message. * @var string */ var $_error = null; // {{{ constructor /** * Constructor. * @param string Domain to process * @return void */ function Rank($domain = 'www.quchao.com') { if(preg_match('/^(?:[^\W_](?:[^\W_]|-){0,61}[^\W_]\.)+[a-zA-Z]{2,6}\.?$/', $domain)) { $this->_domain = $domain; } else { $this->_error = 'Invalid Domain!'; } } // }}} // {{{ destructor /** * Destructor. * @return void */ function __destruct() { } // }}} // {{{ process() /** * Fetch the alexa rank. * @param string Type of rank (alexa, google, sogou) * @return mixed Rank value */ function process($type = 'alexa') { if(in_array(strtolower($type), array('alexa', 'google', 'sogou', 'chinarank'))) { return $this->$type(); } else { $this->_error = 'Non-supported Rank Type!'; return 0; } } // }}} // {{{ alexa() /** * Fetch the alexa rank. * @return mixed Rank value */ function alexa() { $result = $this->fetch('http://data.alexa.com/data/+wQ411en8000lA?cli=10&dat=snba&ver=7.0&cdt=alx_vw%3D20%26wid%3D12206%26act%3D00000000000%26ss%3D1680x16t%3D0%26ttl%3D35371%26vis%3D1%26rq%3D4&url=' . urlencode($this->_domain)); if(preg_match('/TEXT=\"(\d+)\"\/>/', $result, $match)) { return $match[1]; } else { $this->_error = 'Failed to fetch alexa rank!'; return 0; } } // }}} // {{{ google() /** * Fetch the google rank. * @return mixed Rank value */ function google() { $result = $this->fetch('http://www.google.com/search?client=navclient-auto&ch=6' . $this->GCH($this->strord('info:' . $this->_domain)) . '&ie=UTF-8&oe=UTF-8&features=Rank&q=info:' . urlencode($this->_domain)); if (preg_match('/\d+:\d+:(\d+)/', $result, $match)) { return $match[1]; } else { $this->_error = 'Failed to fetch google rank!'; return 0; } } // }}} // {{{ sogou() /** * Fetch the sogou rank. * @return mixed Rank value */ function sogou() { $result = $this->fetch('http://www.sogou.com/web?query=link%3A' . urlencode($this->_domain)); if(preg_match('/<\/span>(\d+)<\/dd>/', $result, $match)) { return $match[1]; } else { $this->_error = 'Failed to fetch sogou rank!'; return 0; } } // }}} // {{{ chinarank() /** * Fetch the ChinaRank rank. * @return mixed Rank value */ function chinarank() { list($msec, $sec) = split(' ', microtime()); $r = $sec . substr($msec, 2, 3); $result = $this->fetch('http://www.chinarank.org.cn/overview/Info.do?url=' . urlencode($this->_domain) . '&r=' . $r); if(preg_match('/class=\"domain\">(\d+)<\/span>/', $result, $match)) { return $match[1]; } else { $this->_error = 'Failed to fetch chinarank!'; return 0; } } // }}} // {{{ fetch() /** * Fetch the remote content. * @param string URL of the page * @return string Content of the page */ function fetch($url) { $content = ''; if(function_exists('curl_init')) { //Curl Method $handle = curl_init(); if(!$handle) { return false; } curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($handle, CURLOPT_FOLLOWLOCATION, 0); $content = curl_exec($handle); curl_close($handle); } elseif(ini_get('allow_url_fopen')) { //File Method $handle = @fopen($url, 'r'); if(!$handle) { return false; } while($buffer = fgets($handle, 4096)) { $content .= $buffer; } fclose($handle); } elseif(function_exists('fsockopen')) { //Socket Method $pos = strpos($url, '://'); $host = substr($url, $pos + 3, strpos($url, '/', $pos + 3) - $pos - 3); $uri = substr($url, strpos($url, '/', $pos + 3)); $request = "GET " . $uri . " HTTP/1.1\r\n" . "Host: " . $host . "\r\n" . "Accept: */*\r\n" . "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n" . "\r\n"; $handle = @fsockopen($host, 80, $errno, $errstr, 30); if(!$handle) { return false; } @fputs($handle, $request); while(!feof($handle)) { $content .= fgets($handle, 4096); } fclose($handle); $separator = strpos($content, "\r\n\r\n"); if($separator === false) { return $content; } else { return substr($content, $separator + 4); } } return $content; } // }}} // {{{ strord() function strord($string) { $strlen = strlen($string); for($i = 0; $i < $strlen; $i++) { $result[$i] = ord($string{$i}); } return $result; } // }}} // {{{ GCH() function GCH($url, $length=null) { $length = sizeof($url); $a = $b = 0x9E3779B9; $c = 0xE6359A60; $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 = $this->mix($a, $b, $c); $a = $mix[0]; $b = $mix[1]; $c = $mix[2]; $k += 12; $len -= 12; } $c += $length; //All the case statements fall through switch($len) { 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 = $this->mix($a, $b, $c); //Report the result return $mix[2]; } // }}} // {{{ mix() function mix($a, $b, $c){ $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c, 13)); $b -= $c; $b -= $a; $b ^= ($a << 8); $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b, 13)); $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c, 12)); $b -= $c; $b -= $a; $b ^= ($a << 16); $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b, 5)); $a -= $b; $a -= $c; $a ^= ($this->zeroFill($c, 3)); $b -= $c; $b -= $a; $b ^= ($a << 10); $c -= $a; $c -= $b; $c ^= ($this->zeroFill($b, 15)); return array($a, $b, $c); } // }}} // {{{ zeroFill() 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; } // }}} } ?>

目录:

不记得以前在哪个论坛见过这种 XHTML + CSS 的 Page Rank Bar ……
(好像是经典?可以通过 XHTML 的验证……)
这次在 CoolCode 那边再次看到使用……
于是存了下来……
现在贴出本部落格使用的样式表……
与传统不同的部分只是添加了一象素的 Padding ……
个人觉得这样处理会好看很多……
不说了……
给出代码……

.rank{margin-left:15px;margin-right:15px;margin-bottom:15px;} .rank_container {width: 80px;text-align: center;font-size: 12px;} .rank_border {border: 1px solid #999999;background-color: #FFFFFF;padding: 1px;margin: 0;text-align: left;display: block;} .rank_bar {width: 80px;height: 6px;border: 0;padding: 0;margin: 0;font-size: 0;display: block;} .rank_rate {width: 0px;height: 6px;padding: 0;margin: 0;border: 0;background-color: #F58EBD;display: block;} #alexa_rank {background-color: #F58EBD;} #google_rank {background-color: #FFBB3C;} #sogou_rank {background-color: #A2BE1B;} #chinarank_rank {background-color: #5392CE;} .clearer{clear:both;}

还是超文本部分:

Alexa Rank

Google Rank

Sogou Rank

ChinaRank

其它的……
大伙儿自己去玩吧……

目录:

写写如何缓存获取到的 Rank 值

我直接用文本方式来储存两个排名值……
然后用 filemtime() 函式来判断更新时间……
最简单的缓存而已嘛……
UNIX 服务器用户甚至可以用 Cron 直接缓存排名值到 JS 文件……
等于每次调用的就只是调用静态文件而已……
而省去了对于更新时间的判断……
岂不更屌?

我的代码:

< ?php // +-----------------------------------------------------------------------+ // | Name Rank Fetcher | // | Version 1.4 | // | Author Chappell Wat | // | E-Mail Chappell.Wat@Gmail.com | // | URL http://www.quchao.com/?p=64 | // | Date 2007-1-18 | // +-----------------------------------------------------------------------+ if(! function_exists("file_put_contents")) { function file_put_contents($filename, $text) { $fp = fopen($filename,"w"); fwrite($fp, $text); fclose($fp); } } // updated every 24 hours, or use 'force_update = true' to update it manually if (@filemtime('rank.cache') < time() - 86400 || $_GET['force_update']) { // write rank cache include './class_rank.php'; $rank = new Rank('www.quchao.com'); $ranks = array( $rank->process('alexa'), $rank->process('google'), $rank->process('sogou'), $rank->process('chinarank'), ); @file_put_contents('rank.cache', implode("\n", $ranks)); } else { // get rank cache $ranks = @file('rank.cache'); } ?>

收工……
吃饭……

目录: