PHP获取MSN好友列表类的实现代码


Posted in PHP onJune 23, 2013
<?php
error_reporting(7);
class msn
{
    private $startcomm = 0;
    private $username = '';
    private $password = '';
    private $commend = '';
    private $domain = '';
    private $socket = '';
    private $challenge = '';
    private $status = array();
    private $data = array();
    function set_account($username, $password)
    {
        $this->username = $username;
        $this->password = $password;
    }
    function getData(){
        $buffer="";
        while (!feof($this->socket)) {
            $buffer .= fread($this->socket,1024);
            if (preg_match("//r/",$buffer)) {
                break;
            }
        }
        $this->checkData($buffer);
    }
    function getData2() {
        $buffer="";
        while (!feof($this->socket)) {
            $buffer .= fread($this->socket,1024);
            if (preg_match("//r/n/r/n/",$buffer)) {
                break;
            }
        }
        $this->checkData($buffer);
    }
    function checkData($buffer) {
        if (preg_match("/lc/=(.+?)/Ui",$buffer,$matches)) {    
            $this->challenge = "lc=" . $matches[1];
        }
        if (preg_match("/(XFR 3 NS )([0-9/./:]+?) (.*) ([0-9/./:]+?)/is",$buffer,$matches)) {
            $split = explode(":",$matches[2]);
            $this->startcomm = 1;
            $this->msn_connect($split[0],$split[1]);
        }
        if (preg_match("/tpf/=([a-zA-Z0-9]+?)/Ui",$buffer,$matches)) {
            $this->nexus_connect($matches[1]);
        }
        $split = explode("/n",$buffer);
        for ($i=0;$i<count($split);$i++) {  
            $detail = explode(" ",$split[$i]);
            if ($detail[0] == "LST") {
                if(isset($detail[2])) $this->data[] = array($detail[1], urldecode($detail[2]));
            }
        }
        $this->status = array(200, $this->data);
        //echo $buffer;
    }
    function msn_connect($server,$port) {
        if ($this->socket) {
            fclose($this->socket);
        }
        $this->socket = @fsockopen($server,$port, $errno, $errstr, 20);
        if (!$this->socket) {
            $this->status = array(500,'MSN验证服务器无法连接');
            return false;
        } else {
            $this->startcomm++;
            $this->send_command("VER " . $this->startcomm . " MSNP8 CVR0",1);
            $this->send_command("CVR " . $this->startcomm . " 0x0409 win 4.10 i386 MSNMSGR 6.2 MSMSGS " . $this->username,1);
            $this->send_command("USR " . $this->startcomm . " TWN I " . $this->username,1);
        }
    }
    function send_command($command) {
        $this->commend = $command;
        $this->startcomm++;       
        fwrite($this->socket,$command . "/r/n");
        $this->getData();
    }
    function nexus_connect($tpf) {
        $arr[] = "GET /rdr/pprdr.asp HTTP/1.0/r/n/r/n";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "https://nexus.passport.com:443/rdr/pprdr.asp");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_VERBOSE, 0);
        curl_setopt($curl, CURLOPT_HEADER,1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $arr);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        $data = curl_exec($curl);
        curl_close($curl);
        preg_match("/DALogin=(.+?),/",$data,$matches);
        if(!isset($matches[1])) return false;
        $split = explode("/",$matches[1]);
        $headers[0] = "GET /$split[1] HTTP/1.1/r/n";
        $headers[1] = "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" . $this->username . ",pwd=" . $this->password . ", " . trim($this->challenge) . "/r/n";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "https://" . $split[0] . ":443/". $split[1]);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_VERBOSE, 0);
        curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_HEADER,1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        $data = curl_exec($curl);
        curl_close($curl);
        preg_match("/t=(.+?)'/",$data,$matches);
        if(!isset($matches[1])){
            $this->status = array(404, '你输入的MSN帐号或者密码错误');
            return false;
        }
        $this->send_command("USR " . $this->startcomm . " TWN S t=" . trim($matches[1]) . "",2);
        $this->send_command("CHG " . $this->startcomm . " HDN",2);
        $this->send_command("SYN " . $this->startcomm . " 0",2);
        $this->getData2();
        $this->send_command("SYN " . $this->startcomm . " 1 46 2",2);
        $this->getData2();
        $this->send_command("CHG ". $this->startcomm . " BSY");
        $this->getData();     
    }
    public function getStatus()
    {
        return $this->status;
    }
}
$msn = new MSN;
$msn->set_account('xx@hotmail.com', 'xxxxx');
$msn->msn_connect("messenger.hotmail.com",1863);
$data = $msn->getStatus();
print_r($data);
?>
PHP 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
PHP递归返回值时出现的问题解决办法
Feb 19 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
解析crontab php自动运行的方法
Jun 24 PHP
php中执行系统命令的方法
Mar 21 PHP
PHP、Java des加密解密实例
Apr 27 PHP
php跨服务器访问方法小结
May 12 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
PHP类相关知识点实例总结
Sep 28 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 PHP
PHP 实现链式操作
Mar 09 PHP
使用php统计字符串中中英文字符的个数
Jun 23 #PHP
php 获取本地IP代码
Jun 23 #PHP
解析PHP提交后跳转
Jun 23 #PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 #PHP
解析MySql与Java的时间类型
Jun 22 #PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 #PHP
解析thinkphp中的M()与D()方法的区别
Jun 22 #PHP
You might like
global.php
2006/12/09 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
javascript读写json示例
2014/04/11 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
大学毕业感言
2014/01/10 职场文书
导师鉴定意见
2015/06/05 职场文书
活动简报范文
2015/07/22 职场文书
中学教代会开幕词
2016/03/04 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP