rflash

上图是腾讯soso网站上的人物关系图,其原理估计是在各种网页中识别人名、提取关键字,然后生成数据。当然也有更好或者更土鳖的方法。从创意上看,可能(未经过考证)是模仿了Google罗盘,如搜索 “uchome 内存 泄露”  。

我想很多SNS网站都希望做出这样的效果,来描述用户及其好友之间的发现关系。如何把这个flash剥离下来用到自己的网站上呢?

这个swf可以通过迅雷直接下载,它接收的参数如下:

  • tagkeyword:搜索的关键词,如:陈冠希
  • tagreldataurl:一个url,最终用来获取陈冠希的关系数据,请求格式为url?kw=陈冠希, 返回的是二进制数据。该二进制数据在服务器端的生成方法稍后介绍。
  • taghpicurl:一个url,用来获取人物头像,格式为url?kw=陈冠希
  • tagrandomurl:左上角随机访问的url。请求格式为:url?en=utf8&pid=tag.wal.r&ch=wal.random&r=0.12345
  • tagnewstagnewsrel :用来获取新闻数据的url,访问格式为:url?kw=陈冠希+艳照门+阿娇 , 要注意的是这里的关键词一般是两个人名及之间的关系。
  • tagsearchtagjumpreltagjumpmap:都是用来搜索和跳转的url,对flash影响不大。

在SNS中,使用场景很容易找到,一个最基本的:人物的好友关系(也可能是其能见人或者不能见人的关系),点击好友时,就出现这个好友最新的照片、日志、秘密等。效果很酷,也很实用。

其中各个url返回的数据的格式大多都是明文发送,用httpwatch或者firebug就能抓到,我就不废话了。要说的是tagreldataurl这个请求,返回的是二进制如何在服务端伪造:将文本转化为ByteArray,然后用zlib压缩。文本原文的格式如下(搜索刘翔的部分结果):

刘翔 孙海平 0 1215.45 接近复出,准备复出,就像豆腐渣,还有问题
麦迪
韩寒 1 0.001 冰冻三尺
冯树勇
纪伟 1 0.001 潜力选手,接班

第一列和第二列是一条关系上的两个人(让我想起一句话:一条藤上的2个苦瓜);第三列的值为0或者1,和查询关键词相关的为0,其它的为1 ;第四列可能是两个人的关系强度;最后是关系的关键词,可能有多个,用英文逗号分隔。

压缩和解压算法(用JAVA实现,从google上搜索来的)如下:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
 
public class CodiggTest {
 
	public static void main(String[] args) throws Exception {
		String content = "这里是原文";
		byte[] result = compressBytes(content.getBytes("UTF8"));
		// TODO: 这里该干嘛干嘛
	}
 
	private static int cachesize = 1024;
	private static Inflater decompresser = new Inflater();
	private static Deflater compresser = new Deflater();
 
	public static byte[] compressBytes(byte input[]) {
		compresser.reset();
		compresser.setInput(input);
		compresser.finish();
		byte output[] = new byte[0];
		ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
		try {
			byte[] buf = new byte[cachesize];
			int got;
			while (!compresser.finished()) {
				got = compresser.deflate(buf);
				o.write(buf, 0, got);
			}
			output = o.toByteArray();
		} finally {
			try {
				o.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return output;
	}
 
	public static byte[] decompressBytes(byte input[]) {
		byte output[] = new byte[0];
		decompresser.reset();
		decompresser.setInput(input);
		ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
		try {
			byte[] buf = new byte[cachesize];
			int got;
			while (!decompresser.finished()) {
				got = decompresser.inflate(buf);
				o.write(buf, 0, got);
			}
			output = o.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				o.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return output;
	}
}

基本原理就是如此,这样就可以伪造兼容请求格式的服务端,然后在swf上带上这几个参数进行使用,如:

codigg.swf?tagkeyword=陈冠希&tagreldataurl=你的URL&taghpicurl=你的另一个URL&….

可见soso封装得还真是不错。

可能有人问,上面还有soso的好多logo怎么办?我只能说,这个swf是没有加壳的,可以直接反编译。鉴于珊瑚虫qq作者的前车之鉴,本站肯定是不会提供现成的程序了。大伙自己想办法吧。