大家都曾在空间里面看到一种日志,说他神奇是因为里面有一张带有自己昵称和QQ号的图片,而且是谁看,就会显示谁的。
我第一次看到的时候也感觉很神奇,通过查看源代码发现它不是一张纯粹的图片。
<img?height="300"?onload="QZFL.media.reduceImage(0,400,300,{trueSrc:'http:\/\/url.cn\/MIFayY',callback:function(img,type,ew,eh,o){var _h = Math.floor(o.oh/o.k),_w = Math.floor(o.ow/o.k);if(_w<=ew && _h<=eh){var p=img.parentNode;p.style.width=_w+'px';p.style.height=_h+'px';}}})"?src="http://url.cn/MIFayY">
它的图片地址指向的是一个远程地址,说明它是由程序加工而成的。但是它是怎么获得我的QQ信息的呢?我想这应该是referer搞的鬼。大家一定也注意到了,只有分享和转载后在个人中心才能看到 效果,这是为什么呢?腾讯在QQ空间防止referer潜在的安全问题和防止图片被防盗上是下了功夫的,凡是发表到QQ空间的日志,正文都会把引用到的所有第三方图片资源缓存到腾讯的云端上,所以直接在日志正文中引用的图片,是不会提交REFER到我们的服务器脚本上的,也就不会看到你想要的效果,但是在个人中心就不同了。大家观察一下上面的图片代码,里面有一个DOM操作,即“onload”。原来在QQ空间还是可以看到源图片的,似乎仅限于个人中心,这时候图片附带的HTTP_REFERER值就是地址栏中的地址。你的QQ号码就是这么得来的。
如果匹配不到QQ号程序就会将页面跳转到一张图片上,我的设置的是蓝胖子(哆啦A梦),如果匹配到QQ号,就利用腾讯的开放接口 ”http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin=QQ号码“获取QQ信息。这个接口不需要任何凭证信息即可获取uins指定的QQ号码的头像、昵称信息。
剩下的工作都得益于服务器端脚本的图像处理功能,所以实现这个效果就比较简单了,通过REFERER检测用户的QQ号码,然后在后台下载头像、昵称等信息,用GD函数绘制上图片,返回客户端。
我自己也做了一个类似的图片,地址是 http://url.cn/MIFayY,只要你在空间发表日志添加一个网络图片,填进去此链接就可以发表魔法日志了。只要你想的到,可以设置任何你想要的背景图片,将你想获取的QQ用户的信息附加在这张图片上面。
下面我把我的源代码粘出来给大家分享一下,我是用PHP写的,希望对大家有帮助,也恳请大家提出意见。利用这个原理,在图片中显示天气预报、客户端信息(浏览器、操作系统、IP所在地之类)、随机笑话、倒计时等五花八门的功能都是So Easy的。这样,大家对这个魔法图片中显示自己的头像,昵称,地理信息等等不再疑惑了吧。
<?php /** * Title : QQ空间魔法日志 * Date : 2013-09-09 * Author: DekarJoe(Zhou) /** //获取HTTP_REFERER的值 $referer = $_SERVER['HTTP_REFERER']; //定义匹配规则 $pattern = "/http:\/\/user.qzone.qq.com\/(\d+)\/infocenter/"; //如果匹配不到QQ号码则显示已经准备好的另外一张图片 if(!preg_match($pattern, $referer, $matches)) { header("location:jiqimao.png"); die; } //利用腾讯的接口获取QQ信息 $tencentAPI = 'http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin='.$matches[1]; $text = trim(file_get_contents ($tencentAPI)); //对返回的数据进行一下处理 $text = json_decode(substr(substr($text,10),0,-2),true); header("Content-type:image/png"); //得到背景图片信息 $dst_im = imagecreatefrompng('./qq2.png'); $dst_info = getimagesize('./qq2.png'); //获取QQ头像 $filename = $text['avatarUrl']; $file_info = getimagesize($filename); //获取图片格式,比如jpeg,png,gif等 $type = explode('/',$file_info['mime']); list($width, $height) = getimagesize($filename); $src_im = imagecreatetruecolor(40,40); $function = 'imagecreatefrom'.$type[1]; $image = $function($filename); imagecopyresampled($src_im, $image, 0, 0, 0, 0,40, 40, $width, $height); //水印透明度 $alpha = 100; //合并水印图片 上158 左8 imagecopymerge($dst_im,$src_im,8,158,0,0,40,40,$alpha); //昵称 上175 左55 颜色0 $nickname = $text['nickname'].'('.$text['uin'].')'; imagettftext($dst_im, 10, 0, 55, 175, 0, "./fonts/simsun.ttc", $nickname); //输出图片 ImagePng($dst_im); //销毁变量 ImageDestroy($myImage); ?>
发表回复