MSN 通信协议学习笔记

参考资料来自这个网站:http://www.hypothetic.org/docs/msn/index.php

  1. 两种服务器,一种 Notification Server (NS),一种 Switchboard (SB)。默认从 1863 端口建立 TCP 连接。连接总是客户端发起。
  2. 通讯都是文本,服务器和客户端之间互发命令。命令的格式:3 个字母(常规命令)或 3 个数字(错误代码)开头,space,事务 ID(有时没有),space,空格分隔的参数列表,\r\n。看起来文本命令比 QQ 那种二进制通信容易处理多了。
  3. 事务ID 是客户端用来知道服务器是在回复哪条命令,取值范围是UINT32,但 0 有固定的用途。一条命令可能 N 条回复,一般来说客户端发送命令的时候只要依次累加事务 ID 就行了。
  4. 客户不会向服务器发送错误消息,服务器返回的错误消息一定是某条客户命令的回复。
  5. 有一种命令叫做 payload 命令(这个怎么翻译)?它的最后一个参数是一个 content-length,处理完这条命令(including trailing newline)之后,还要再读指定字节数的数据(no trailing newline),然后再处理下一条命令。
  6. 服务器会主动向客户端发送一种消息,就是同步消息。它不是对客户命令的回复,因此有些同步消息没有事务 ID,另外的同步消息的事务 ID 为 0。
  7. 服务器回复命令不一定按什么顺序,所以要使用事务 ID 来跟踪回复。当然如果你的客户端 NB 到不用事务 ID 也能跟踪的话……

Messages

由MSG 命令及其 payload 组成。来自服务器的 messages 格式为:

MSG <发送者帐号> <发送者显示名称> <payload 长度>

然后是 payload,它包括 MIME Header 和 body 两部分。Header 区分大小写,严格由 \r\n 分隔,必须包括 Content-Type 和 MIME-Version 两个值;body 就是消息正文了,也由 \r\n 分行但是 \n 不是必须的。

发送 messages 更复杂,一会再说。

Names

用户名(Account Name)可以是最长 129 个字节的合法 Email 地址,只有登陆的时候才需要提供你自己的用户名,其他时候都是要处理别人的用户名。

显示名称(Display Name)理论上最长 387 字节,但是官方客户端只支持 129 字节;一般显示名称都是放在命令的参数里面的,所以要先 URL-Encode 再发送。用 REA 命令修改自己的显示名称。

昵称(Nickname)跟显示名称差不多,这个是自己给好友起的名字,只显示在自己的联系人列表里面。

登陆过程

  1. 连接到 messenger.hotmail.com:1863 或者本地知道的服务器地址
  2. 报告自己支持的通信协议版本(必须有 CVR0)
    >>> VER 0 MSNP8 CVR0\r\n
  3. 服务器返回它支持的通信协议版本,你应该使用它返回的第一个协议版本(CVR0 不算)
    <<< VER 0 MSNP8 CVR0\r\n
  4. 报告自己的客户端名称、版本、运行平台、用户名等信息
    >>> CVR 2 0×0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS [email protected]\r\n
  5. 服务器返回最低版本要求和推荐下载链接
    <<< CVR 2 6.0.0602 6.0.0602 1.0.0000 http://download.microsoft.com/download/8/a/4/8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXE http://messenger.msn.com\r\n
  6. 初始登陆命令
    >>> USR3 TWN I [email protected]\r\n
  7. 有的服务器会给你丢到另一台服务器去,这种情况下应该回到第1步,在给你的服务器上再做一遍登陆过程:
    <<< XFR3 NS 207.46.106.145:1863 0 207.46.104.20:1863\r\n
    而有的服务器则会接受登陆请求:
    <<< USR 3 TWN S <a_very_long_string>
  8. 那个 a_very_long_string 是给你的登陆令牌,你应该拿着这个令牌去 MS Passport 登陆。GET 一下 https://nexus.passport.com/rdr/pprdr.asp,它会返回一堆 Passport 服务器,然后你再向其中的一个服务器建立 https 连接,然后发送登陆请求。如果成功,它会返回给你一个许可证。
  9. 拿着这个许可证回到 NS,再发送一次 USR 命令:
    >>> USR 4 TWN S <login_ticket>
  10. 一切顺利的话,服务器接受你的登陆请求:
    <<< USR 4 OK [email protected] example%20display%20name 1 0\r\n
  11. 然后你就可以去抓联系人列表,设置初始状态,聊天……

邀请别人建立会话的过程:

  1. 在 NS 上请求 SB 服务器地址:
    >>> XFR 9 SB\r\n
  2. 如果你在线的话,NS 会丢给你一个 SB 服务器地址:
    <<< XFR 9 SB 207.46.108.46:1863 CKI 189597.1056411784.29994\r\n
  3. 最后一个参数是登陆令牌。连接指定服务器,用这个令牌登陆:
    >>> USR 7 [email protected] 189597.1056411784.29994\r\n
  4. 一切顺利的话,服务器返回登陆成功:
    <<< USR 7 OK [email protected] Alice\r\n
  5. 邀请其他人加入会话:
    >>> CAL 8 [email protected]\r\n
  6. 服务器会立即告诉你正在邀请 bob 的 session id:
    <<< CAL 8 RINGING 189597\r\n
    然后当 bob 接受邀请的时候,通知你(注意没有事务 ID,说明这条命令不是对上面 CALL 的回复):
    <<< JOI [email protected] Bob\r\n
  7. 然后就可以发送各种消息了。

被别人邀请建立会话的过程:

  1. NS 服务器ring 你,告诉你 SB 服务器的地址、登陆令牌、被谁邀请、会话 ID 等一切你需要的信息。
    <<< RNG 17342299 207.46.108.78:1863 CKI 1056411141.26158 [email protected] Bob\r\n
  2. 连接指定的SB 服务器,用给你的令牌登陆:
    >>> ANS 1 [email protected] 1056411141.26158 17342299\r\n
    注意这里是 ANS,而不是前边的 USR。
  3. 一切顺利的话,SB 服务器会告诉你当前会话中都有谁。
    <<< IRO 1 1 2 [email protected] Bob\r\n
    <<< IRO 1 2 2 [email protected] Carol\r\n
    <<< ANS 1 OK\r\n
  4. 然后就可以发送各种消息了。

关于“正在输入消息”的提示:

这个是 MSN 比较有特色的一个功能。MSN 的官方客户端是这么搞的:

  • 如果你在输入消息,那么它会每 5 秒钟向 SB 服务器通知一下你在输入消息。
    >>> MSG 4 U 91\r\n
    MIME-Version: 1.0\r\n
    Content-Type: text/x-msmsgscontrol\r\n
    TypingUser: [email protected]\r\n
  • 当官方客户端收到了一个 TypingUser 信息的时候,它会提示你那个用户正在输入;然后你接收到他的一条即时消息之后,或者 10s 之内没有再收到他的 TypingUser 消息的话,那么就把这条提示去掉。
    <<< MSG [email protected] Bob 89\r\n
    MIME-Version: 1.0\r\n
    Content-Type: text/x-msmsgscontrol\r\n
    TypingUser: [email protected]\r\n
    \r\n
    \r\n
  • 注意上面 [email protected] 出现了两次,但是只有在参数里面那个是有效的,后面那个最好忽略之;虽然官方客户端不是这么干的……

你可能感兴趣的:(PHP,qq,Microsoft,asp)