微博内容过滤

今天精神不太好,突然想到如何针对weibo的内容做流量过滤,以前做过应用识别方面的东西,对这方面比较熟悉,于是安装wireshark抓包,看看在微博上发消息数据包到底是什么样子的。


我用的是新浪微博,发了三条内容如下:

微博内容过滤_第1张图片


通过wireshark过滤找到了相应的session,对应包的内容截图大致如下:

微博内容过滤_第2张图片


通过特征字段:"Host: weibo.com"+"POST /mblog/publish.php"可以确定这个session是由新浪微博用户发消息时产生的,然后直接通过两个换行"0d 0a 0d 0a",定位到content字段,截取后面的内容进行相应的过滤判断即可。


这里再来看看content字段的具体内容:(在网络传输过程中采用的是UTF-8编码,见红色部分)

%E5%A5%BD%E4%B9%85%E6%B2%A1%E4%B8%8A%E4%BA%86%EF%BC%8C%E7%9C%8B%E7%9C%8B%E3%80%82
好久没上了,看看。
aaaa
aaaa
a%E5%95%8A1%E4%B8%80%24%E7%9C%8B%E7%9C%8B
a啊1一$看看

一直没弄清编码转换的原理,于是又在网上进行了相关内容的查阅,可参考阮一峰的文章,很通俗易懂:

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

然后自己又编程验证了下,用到了以前保存的一份代码:

#include "stdafx.h"
#include <locale>
//来自http://www.cppblog.com/fdsajhg/archive/2010/09/03/125770.aspx
// --------- UTF-8转Unicode,单字 ---------------- 
int cU8xU(wchar_t* pOut,const unsigned char *pText){ 
	int ret = 0; 
	char* uchar = (char *)pOut; 
	unsigned cIn = (unsigned char)pText[0]; 
	if(cIn<0x80){              // ASCII  0x00 ~ 0x7f 
		pOut[0] = pText[0]; 
	}else if(cIn<=0xdf){ 
		uchar[0] = (pText[0]<<6)|(pText[1]&0x3f); 
		uchar[1] = (pText[0]>>2)&0x0f; 
		ret = 1; 
	}else if(cIn<=0xef){ 
		uchar[0] = (pText[1]<<6)|(pText[2]&0x3f); 
		uchar[1] = (pText[0]<<4)|((pText[1]>>2)&0x0f); 
		ret = 2; 
	}else if(cIn<=0xf7){ 
		uchar[0] = (pText[2]<<6)|(pText[3]&0x3f); 
		uchar[1] = (pText[1]<<4)|((pText[2]>>2)&0x0f); 
		uchar[2] = ((pText[0]<<2)&0x1c)|((pText[1]>>4)&0x03); 
		ret = 3; 
	} 
	return ret; 
} 

int _tmain(int argc, _TCHAR* argv[])
{
	unsigned char namecn[] = {0xE5,0xA5,0xBD,0xE4,0xB9,0x85,0xE6,0xB2,0xA1,0xE4,0xB8,0x8A,0xE4,0xBA,0x86,0xEF,0xBC,0x8C,0xE7,0x9C,0x8B,0xE7,0x9C,0x8B,0xE3,0x80,0x82};
	wchar_t res[100];
	memset(res, 0 , 100);
	
	for(int i=0, j=0;i<sizeof(namecn);i++,j++){ 
		if(namecn[i]<0x80){
			res[j] = namecn[i]; 
		}else{ 
			i += cU8xU(&res[j],&namecn[i]); 
		} 
	}
	setlocale(LC_ALL, "chs");
	wprintf(L"%s\n",res);
	return 0;
}

与原程序比较,在cIn<=0xdf、cIn<=0xef、cIn<=0xf7这三处我加上了等号,因为输出时发现,","的UTF-8正好是0xEF,0xBC,0x8C,如果没有等号,转换会有问题。另外在输出时,通过locale头文件中的setlocale函数设置一下,才能在控制台中正确输出汉字。(参考: http://apps.hi.baidu.com/share/detail/18550951)


你可能感兴趣的:(微博内容过滤)