缘起
很多人看到魔力日志都感觉:我靠怎么那么神奇
Zone里我也看到了不少讨论的,但是都没有特别详细的实现方法
特别是我这一年龄段的,空间里都转疯了.
________________________________________
Know it
首先我们只需要了解很简单的一点——这不单单是图片
知道了这一点后,我们开始逐步分析
明显的,在这种魔力日志中,除了QQ号码以及头像等个人信息,其他是不变的
这也是其魔力所在
我们来分析一下如何获得这些信息并与如何与图片融合
QQ:
我们先来了解一下Referer:
Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
//这里我再给大家普及一个小知识(Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了)
当我们在看空间动态的时候,我们所在页面的链接是:http://user.qzone.qq.com/********/infocenter//*****就为我们的QQ号
如果此时我们去访问另外一个页面,Referer将会带上这个链接
$referer=$_SERVER['HTTP_REFERER']; //此语句获取referer内容 $urlArr = explode('/',$referer); //利用explode函数把字符串分割为数组
此时输出:
Array ( [0] => http: [1] => [2] => user.qzone.qq.com [3] => ********* //我们的QQ号 )
看到这里我们真是{高高兴兴兴高采烈烈日当空空空如也野旷天低树江清月近人人山人海海阔天空空穴来风疯疯癫癫}啊,于是就弄一个变量收了我们的QQ号:$qq=$urlarr['3']
再配合我们的QQ空间 API
http://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8
轻松拿下姓名
function getQQNick($qq){ $str = file_get_contents('http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin='.$qq); $pattern = '/'.preg_quote('"nickname":"','/').'(.*?)'.preg_quote('",','/').'/i'; preg_match ( $pattern,$str, $result ); return $result[1]; } function getQQName($qq){ if (!$username) { $username = getQQNick($qq); } return $username; }
然后就是如何写上图片:
$image="xy.png"; $im=imagecreatefrompng($image); $ys1=ImageColorAllocate($im,51,51,51); $ys2=ImageColorAllocate($im,51,51,51); $ys3=ImageColorAllocate($im,51,51,51); $ys4=ImageColorAllocate($im,0,96,192); $ys5=ImageColorAllocate($im,255,255,255); $ys6=ImageColorAllocate($im,255,255,255); ImageTTFText($im,12,0,89,270,$ys1,$fontfile,$username.'wooyun'); ImageTTFText($im,12,0,90,90,$ys2,$fontfile,$qq.''); ImageTTFText($im,12,0,90,170,$ys3,$fontfile,'30000000000000000000');
ImageCreateFromPNG 取出 PNG 图型 → ImageColorAllocate 填充图片需要修改地方 → ImageTTFText → 写入文字‘
可用Photoshop协助完成
以上就是核心思想了
补全其余部分,Poc:
<?php $referer=$_SERVER['HTTP_REFERER']; if(!strpos($referer,'infocenter')){ header('Location: moren7.png'); exit(); } //此处判断是否从个人中心进入 $urlArr = explode('/',$referer); $qq=$urlArr['3']; $username = getQQName($qq); $fontfile = "fonts/msyh.ttf"; header("Content-type: image/png"); $image="xy.png"; $im=imagecreatefrompng($image); $ys1=ImageColorAllocate($im,51,51,51); $ys2=ImageColorAllocate($im,51,51,51); $ys3=ImageColorAllocate($im,51,51,51); $ys4=ImageColorAllocate($im,0,96,192); $ys5=ImageColorAllocate($im,255,255,255); $ys6=ImageColorAllocate($im,255,255,255); ImageTTFText($im,12,0,89,270,$ys1,$fontfile,$username.'wooyun'); ImageTTFText($im,12,0,90,90,$ys2,$fontfile,$qq.''); ImageTTFText($im,12,0,90,170,$ys3,$fontfile,'30000000000000000000'); ImageTTFText($im,12,0,274,147,$ys4,$fontfile,''); ImageTTFText($im,12,0,0,14,$ys5,$fontfile,''); ImageTTFText($im,12,0,0,14,$ys6,$fontfile,''); Imagegif($im); ImageDestroy($im); exit(); function getQQNick($qq){ $str = file_get_contents('http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin='.$qq); $pattern = '/'.preg_quote('"nickname":"','/').'(.*?)'.preg_quote('",','/').'/i'; preg_match ( $pattern,$str, $result ); return $result[1]; } function getQQName($qq){ if (!$username) { $username = getQQNick($qq); } return $username; } ?>
________________________________________
Do it
做一张高端大气上档次的图片,然后经过以上处理后,上传到虚拟空间。(这里我使用在QQ空间里传过的一张图片)
记录下此php的路径
下一步非常重要:去把此地址使用短地址缩短.
Reason:
QQ空间为了防止referer潜在的安全问题和防止图片被防盗链下了很大功夫,凡是发表到QQ空间的日志,正文都会把引用到的所有第三方图片资源缓存到腾讯的云端上。所以直接在日志正文中引用的图片,是不会提交REFER到我们的服务器脚本上的。
当然也可以直接在源码里停止输出不缓存.
然后我们把缩短了的路径在QQ空间日志功能里输入
发布并转载
查看效果
相关讨论:
1#
TellYouThat | 2013-11-19 18:14
流弊
2#
MeirLin (求一打杂工作,) | 2013-11-19 18:15
网上有方法
3#
Black-Hole (我的嘴唇最要滋润下...) | 2013-11-19 18:22
早知道了....
4#
苦战 | 2013-11-19 18:26
早玩过了
5#
xsjswt | 2013-11-19 18:52
解析一下json会死么,非拿一个正则去匹配
6#
NetSeif | 2013-11-19 19:00
最后的图是啥意思?
7#
NetSeif | 2013-11-19 20:13
赶脚像是动态生产图片么。。。像是贴吧那群觉得很神奇的“回复图片有惊喜”似的
8#
_Evil (我绝对不是数据流的马甲!我爱数据流帅哥!) | 2013-11-19 21:40
@xsjswt WooYun: 360某json hijacking(只要你登陆访问,我就知道你的用户名,邮箱)
9#
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-11-20 09:29
05-08年贴吧、论坛很流行这玩意儿,后来低调了一段时间,现在又开始火起来了……
10#
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-11-20 09:29
05-08年贴吧、论坛很流行这玩意儿,后来冷淡了一段时间,现在又开始火起来了……