接口?~MSN是提交命令行的形式来操作的,我参考的类(MSNP)只能实现别人主动发起连接,然后应答连接并返回消息~(例子是返回接受到的消息)
但这样对WEB程序没有意义,因为WEB程序是一次执行的,我要发送自己的消息的话,必须执行一次提交,POST也好,AJAX也好,理论上就是和MSN断开了连接,也就是必须重新连接,而刚刚的应答也消失了,所以MSNP一点不实用啊~很多PHP的MSN类,都登陆就断开了,并没有实现真正的WEB MSN功能~我很奇怪的是,我根据网上的协议分析,一步步来,终于现在能实现登陆了,然后利用
CAL 命令请求连线,按协议的规范,无论是V9还是V15,正常情况下,MSN服务器应该返回一个CAL,表示同意连接~
但是我返回了一个错误编号911~MSN服务器直接把我T出了登陆连接~
CAL不完成,我就没办法发送消息了~但看了很多例子,都是在XFR请求到DS服务器后直接实现CAL的~而如果不发送XFR命令得到DS服务器地址的话,直接CAL其实没有任何返回……郁闷!

解决方案 »

  1.   

    我把这几天了解到的命令贴一下MSN V9 协议解析* 命令行需要 \r\n (这里不清楚在WIN的系统上,是否\r就可以~,在LINUX上必须是完整的换行符~)
    messenger.hotmail.com:1863 # SOCKET请求,发送!
    >>> VER {trID} MSNP9 CVR0   # MSN协议协商
    <<< VER {trID} MSNP9 CVR0      # 得到允许协议
    >>> CVR {trID} 0x0409 win 4.10 i386 MSNMSGR 7.0.0816 MSMSGS {userName} \r\n # MSN环境协商
    <<< CVR {trID} 7.0.0820 7.0.0820 7.0.0820 http://msgruser.dlservice.microsoft.com/download/9/7/6/976085F9-D0F8-4D96-9208 -FC1B461CD3D7/Install_MSN_Messenger_DL.exe http://messenger.msn.com CVR {trID} 7.0.0820 7.0.0820 7.0.0820  
    # MSN环境允许
    >>> USR {trID} TWN I {userName}   # 服务器请求协商
    <<< XFR 3 NS 207.46.107.41:1863 0 65.54.239.210:1863  # 服务器连接地址----> 重新登陆指定服务器,协定协议,环境信息~
    >>> USR {trID} TWN I {userName}   # 服务器请求协商
    <<< USR 3 TWN S ct=1205292058,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%
    2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0   
    # 得到登陆代码 ct=...
    利用header发送登陆信息给 https://login.live.com/login2.srf
    Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={userName},pwd={passWord},{ct=}
    Host: login.passport.com获取认证身份信息:
    HTTP/1.1 200 OK \r\n 
    Server: Microsoft-IIS/5.0 \r\n 
    Date: Mon, 22 Dec 2003 21:10:07 GMT \r\n 
    PPServer: H: LAWPPIIS6B061 \r\n 
    Connection: close \r\n Content-Type: text/html \r\n
    Expires: Mon, 22 Dec 2003 21:09:07 GMT \r\n
    Cache-Control: no-cache \r\n 
    cachecontrol: no-store \r\n 
    Pragma: no-cache \r\n 
    P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
    Set-Cookie: ... ... \r\n 
    Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', ru=http://messenger.msn.com \r\n 
    Content-Length: 0 \r\n 
    \r\n捕捉from-PP=’...’的信息发送登陆代码:
    >>> USR {trID} TWN S {loginCode}
    <<< USR {trID} OK |userName| |yourName| 1 0 # 登陆成功,返回信息!
    <<< ....... # 这里会得到个人的信息和在线好友的信息<<< CHL 0 23076971217119032436
    >>> QRY {trID} [email protected] 32 {md5Code}
    Md5Code = CHL得到的代码 + Q1P7W2E4J9R8U3S5 做 md5 运算
    <<< QRY {trID} # 被允许登陆!>>> XFR {trID} SB # 请求DS服务器!
    <<< XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址!>>> 
    无语了,下面没有了,实在是不明白啊……
      

  2.   

    http://ftp2.tw.freebsd.org/pub/FreeBSD/distfiles/1.2__all_plugins.zip addcommentnotify/class/phpmsnclass/  config.php
    msn.class.php
    msnbot.php
    msnbot.sh
    msnsendmsg.php
    sample.php
    test.msn这里有完整的例子.
      

  3.   

    > > >  XFR {trID} SB # 请求DS服务器! 
    < < < XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址! > > >   这里你没输入了?? 连接断了?超时了?
      

  4.   

    这里按协议是
    连接返回的DS服务器,然后发送 USR {new trID} {userName} {yourCode}
    但是发送后应该得到通讯服务器的请求许可,然后再可发送 CAL 的命令请求对话申请~现在就是连接DS服务器成功后,不返回 USR 指令~但有趣的是,用SOCKET打开 DS 服务器,SOCKET连接是成功的,成功后却不接受指令,为什么?!
      

  5.   

    to SysTem128:
    您的例子是 MSNv15 的协议~v15中,很多返回都是XML片段,我不需要那么复杂的,而且最早的时候我也是按v15协议写的,貌似登陆有点困难~而且这个例子太复杂了……对我现在来说,我只需要完成发言就可以了~有办法吗?~
      

  6.   

    <?php $msn = new myMSN("[email protected]", "******");
    //$msn->sendMessage(" ", " "); // MSNv9
    [code=PHP] class myMSN
    {
    private $server = "messenger.hotmail.com";
    private $port = 1863;
    private $nexus = "https://nexus.passport.com/rdr/pprdr.asp";
    private $sshLogin = "login.live.com/login2.srf"; //loginnet.passport.com/login2.srf
    private $getCode = null;
    private $_ip = null;
    private $_port = null; private $connect = null; private $trID = 1;
    private $maxMessage = 4096; private $userName = null;
    private $passWord = null; private $debug = true; function myMSN($userName="", $passWord="")
    {
    if (!empty($userName) && !empty($passWord))
    {
    $this->userName = $userName;
    //$this->passWord = urlencode($passWord);
    $this->passWord = $passWord; $this->startTalk();

    }
    }
    function put($data)
    {
    if ($this->isConnect())
    {
    fputs($this->connect, $data);
    $this->trID++;
    if ($this->debug)
    print("<div style='color:green;font-size:13px;'>&gt;&gt;&gt;{$data}</div>");
    }
    } function get()
    {
    if ($data = @fgets($this->connect, $this->maxMessage))
    {
    if ($this->debug)
    print("<div style='color:red;font-size:13px;'>&lt;&lt;&lt;{$data}</div>"); return $data;
    }
    else
    {
    return false;
    }
    } function isConnect()
    {
    if (!is_null($this->connect) && false !== $this->connect)
    return true;
    else
    return false;
    } function isTalkLink()
    {
    if (!is_null($this->talkLink))
    return true;
    else
    return false;
    } function close()
    {
    @fclose($this->connect);
    } function startTalk()
    {
    if ($this->connect = fsockopen($this->server, $this->port, $errno, $errstr, 5))
    $this->verTalk();
    }
    function verTalk() // MSN 协议协商
    {
    $this->put("VER {$this->trID} MSNP9 CVR0 \r\n");
    $data = $this->get();
    //echo $data;
    if (false !== strripos($data, "VER"))
    $this->envTalk();
    } function envTalk() // 环境协商
    {
    $this->put("CVR {$this->trID} 0x0409 winnt 5.0 i386 MSNMSGR 7.0.0816 MSMSGS {$this->userName} \r\n");
    $data = $this->get();
    //echo $data;
    if (false !== strripos($data, "CVR"))
    $this->reqTalk();
    } function reqTalk() // 请求确认
    {
    $this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
    $data = $this->get(); // XFR 3 NS 207.46.107.41:1863 0 65.54.239.210:1863 XFR 3 NS 207.46.107.25:1863 U D
    //echo $data;
    if (false !== strripos($data, "XFR"))
    {
    list(, , , $serv) = explode(" ", $data); // 分析服务器
    list($ip, $port) = explode(":", $serv); // 分析IP和端口
    $this->_ip = $ip;
    $this->_port = $port;
    $this->reLink($ip, $port);
    }
    else
    {
    //echo $data; // USR 3 TWN S ct=1205292058,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0 
    list(, , , , $this->getCode) = explode(" ", trim($data));
    //echo $data;
    if (empty($this->sshLogin))
    $this->reLoginTalk(); // 重新获取登陆服务器地址
    else
    $this->getLoginCode($this->sshLogin); }
    } function reLink($server, $port) // 重置连接
    {
    $this->connect = null;
    $this->server = $server;
    $this->port = $port; $this->trID = 1; $this->startTalk();
    } function reLoginTalk() // 重新获取服务器地址
    {
    $ch = curl_init($this->nexus); curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $header = curl_exec($ch);
    //print_r($header); curl_close($ch); preg_match ('/DALogin=(.*?),/', $header, $out); // 捕捉服务器登陆匹配
    //print_r($out);
    if (isset($out[1]))
    {
    $this->getLoginCode($out[1]);
    }
    else
    {
    //return false;
    exit("无法捕捉到登陆服务器的URL");
    } } function getLoginCode($slogin) // 获取登陆通行代码
    {
    //echo($this->getCode);
    if (!is_null($this->getCode))
    {
    $ch = curl_init("https://" . $slogin);
    $loginInfo = array(
    "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" . $this->userName . ",pwd=" . $this->passWord . "," . $this->getCode, 
    "Host: login.passport.com"
    ); curl_setopt($ch, CURLOPT_HTTPHEADER, $loginInfo);
    //print_r($loginInfo);
    //$this->getCode = null; curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $header = curl_exec($ch);
    //print_r($header); preg_match ("/from-PP='(.*?)'/", $header, $out);
    //print_r($out); if (isset($out[1]))
    {
    $this->loginAction($out[1]);
    }
    else
    {
    //return false;
    exit("无法捕捉到登陆代码的信息");
    }
    }
    else
    {
    return false;
    }
    } function loginAction($loginCode) // 登陆工作
    {
    $this->put("USR {$this->trID} TWN S {$loginCode} \r\n"); // USR |trID| SSO S |t=code|
    $data = $this->get();
    //print_r($data);
    $this->put("SYN {$this->trID} 0 \r\n");
    $this->put("CHG {$this->trID} NLN \r\n");
    //print_r($this->get());
    while (!feof($this->connect))
    {
    $data = $this->get();
    $code = substr($data, 0, 3);
    switch ($code)
    {
    case "CHL":
    $this->valiServer($data);
    break;
    case "RNG":
    echo "~~~~";
    break;
    default:
    break;
    }
    }
    } function valiServer($data) // 获取服务器验证
    {
    // 分析代码
    $bits = explode (" ", trim($data)); // CHL 0 19329266117064165551
    $value = md5($bits[2] . "Q1P7W2E4J9R8U3S5"); // 不明白 Q1P7W2E4J9R8U3S5 代码
    $this->put("QRY {$this->trID} [email protected] 32\r\n{$value}"); // 客户端回答验证
    $data = $this->get();
    if ("QRY" == substr($data, 0, 3))
    $this->getDS();
    } function getDS() // 请求DS服务器地址
    {
    $this->put("XFR {$this->trID} SB \r\n");
    $data = $this->get();
    // XFR 8 SB 207.46.26.78:1863 CKI 967971302.17249104.195112210
    if ("XFR" == substr($data, 0, 3))
    {
    list(, , , $server, , $code) = explode(" ", $data); // 获取服务器地址和必要代码
    list($ip, $port) = explode(":", $server); // 分离IP和端口
    if (!empty($ip) && !empty($port) && !empty($code))
    {
    $talkMSN = new _myMSN($ip, $port, $this->userName, $code);
    if ($talkMSN->getPassInfo())
    {
    $talkMSN->msnCall("[email protected]");
    }
    }
    else
    {
    exit("对话通讯失败!");
    }
    }
    }
    function analyse($data)
    {
    $theCode = substr($data, 0, 3);
    switch ($theCode)
    {
    case "OUT":
    print("<div>服务器断开!</div>");
    break;
    default:
    break;
    }
    } }
    class _myMSN // 用于直接连接的操作
    { private $connect = null;
    private $trID = 1;
    private $debug = true;
    private $maxMessage = 4096; private $passCall = false; // 允许呼叫?>
    一次过长,分批~不好意思!
      

  7.   

    <?php $msn = new myMSN("[email protected]", "******");
    //$msn->sendMessage(" ", " "); // MSNv9
    [code=PHP] class myMSN
    {
    private $server = "messenger.hotmail.com";
    private $port = 1863;
    private $nexus = "https://nexus.passport.com/rdr/pprdr.asp";
    private $sshLogin = "login.live.com/login2.srf"; //loginnet.passport.com/login2.srf
    private $getCode = null;
    private $_ip = null;
    private $_port = null; private $connect = null; private $trID = 1;
    private $maxMessage = 4096; private $userName = null;
    private $passWord = null; private $debug = true; function myMSN($userName="", $passWord="")
    {
    if (!empty($userName) && !empty($passWord))
    {
    $this->userName = $userName;
    //$this->passWord = urlencode($passWord);
    $this->passWord = $passWord; $this->startTalk();

    }
    }
    function put($data)
    {
    if ($this->isConnect())
    {
    fputs($this->connect, $data);
    $this->trID++;
    if ($this->debug)
    print("<div style='color:green;font-size:13px;'>&gt;&gt;&gt;{$data}</div>");
    }
    } function get()
    {
    if ($data = @fgets($this->connect, $this->maxMessage))
    {
    if ($this->debug)
    print("<div style='color:red;font-size:13px;'>&lt;&lt;&lt;{$data}</div>"); return $data;
    }
    else
    {
    return false;
    }
    } function isConnect()
    {
    if (!is_null($this->connect) && false !== $this->connect)
    return true;
    else
    return false;
    } function isTalkLink()
    {
    if (!is_null($this->talkLink))
    return true;
    else
    return false;
    } function close()
    {
    @fclose($this->connect);
    } function startTalk()
    {
    if ($this->connect = fsockopen($this->server, $this->port, $errno, $errstr, 5))
    $this->verTalk();
    }
    function verTalk() // MSN 协议协商
    {
    $this->put("VER {$this->trID} MSNP9 CVR0 \r\n");
    $data = $this->get();
    //echo $data;
    if (false !== strripos($data, "VER"))
    $this->envTalk();
    } function envTalk() // 环境协商
    {
    $this->put("CVR {$this->trID} 0x0409 winnt 5.0 i386 MSNMSGR 7.0.0816 MSMSGS {$this->userName} \r\n");
    $data = $this->get();
    //echo $data;
    if (false !== strripos($data, "CVR"))
    $this->reqTalk();
    } function reqTalk() // 请求确认
    {
    $this->put("USR {$this->trID} TWN I {$this->userName} \r\n");
    $data = $this->get(); // XFR 3 NS 207.46.107.41:1863 0 65.54.239.210:1863 XFR 3 NS 207.46.107.25:1863 U D
    //echo $data;
    if (false !== strripos($data, "XFR"))
    {
    list(, , , $serv) = explode(" ", $data); // 分析服务器
    list($ip, $port) = explode(":", $serv); // 分析IP和端口
    $this->_ip = $ip;
    $this->_port = $port;
    $this->reLink($ip, $port);
    }
    else
    {
    //echo $data; // USR 3 TWN S ct=1205292058,rver=5.0.3270.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465196398e0 
    list(, , , , $this->getCode) = explode(" ", trim($data));
    //echo $data;
    if (empty($this->sshLogin))
    $this->reLoginTalk(); // 重新获取登陆服务器地址
    else
    $this->getLoginCode($this->sshLogin); }
    } function reLink($server, $port) // 重置连接
    {
    $this->connect = null;
    $this->server = $server;
    $this->port = $port; $this->trID = 1; $this->startTalk();
    } function reLoginTalk() // 重新获取服务器地址
    {
    $ch = curl_init($this->nexus); curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $header = curl_exec($ch);
    //print_r($header); curl_close($ch); preg_match ('/DALogin=(.*?),/', $header, $out); // 捕捉服务器登陆匹配
    //print_r($out);
    if (isset($out[1]))
    {
    $this->getLoginCode($out[1]);
    }
    else
    {
    //return false;
    exit("无法捕捉到登陆服务器的URL");
    } } function getLoginCode($slogin) // 获取登陆通行代码
    {
    //echo($this->getCode);
    if (!is_null($this->getCode))
    {
    $ch = curl_init("https://" . $slogin);
    $loginInfo = array(
    "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" . $this->userName . ",pwd=" . $this->passWord . "," . $this->getCode, 
    "Host: login.passport.com"
    ); curl_setopt($ch, CURLOPT_HTTPHEADER, $loginInfo);
    //print_r($loginInfo);
    //$this->getCode = null; curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $header = curl_exec($ch);
    //print_r($header); preg_match ("/from-PP='(.*?)'/", $header, $out);
    //print_r($out); if (isset($out[1]))
    {
    $this->loginAction($out[1]);
    }
    else
    {
    //return false;
    exit("无法捕捉到登陆代码的信息");
    }
    }
    else
    {
    return false;
    }
    } function loginAction($loginCode) // 登陆工作
    {
    $this->put("USR {$this->trID} TWN S {$loginCode} \r\n"); // USR |trID| SSO S |t=code|
    $data = $this->get();
    //print_r($data);
    $this->put("SYN {$this->trID} 0 \r\n");
    $this->put("CHG {$this->trID} NLN \r\n");
    //print_r($this->get());
    while (!feof($this->connect))
    {
    $data = $this->get();
    $code = substr($data, 0, 3);
    switch ($code)
    {
    case "CHL":
    $this->valiServer($data);
    break;
    case "RNG":
    echo "~~~~";
    break;
    default:
    break;
    }
    }
    } function valiServer($data) // 获取服务器验证
    {
    // 分析代码
    $bits = explode (" ", trim($data)); // CHL 0 19329266117064165551
    $value = md5($bits[2] . "Q1P7W2E4J9R8U3S5"); // 不明白 Q1P7W2E4J9R8U3S5 代码
    $this->put("QRY {$this->trID} [email protected] 32\r\n{$value}"); // 客户端回答验证
    $data = $this->get();
    if ("QRY" == substr($data, 0, 3))
    $this->getDS();
    } function getDS() // 请求DS服务器地址
    {
    $this->put("XFR {$this->trID} SB \r\n");
    $data = $this->get();
    // XFR 8 SB 207.46.26.78:1863 CKI 967971302.17249104.195112210
    if ("XFR" == substr($data, 0, 3))
    {
    list(, , , $server, , $code) = explode(" ", $data); // 获取服务器地址和必要代码
    list($ip, $port) = explode(":", $server); // 分离IP和端口
    if (!empty($ip) && !empty($port) && !empty($code))
    {
    $talkMSN = new _myMSN($ip, $port, $this->userName, $code);
    if ($talkMSN->getPassInfo())
    {
    $talkMSN->msnCall("[email protected]");
    }
    }
    else
    {
    exit("对话通讯失败!");
    }
    }
    }
    function analyse($data)
    {
    $theCode = substr($data, 0, 3);
    switch ($theCode)
    {
    case "OUT":
    print("<div>服务器断开!</div>");
    break;
    default:
    break;
    }
    } }
    ?>
    一次过长,分批~不好意思!
      

  8.   


    class _myMSN // 用于直接连接的操作
    { private $connect = null;
    private $trID = 1;
    private $debug = true;
    private $maxMessage = 4096; private $passCall = false; // 允许呼叫
    function _myMSN($ip, $port, $userName, $clientCode)
    {
    echo("<div style='font-size:13px; color:pink;'>== re Connect {$ip}:{$port}</div>");
    if ($this->connect = fsockopen($ip, $port, $errno, $errmsg, 5))
    {
    $this->put("USR {$this->trID} {$userName} {$clientCode} \r\n");
    $data = $this->get();
    if ("USR" == substr($data, 3, 0))
    {
    $this->passCall = true;
    }
    }
    } function put($data)
    {
    if ($this->isConnect())
    {
    fputs($this->connect, $data);
    $this->trID++;
    if ($this->debug)
    print("<div style='color:blue;font-size:13px;'>---&gt;{$data}</div>");
    }
    } function get()
    {
    if ($data = @fgets($this->connect, $this->maxMessage))
    {
    if ($this->debug)
    print("<div style='color:orange;font-size:13px;'>&lt;---{$data}</div>"); return $data;
    }
    else
    {
    return false;
    }
    } function isConnect()
    {
    if (!is_null($this->connect) && false !== $this->connect)
    return true;
    else
    return false;
    } function getPassInfo() // 判断是请求连接被通过
    {
    if ($this->isConnect() && $this->passCall)
    return true;
    else
    return false;
    }
    function msnCall($mail)
    {
    if ($this->passCall)
    {
    $this->put("CAL {$this->trID} {$mail} /r/n");
    $data = $this->get();
    }
    }
    }
    这里是我不明白的地方,我是按v9协议一步一步发送命令的,也考虑到了服务器返回错误的问题~
    但理论上 新的对话CLASS ,发送 USR 命令后应该返回 USR,但就得不到返回值,为什么呢?
      

  9.   

    9楼 ---------> 提交错了~~但CSDN不提供编辑!请版主帮我DEL掉,谢谢!
      

  10.   

    无论这么运行,在PUT和GET处,自己开启DEBUG显示,都这样的结果>>>XFR 8 SB
    <<<XFR 8 SB 207.46.26.151:1863 CKI 1392191620.1563566.67237163
    ==== re Connect 207.46.26.151:1863
    --->USR 1 [email protected] 1392191620.1563566.67237163 
    我已经获得了DS服务器地址,也连接成功,但是发送信息不返回~我不清楚为什么~令牌代码也获取正确!是不是服务器的关系啊?~我不清楚MSN在中国是不是有服务器,但是我测试的WEB空间在香港!还是在香港我的PASSPORT就被阻止了?不确定啊?~为什么啊?
    救救我……就要完成发送了,只要返回DS服务器的验证,我就能CAL了……
      

  11.   

    http://flumpcakes.co.uk/files/php/msnp.zip 这个是p9的
      

  12.   

    http://flumpcakes.co.uk/files/php/msnp.zip  这个是p9的我参考的就是这个~~太可惜了...这个只能完成回复~但不能实现主动发起!....我世界调用它主动发起的方法,还是得不到DS服务器的返回信息,于是发送了OUT命令~~~真郁闷啊~~~
      

  13.   

    还有人用 MSN 7.0 吗?~不知道V9协议是不是被微软K.O.掉了?~
    为什么登陆都正常,按V15和V9的协议,下一步都应该是DS的用户身份验证,到这一步就不行了....
      

  14.   

        到google code下载php msn class v1.8,里面还有个做daemon的例子,在服务端运行这个daemon,想发MSN时按指定格式到指定目录建个文件,daemon会自动帮你发出去。这样就不用担心网页结束后连接也断开了。不过需要有自己的服务器,虚拟主机上可能做不起来。
        另外我好像只能用MSNP9连接,用更高的登录出错。有成功使用的请介绍一下。http://code.google.com/p/phpmsnclass/downloads/list
      

  15.   

    楼主要做msn 机器人阿?< < < ....... # 这里会得到个人的信息和在线好友的信息 < < < CHL 0 23076971217119032436 
    > > >  QRY {trID} [email protected] 32 {md5Code} 
    Md5Code = CHL得到的代码 + Q1P7W2E4J9R8U3S5 做 md5 运算 
    < < < QRY {trID} # 被允许登陆! > > >  XFR {trID} SB # 请求DS服务器! 
    < < < XFR {trID} SB 65.54.228.30:1863 CKI {yourCode} # 返回服务器地址! > > >   中间是不是服务器有保持连接的命令??你没回
      

  16.   

    3分鐘讓程式透過msn發送訊息,php篇(一) 
    http://rd-program.blogspot.com/2008/11/5msnphp.html
      

  17.   

    那位能把利用header发送登陆信息给 https://login.live.com/login2.srf 
    Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={userName},pwd={passWord},{ct=} 
    Host: login.passport.com 这段代码贴出来(net C#) 的,我做到这里就卡住了,返回空的啊!谢谢了
      

  18.   

    MSN機器人與即時訊息軟體技術交流 
    http://funp.com/people/group/info.php?group_id=1763分鐘學會使用程式發送msn訊息,php篇(一) 
    http://rd-program.blogspot.com/2008/11/5msnphp.html
    3分鐘學會使用程式發送msn訊息,dotNet C#篇(二) 
    http://rd-program.blogspot.com/2008/11/3msn-net-c.html
    3分鐘學會使用程式發送msn訊息, Java篇(三) 
    http://rd-program.blogspot.com/2008/11/3msn-java.html
    3分鐘學會使用程式發送msn訊息, Perl篇(四) 
    http://rd-program.blogspot.com/2008/11/3msn-perl_14.html
    3分鐘學會使用程式發送msn訊息, VB6.0篇(五) 
    http://rd-program.blogspot.com/2008/11/3msn-vb60.html 
    3分鐘學會使用程式發送msn訊息, ASP篇(六) 
    http://rd-program.blogspot.com/2008/11/3msn-asp.html