2007年1月

vBulletin 官方中文版春节优惠暨许可协议修订公告

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] 用 PHP 获取 Alexa Rank 、 Google PageRank 、 Sogou Rank 和 ChinaRank ……

[更新日志]

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');
}
?>


收工……
吃饭……

目录: