QQ空间魔法日志详解

大家都曾在空间里面看到一种日志,说他神奇是因为里面有一张带有自己昵称和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);
?>

已发布

分类

,

作者:

标签

评论

《“QQ空间魔法日志详解”》 有 1 条评论

  1. shhider 的头像
    shhider

    博主,你好。你试一试你的程序还能不能在空间显示。我之前也一样的方法做了,发日志总是保存到云端,即使是在个人中心。但是我有看到有其他的日志可以……纠结死我了,求解

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注