QQ空间“神奇”魔力图片显示浏览者本人QQ信息原理解析

        现在 QQ 空间上的奇葩不是一般的多,总是会转发和分享一大堆无营养的东西……看过空间的人应该都见过有人会转发和分享一些特殊的图片,这样的图片能够显示出你的 QQ 账号和一些基本信息,有些看上去挺好笑的而有的会让人很不舒服……由此令广大乡村非主流 QQ 空间用户啧啧称奇并广泛转发……那么这样的图片是什么原理呢?虽然感觉没多大意义,但自从放假后就陆续有 MJJ 来问是怎么个原理,从网上也找了些资料后,还是来解释一下这种图片的原理吧:

        首先大家需要先知道浏览器上有一个 referer 的概念(当浏览器向服务器发送请求的时候,referer 会告诉服务器我是从哪个页面链接过来的——服务器籍此可以获得一些信息用于处理。比如说你的 QQ 账号是 123456,当你打开你的 QQ 空间的时候,浏览器返回的数据就是 http://user.qzone.qq.com/123456/infocenter,告诉服务器这是 123456 的 QQ 空间

        既然能够得到账户信息,接下来的事情就好办了,制作者在自己的服务器上运行已经写好的程序(常见的语言都能实现),程序通过浏览器 referer 返回的数据获得你的账户信息,在通过坑爹疼讯给开发者的 API 接口(参考疼讯 API 列表:http://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8)获取 QQ123456 其他更详细的资料。比如说昵称、性别、头像等数据。

        得到了想要得到的数据,程序便通过 GD 函数库绘制出图片,再返回到服务器,这样就得到了一张能够显示你的账户信息的、独一无二的临时图片。传播者插入刚刚生成图片的程序地址,作为日志或是说说分享发布在网络上,当其他人看到那张图片的时候,服务器上的程序按照刚刚所说的步骤生成带有你账户信息的图片并让你看到,这样魔力效果就出来了。

接下来从伪程序员的角度来分析一下一篇从网上找来的 PHP 代码

<?php
Header("Content-type: image/jpeg");//从referer查找QQ号
function findNum($str=''){
$str=trim($str);
if(empty($str)){return '';}
$result='';
for($i=0;$i<strlen($str);$i++){
if(is_numeric($str[$i])){
$result.=$str[$i];
}
}
return $result;
}
$referer=$_SERVER['HTTP_REFERER'];
$img=imagecreatefromjpeg("bg2.jpg");//载入背景图片
$textColor=imagecolorallocate($img, 255, 0, 0);//设置字体着色,RGB
$font="../test/stct.ttf";//字体,若字体不对,则可能无法输出。
$qqName=iconv('GB2312', 'UTF-8',"魔力日志,转载后用电脑看~");
$qqNo=iconv('GB2312', 'UTF-8',"made by 652585345");
if(empty($referer)){//什么也不返回很重要的,要不然qq空间就会缓存后不能动态加载。
}else{
$qqNo=findNum($referer);
if(strlen($qqNo)<5 || strlen($qqNo)>13){
$qqNo=iconv('GB2312', 'UTF-8',"made by 652585345");
}else{
$urlText=file_get_contents("http://base.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=$qqNo");
//在一些地区这个地址可以获取到qq的一些信息,可以copy到浏览器把$qqNo换成qq号。
$startIndex=strpos($urlText,"[");
$endIndex=strpos($urlText,"}");
$json=substr($urlText,$startIndex,$endIndex-$startIndex);
$jsonObj=json_decode(iconv('GB2312', 'UTF-8',$json));
$qqName=$jsonObj[6];
$img1 =@imagecreatefromjpeg($jsonObj[0]); //获取QQ头像
imagecopymerge($img,$img1,280,220,0,0,100,100,100);//QQ头像和原头像拼接
}
imagettftext($img, 15, 0, 120, 235, $textColor, $font, $qqName);//输出网名
imagettftext($img, 15, 0, 120, 295, $textColor, $font, "$qqNo");//输出QQ号
imagejpeg($img);//建立jpeg图形 
imagedestroy($img);//结束图形并输出


        实际上一路走下去就会发现,这样的方法早在很早之前就烂大街了(参考很久之前 BBS 上那些签名档上显示你 IP 和各种信息的妖孽们),而且本身被腾讯 API 接口所限制所以并不涉及敏感隐私问题。充其量只是拿来开开玩笑,吓唬吓唬人,没有任何实际用途。

本文链接:https://zeallr.com/read/348.html
若无特别说明,本文系原创,且遵循 创意共享 4.0 许可证 (署名 - 非商业性使用 - 相同方式共享)

    蚊哥's Blog
    蚊哥's Blog  2014-01-27, 17:53

    原来这么容易实现{smile:7}

    Pang
    Pang  2014-02-15, 10:40

    {smile:4}{smile:4}伪程序员 哈哈

    蚊哥
    蚊哥  2014-08-29, 18:40

    话说这篇文章貌似是转我的吧?而且我不记得有在这里评过论的,怎么会有我的评论出现在这里= =