经常看见有人转发图片,然后上面会显示自己的qq信息,其实原理很简单,就是根据http referer找出你的qq号,然后调用腾讯的api来查询qq对应的信息,最后,利用脚本(比如php)生成一张图片即可。
-----------------------------------
原来我也模仿着写过这样一个脚本,只是不能支持中文,代码现在找不到了,就把别人的思路贴在下面(原地址:http://blog.csdn.net/artemisrj/article/details/9570645):
昨晚上偶然看到个比较坑爹的日志,正文有一张图片,在好友动态列表查看的时候可以显示自己(不是发日志的好友,是你自己)的头像和QQ号码、昵称。
由于这张坑爹图片的存在,文章转发量短短三天内过千。这招可比那些疯狂加群发广告的来的更有创意和杀伤力,转载传播图片(包括日志当中的广告)的人几乎是全网用
户(跟所谓病毒营销差不多了)。
一看就知道是检测referer的把戏。
早在几年前BBS还在流行的时候,很多人设置的签名图具有天气预报、客户端信息(浏览器、操作系统、IP所在地之类)、随机笑话、倒计时等五花八门的功能。
这都得益于服务器端脚本的图像处理功能。而客户端的检测则是基于HTTP请求中的UserAgent和Referer等信息。
"请转载后用电脑进入个人中心看”。为什么要特别说明是“个人中心”呢?
原来QQ空间还是会显示源地址的图片的,仅限于在“个人中心”。这时候请求图片附带的HTTP_REFERER的值为http://user.qzone.qq.com/QQ号/infocenter
号码就是这样提取到的。如果REFERER不满足条件,这个php将在header中发送Location跳转到同一目录下的no.png。
那么后台是如何取到QQ头像、昵称等信息的呢?我Google到了一个腾讯的WebService接口:http://base.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=QQ号,
不需要任何凭证信息即可获取uins指定的QQ号码的头像、昵称信息,返回的格式为JSON。另外上面的图片还有一个显示地理位置和ISP的功能,这个就比较常见了。
我找到了一个比较好用的接口,来自TB:http://ip.taobao.com/service/getIpInfo.php?ip=127.0.0.1,格式同样也是JSON。
接下来实现这个效果就比较简单了,通过REFERER检测用户的QQ号码,然后在后台下载头像、昵称等信息,用GD函数绘制上图片,返回客户端。
我也折腾了一个‘神奇图片“发到空间,居然捉弄了一群人。下面是php语言的实现代码。为了减少后端的流量,对下载的头像做了缓存处理:
<?php error_reporting(0); ob_start(); header(‘Content-Type: image/png‘); define(‘IMG_NO‘, "no.png"); #刚开始显示的提示信息 define(‘IMG_BACKGROUND‘, "background.png"); define(‘IMG_WIDTH‘, 400); define(‘IMG_HEIGHT‘, 128); define(‘FONT_NAME‘, "AdobeHeitiStd-Regular.otf"); #字体文件名 define(‘CACHE_PATH‘, rtrim(realpath("./cache"), ‘/‘).‘/‘); #缓存目录 define(‘CACHE_EXPIRE‘, 60*60); #缓存时间,单位秒 #(!is_dir(CACHE_PATH) && is_writable(CACHE_PATH)) || die; /* $remote: 远程URL $local: 本地缓存路径 $expire: 过期时间。为-1时,永久不更新缓存 */ function load_from_cache($remote, $local, $expire = CACHE_EXPIRE, $as_path = false) { #过滤潜在的危险字符 $local = preg_replace("/[.\/\\\?\*\‘\"\|\:\<\>]/", "_", $local); $cache = CACHE_PATH.$local; #查找缓存 if(file_exists($cache) && ($expire = -1 || filemtime($cache) - time() < $expire)) return $as_path ? $cache : file_get_contents($cache); #文件不存在或缓存过期,重新下载 $content = file_get_contents($remote); file_put_contents($cache, $content); return $as_path ? $cache : $content; } /* 返回客户端信息。 */ function client_info() { $url = "http://ip.taobao.com/service/getIpInfo.php?ip="; $ip = ($_SERVER["HTTP_VIA"] && $_SERVER["HTTP_X_FORWARDED_FOR"] ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]); $info = explode(‘"‘, load_from_cache($url.$ip, $ip, -1)); $string = $info[7].$info[23].$info[31].$info[47]; return json_decode(‘"‘.$string.‘"‘); } $referer = $_SERVER[‘HTTP_REFERER‘]; #$referer = "http://user.qzone.qq.com/123456789/infocenter"; $pattern = "/http:\/\/user.qzone.qq.com\/(\d+)\/infocenter/"; if(preg_match($pattern, $referer, $matches)) { #获取QQ号码 $uin = $matches[1]; $info = explode(‘"‘, load_from_cache( "http://base.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=".$uin, $uin)); $avatar = $info[3]; $nickname = iconv("GBK", "UTF-8//IGNORE", $info[5]); $client = client_info(); #重点来了,生成图片 try{ $im = imagecreatefrompng(IMG_BACKGROUND); #绘制头像 $avatar_file = load_from_cache($avatar, $uin.".jpg", 60*60*24, true); $im_avatar = imagecreatefromjpeg($avatar_file); imagecopymerge($im, $im_avatar, 14, 14, 0, 0, 100, 100, 100); imagedestroy($im_avatar); #绘制文字 $blue = imagecolorallocate($im, 0, 0x99, 0xFF); $white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF); $texts = array( array(12, 148, 40, $white, $uin), array(18, 125, 70, $blue, $nickname), array(16, 125, 100, $blue, $client) ); foreach($texts as $key=>$value) { imagettftext($im, $value[0], 0, $value[1], $value[2], $value[3], FONT_NAME, mb_convert_encoding($value[4], "html-entities", "utf-8")); #解决乱码问题 } imagepng($im); imagedestroy($im); header("Content-Length: ".ob_get_length()); ob_end_flush(); } catch (Exception $e) { #die($e->getMessage()); $error = true; } } else { $error = true; } if($error){ header(‘Content-Length: ‘.filesize(IMG_NO)); echo file_get_contents(IMG_NO); }
-----------------------------------
update
记录一个别人的接口:
http://image.huohoo.com:81/file1.jpg
注意,如果直接打开的话,会产生重定向。需要加入以下cookie:
from_uin=123456789(这里是qq号)
效果展示:
1.jpg:
2.jpg:
3.jpg:
原文:http://blog.csdn.net/wusuopubupt/article/details/19035555