一、最终效果
当在你自己的空间时就会看到QQ号是你自己的,而浏览器信息也是自己的,当然还有昵称也是自己的昵称。看似很神奇,到底是怎么做出来的呢?
二、原理分析
首先呢,这个东西是在自己空间才能看到的。所以可以肯定的是这牵扯到了自己的账号登陆相关信息。其次这个图片是动态变化的,所以可以肯定不是用PS之类的P图P上去的,而是使用编程语言动态生成的。生成图片很多语言都可以,本例采用PHP来生成图片。
为了不对高手啰嗦,下面直接上源码,自行下载:
完全的源码,毫无修改。
三、部分代码讲解
<?php
$ment = $_SERVER["HTTP_REFERER"];
if($ment == 'http://cnc.qzs.qq.com/qzone/newblog/v5/editor.html'){
header("HTTP/1.0 500 Internal Server Error");
exit;}
preg_match("#[0-9]{5,11}#",$ment,$rr);
$qqnumber=$rr[0];
$webtext = file_get_contents('http://liyaodong.sinaapp.com/qzoneapi/qqinfo-service.php?qq='.$qqnumber);
$temp1 = explode('[',$webtext);
$temp2 = explode(',',$temp1[1]);
$nickname = $temp2[6];
ob_clean();
$userBrowser = userBrowser();
function userBrowser(){
$user_OSagent = $_SERVER['HTTP_USER_AGENT'];
if(strpos($user_OSagent,"Maxthon") && strpos($user_OSagent,"MSIE")) {
$visitor_browser ="Maxthon(Microsoft IE)";
}elseif(strpos($user_OSagent,"Maxthon 2.0")) {
$visitor_browser ="Maxthon 2.0";
}elseif(strpos($user_OSagent,"Maxthon")) {
$visitor_browser ="Maxthon";
}elseif(strpos($user_OSagent,"MSIE 9.0")) {
$visitor_browser ="MSIE 9.0";
}elseif(strpos($user_OSagent,"MSIE 8.0")) {
$visitor_browser ="MSIE 8.0";
}elseif(strpos($user_OSagent,"MSIE 7.0")) {
$visitor_browser ="MSIE 7.0";
}elseif(strpos($user_OSagent,"MSIE 6.0")) {
$visitor_browser ="MSIE 6.0";
} elseif(strpos($user_OSagent,"MSIE 5.5")) {
$visitor_browser ="MSIE 5.5";
} elseif(strpos($user_OSagent,"MSIE 5.0")) {
$visitor_browser ="MSIE 5.0";
} elseif(strpos($user_OSagent,"MSIE 4.01")) {
$visitor_browser ="MSIE 4.01";
}elseif(strpos($user_OSagent,"MSIE")) {
$visitor_browser ="MSIE >=10.0";
}elseif(strpos($user_OSagent,"NetCaptor")) {
$visitor_browser ="NetCaptor";
} elseif(strpos($user_OSagent,"Netscape")) {
$visitor_browser ="Netscape";
}elseif(strpos($user_OSagent,"Chrome")) {
$visitor_browser ="Chrome";
} elseif(strpos($user_OSagent,"Lynx")) {
$visitor_browser ="Lynx";
} elseif(strpos($user_OSagent,"Opera")) {
$visitor_browser ="Opera";
} elseif(strpos($user_OSagent,"Konqueror")) {
$visitor_browser ="Konqueror";
} elseif(strpos($user_OSagent,"Mozilla/5.0")) {
$visitor_browser ="Mozilla";
} elseif(strpos($user_OSagent,"Firefox")) {
$visitor_browser ="Firefox";
}elseif(strpos($user_OSagent,"U")) {
$visitor_browser ="Firefox";
} else {
$visitor_browser ="unknow";
}
return $visitor_browser;
}
$nickname = iconv("GBK","UTF8//IGNORE",$nickname);
$nickname = str_replace('"', '', $nickname);
$qqnumber = ' '.$qqnumber;
$userBrowser = $userBrowser.' '.'Browser'.' ';
$f = new SaeFetchurl();
$img_data = $f->fetch( 'http://i1168.photobucket.com/albums/r494/xiaofengdongdong/1-1.jpg' );
$img = new SaeImage();
$img->setData( $img_data);
//实例化SaeImage并取得最大一张图片的大小,稍后用于设定合成后图片的画布大小
//执行合成
$img->annotate($nickname,$opacity = 0.8,$gravity = 2,$font = array("name"=>SAE_MicroHei, "size"=>30, "weight"=>150, "color"=>"black"));
$img->annotate($qqnumber,$opacity = 0.8,$gravity = 4,$font = array("name"=>SAE_MicroHei, "size"=>20, "weight"=>300, "color"=>"black"));
$img->annotate($userBrowser,$opacity = 0.8,$gravity = 6,$font = array("name"=>SAE_MicroHei, "size"=>20, "weight"=>300, "color"=>"black"));
//输出图片
$img->exec('jpg', true);
?>
这段代码中最需要理解的一个就是HTTP REFERER,这是整个程序的核心。当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。因此当你从QQ空间访问到该图片时就会有Referer告诉服务器你是从哪里点过来的,而这个Referer里就藏有你的QQ号码。使用Google Chrome的同学可以按F12打开开发者工具,查看某个HTML文档的Header就可以找到该文档的Referer信息。
在你获得了点击来源之后,下面需要做的就是把Referer信息中的QQ号提取出来,然后再通过QQ空间的API查询该QQ号码的相关信息。这个API的地址就是
http://base.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=123456789
uins后边跟着你要查询的QQ号码就可以了。在你访问之后返回的数据是JSON格式的:
`portraitCallBack({“123456789”:[“http://qlogo2.store.qq.com/qzone/123456789/123456789/100”,91922,-1,8,0,1,“今日观察”,0]})``
然后再用PHP对返回的数据进行解析,可以得到的信息有该QQ号码的头像地址、昵称、QQ号码等信息。
得到相关数据后接下来要做的就是把这些信息通过PHP或者其他你喜欢的语言生成图片就可以了。就像图片加水印的原理一样,先用PS美化好一张底图,然后再设置文字大小、位置、颜色等信息。然后再输出到浏览器里。大功告成。
四、在QQ空间发布
如果你直接在空间里用说说或者日志插入你会发现无法插入,因为地址格式不对,地址的后缀不是jpg或者png结尾的。所以这个时候需要用到一点HTML代码的知识。在日志中可以切换到HTML输入,在右上角。切换到HTML代码输入后在日志中写<img src="你的动态图片地址" />
这样就可以插入进去了。
总的来说没有多少技术含量,对于PHP大神来说都是小菜一碟的事情。由于时间仓促,代码写的很凌乱,各位大神不喜勿喷,欢迎加入网络极客QQ群:277076455一同交流。