SNS常用功能解密系列(一):QQ Mail 通讯录导入

2009年3月8日 | 分类: PHP | 标签:

  SNS风风火火好一阵了,各家所推行的主导概念可能不尽一样,但都会具备一些基本功能,如通讯录导入、在线拍照、批量照片上传等,SNS常用功能解密系列就这些功能的说说实现方法。
开篇先说一下 QQ Mail 通讯录导入的实现。前不久看到有位朋友写了python 的实现方法http://jinhao.javaeye.com/blog/333104,我的做法是php curl .实际原理差不多,python的实现说得很清楚了,就不再啰嗦了。

php 实现的关键代码:

define( "COOKIEJAR", tempnam( ini_get( "upload_tmp_dir" ), "cookie" ) );
$header = array(
"Cookie:verifysession=".$arr_cookies['verifysession'],
"Content-Type:application/x-www-form-urlencoded",
"Referer:http://mail.qq.com/",
"User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)"
);

$ch = curl_init( );
curl_setopt( $ch, CURLOPT_URL, "http://".$arr_post['server_num'].".mail.qq.com/cgi-bin/login?sid=0,2,zh_CN" );
//curl_setopt( $ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded") );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $str_postdata);
curl_setopt( $ch, CURLOPT_COOKIEFILE, COOKIEJAR );
curl_setopt( $ch, CURLOPT_COOKIEJAR, COOKIEJAR);
//将linux系统的换行符\n替换为windows下的换行符\n\r
curl_setopt($ch, CURLOPT_CRLF, true);
curl_setopt( $ch, CURLOPT_TIMEOUT, 30 );
//设置自定义头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, false);

//当执行curl_exec($ch)时返回字符串,而不是直接输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

//来源
curl_setopt($ch, CURLOPT_REFERER, "http://mail.qq.com");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//强制建立一个新的会话,而不是重用缓存的会话
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
//连接时间限制
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
$contents = curl_exec( $ch );
curl_close( $ch );
unset($header);
unset($arr_cookies);

$exp_match = "/frame_html\?sid=(.*)/";
preg_match_all($exp_match, $contents, $match);

$sid = $match[1][0];

其中 $arr_cookies['verifysession'] 来处读取图版验证码时的cookies.  如果还不明白,大家可以用httpwatch分析一下

Demo: http://www.cnspica.com/demo/qq/login.php
(担心QQ密码,信不过在下的就不要试了)

目前还没有任何评论.