思路:在发表日志的时候插入图片的时候插入一个图片链接,这个链接对应发布了的一个php或者jsp或者asp动态页面(在这个页面中动态生成图片)。在这个页面中,通过request把HTTP头中的referer取出,并且用正则表达式把里面用户的QQ号取出,再把QQ号写在一张自己准备的图片上。这样当QQ用户打开空间的时候,QQ的内部js库就会自动来请求自己写的这个链接,而返回的是我们处理过的图片,原理就这样简单。。。为了看着高端点,把请求链接弄个短网址的形式就OK了。(今天又看到有人转这个东西,遂研究了下。。望高手指教)
补充:QQ号得到了,利用腾讯开放的Api接口就可以得到用户的一些基本信息。(如头像,昵称等)
源码(页面CreateQQImage.jsp):
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%@ page contentType="text/html; charset=UTF-8" import="java.io.FileInputStream,java.awt.*,java.awt.image.*,java.util.regex.*,java.util.*,javax.imageio.*" %>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
String FileName = request.getSession().getServletContext().getRealPath("/")+"Image/ok__.jpg";
//创建一个FileInputStream对象从源图片获取数据流
FileInputStream sFile = new FileInputStream(FileName);
//创建一个Image对象并以源图片数据流填充
Image src = javax.imageio.ImageIO.read(sFile);
// 在内存中创建图象
int width = src.getWidth(null); //得到源图宽
int height = src.getHeight(null); //得到源图长
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics2D g = (Graphics2D) image.createGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.fillRect(0, 0, width, height);
g.drawImage(src,0,0,width,height,null);
//设定字体
g.setFont(new Font("宋体",Font.PLAIN,18));
Pattern p=Pattern.compile("http://user.qzone.qq.com/(\\d+)/infocenter");
String QQ = request.getHeader("Referer").replaceAll("[^\\d]*(\\d)[^\\d]*", "$1");
if(QQ.charAt(0)<='9' && QQ.charAt(0)>='0' && QQ.length()<13&&p.matcher(request.getHeader("Referer")).matches()){
//if(QQ.charAt(0)<='9' && QQ.charAt(0)>='0' && QQ.length()<13){//测试用
String msg="办证加QQ:";
for (int i=0;i<msg.length();i++){
g.setFont(new Font("宋体", Font.BOLD, 16));
// 将认证码显示到图象中
g.setColor(Color.RED);
g.drawString(msg.charAt(i)+"",16*i+6,200);
}
for (int i=0;i<QQ.length();i++){
g.setFont(new Font("宋体", Font.BOLD, 16));
// 将认证码显示到图象中
g.setColor(Color.yellow);//
g.drawString(QQ.charAt(i)+"",10*i+100,200);
}
msg="纯属搞笑";
for (int i=0;i<msg.length();i++){
g.setFont(new Font("宋体", Font.BOLD, 12));
// 将认证码显示到图象中
if(i==0||i==1)
g.setColor(Color.yellow);//
else
g.setColor(Color.blue);
g.drawString(msg.charAt(i)+"",12*i+140,215);
}
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
}
%>