本 科 生 毕 业 论 文(设 计)
中文题目: MSN 机器人程序的设计与实现
外文题目: The Design and Implementation of MSN Robot Program
摘 要
随着网络的兴起,越来越多的人依赖网络,因此聊天机器人应运而生。聊天
机器人是以联系人的形式出现的,只要你添加相关机器人的账号,就可以像与真
人聊天一样与机器人聊天,并可查询地图、股票、天气预报、电视节目等信息。
目前,知名的聊天机器人有:一枝独秀的 MSN 机器人小 i、专业的 MSN 股票机
器人牛牛,国内则如腾讯的 QQ 机器人小 Q,但在功能上和 MSN 的系列机器人
相比有一定差距。
本文详细分析了 MSN 的通信协议与工作流程,并根据分析 MSN 登录、消
息发送与接收流程,设计和实现了简单的 MSN 客户端程序。该客户端允许在一
台电脑上同时登录多个 MSN 账号,并能与多个 MSN 用户进行聊天。同时,本
文还充分研究了聊天机器人的工作原理,并设计和实现了 MSN 聊天机器人系统。
关键字:聊天机器人;MSN;聊天软件
Abstract
With the rise of networks, more and more people rely on the network, so the
chat robot appeared. Chat robot based on the form of friends, if you have added the
robot’s account, you can chat with the robot just like a real person, and can also query
maps, stocks, weather, television programs and other information.
This document fully studies the MSN Messenger protocol, and uses its landing
principles and message send principles to design and achieve a MSN client. The client
can login a number of account at the same time in one computer, and start chatting
with different friend. At the same time, this document also fully studied the operation
principle of the chat robot, and design and achieves the MSN chat robot system based
on the MSN client.
Keywords: Chat Robot; MSN; Chat Software
目 录
第一章 绪论 ..............................................................................................1
研究背景 .....................................................................................................1
MSN 机器人的发展现状 .............................................................1
本文工作 ......................................................................................2
第二章 MSN 协议分析 ............................................................................3
MSN 登录过程 ..........................................................................3
即时消息发送接收过程 ..........................................................11
MSN 连接保持方法 ...............................................................15
第三章 MSN 机器人系统设计 ..............................................................17
系统结构 ....................................................................................17
系统方案选取 ............................................................................18
系统难点及相应解决方案 ........................................................18
软件结构 ....................................................................................18
第四章 MSN 机器人系统实现 ..............................................................21
系统实现部分 ............................................................................21
系统测试 ....................................................................................26
第五章 总结与展望 ................................................................................29
全文总结 ....................................................................................29
工作展望 ....................................................................................29
参考文献 ..................................................................................................30
致 谢 ......................................................................................................31
第一章 绪论
研究背景
自从上世纪中叶第一台计算机诞生以来,计算机越来越走进人们的生活当中,
特别是随着计算机网络的发展,把全世界的人们紧密的联系在一起,大大的扩展
了计算机的功能,人们越来越离不开计算机了。如今,作为网络应用之一的聊天
工具,越来越受到人们的欢迎和重视。现在已有的聊天软件不胜枚举,流行的主
要有 MSN Messenger、QQ 等。
MSN Messenger 来自于软件巨头微软,其实力当然不容小觑。目前最新版本
为 MSN9,能够实现文本、手写、语音、视频等多种沟通方式,可以预见在不久
的将来,聊天软件将成为人们通过因特网相互联系和娱乐的主要平台。
由于 MSN Messenger 协议是公开的,因此第三方软件开发者能通过协议写
出自己的程序与网络交互,于是 MSN 机器人应运而生。MSN 机器人是以 MSN
联系人的形式出现的,只要你添加相关机器人的 MSN 帐号,就可以像与真人聊
天一样与机器人聊天,并可查询地图、股票、天气预报、电视节目等信息。
MSN 机器人的发展现状
MSN 机器人是一项能够带给用户良好信息体验的技术产品――基于人工智
能技术的开发、研究和应用,为成千上万用户提供新颖实用的网络服务。MSN
机器人技术日渐成熟,其中著名的如赢思软件公司开发的小 I 机器人。
2004 年赢思先后在全球知名的即时通讯(IM)平台 MSN、“腾讯 QQ”及
Yahoo Messenger 上推出了小 I 智能机器人;小 I 以其强大的聊天功能和各类资
讯信息的提供一时间成为各大 IM 平台的新宠,用户量突破 800 万,在人工智能
机器人及信息服务领域获得了前所未有的突破。
2006 年 2 月,凭借在机器人领域多年的积累以及强大的技术实力,赢思软
件成为微软全球战略合作伙伴及微软官方机器人平台,携手微软打造最强大的机
javascript:void(0);
器人应用平台。目前公司已推出小 I 聊天、MSN 群、小 I 地图、小 I 天气、小 I
收视指南、小 I 问答等多项应用,提供了多种个性化功能和服务,性能稳定,应
用广泛。
本文工作
本文将重点分析 MSN Messenger 协议里的登陆过程和消息发送部分,并用
其设计并制作一款 MSN 客户端,然后在此基础上完成对 MSN 机器人系统的设
计和实现,以达到研究聊天机器人运作原理的目的。具体的章节安排如下:
第一章 研究背景及当前技术的发展状况
第二章 MSN 协议分析
第三章 MSN 机器人系统设计
第四章 MSN 机器人系统实现
第五章 总结与展望
第二章 MSN 协议分析
MSN 登录过程
1.TCP连接到()上的1863端口,发送如
下指令:
服务器返回:
VER命令是用来和服务器协商MSN客户端所使用的版本信息,其中1代表
TrID是命令序号,后面是所支持协议的版本,必须以CVR0结尾。
2.客户端发送CVR命令到服务器声明客户端环境:
CVR 命令有一个TrID和另外8个参数。第一个参数是客户端语言的Local
ID,简体中文为0x0804,美国英语为0x0409,台湾为0x0404,日本为0x0411,韩
国为0x0412;第二个参数为操作系统类型,winnt代表NT系列,Win代表win9x系
列;第三个参数为操作系统版本号,表示Windows 2000, 表示Windows
XP,表示Windows 98;第四个参数为计算机体系结构,i386 表示Intel 386以
上机型;第五个参数为客户端名称,MSNMSGR表示MSN Messenger客户端;第
六个参数表示客户端版本号,当前为;第七个参数必须为MSMSGS;第
八个参数为登录名(邮件地址)。
服务器返回:
VER 1 MSNP9 MSNP8 CVR0\r\n
VER 1 MSNP9 MSNP8 CVR0\r\n
CVR 2 0x0804 winnt i386 MSNMSGR MSMSGS yxu68@\r\n
CVR 2
服务器也返回CVR但是它只有6个参数。第一个参数为TrID;第二个参数为
推荐您使用的客户端版本号,如果为,表示您的客户端信息不可识别;
第三个参数和第二个参数相同;第四个参数表示前一版本的版本号;第五个参数
为下载推荐版本的URL地址;第六个参数为获取推荐客户端信息的URL地址。
3.客户端发送 USR 命令说明身份:
USR 命令有 4 个参数,第一个参数为 TrID;第二个参数为身份验证的系统
代号,以前可以使用 MD5,现在必须使用 TWN;第三个参数必须是字母 I,表
示身份验证开始;第四个参数是要登录服务器的帐号名称。
服务器返回 XFR 命令:
XFR 命令有 5 个参数,第一个参数为 TrID;第二个参数为 NS 表示转移到
一个 notification 服务器;第三个参数为 notification 服务器的 IP 地址和端口(以
冒号间隔,一般是 1863 但不绝对);第四个参数在 MSNP2 以后都必须是 0;第
五个参数为当前连接的服务器 IP 和端口。
4. 关闭连接,客户端终止到
的连接。
说明:MSNP8 MSNP9 中不再使用 MD5 的作身份验证的方式,MD5 的方式
只在 MSNP7 及前面的版本中实现,MSNP8、MSN9 需要以新的方式执行也就是
使用 USR 3 TWN I yxu68@\r\n 命令。
5 . 客 户 端 连 接 到 上 面 给 定 的 notification 服 务 器 指 定 端 口
(:1863),首先按照上面的发送一些命令如下:
客户端发送:
服务器返回:
USR 3 TWN I yxu68@\r\n
XFR 3 NS :1863 0 :1863\r\n
VER 4 MSNP9 MSNP8 CVR0\r\n
VER 4 MSNP9 MSNP8 CVR0\r\n
客户端发送:
服务器返回:
客户端发送:
在此服务器不回复 XFR 命令,而是回复 USR 命令。
回应的 usr 命令前两个参数个发送的 usr 命令相同,第三个参数使用字母 S
代替 I 表示后面开始身份验证过程,其中 ct tpf 是变化的,其他不变。
6.使用 SSL 协议连接到 或其它服务器的 443 端口。登录
名 后 缀 为 @ 、 @ 、 @ 的 客 户 端 使 用
:443 ; 登 录 名 后 缀 为 @ 的 使 用
:443;其他使用 :443。建议使用如下方法
确定身份验证服务器:
SSL 连接到 443 端口,发送如下命令:
服务器将回应如下:
CVR 5 0x0804 winnt i386 MSNMSGR MSMSGS yxu68@\r\n
CVR 5
USR 6 TWN I yxu68@\r\n
USR 6 TWN S
lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=106540
0856,kpp=1,kv=5,ver=,tpf=15920bfbfabbe0badb47790dc51a54fa\r\n
GET /rdr/ HTTP/\r\n
\r\n
mailto:%E5%90%8D%E5%90%8E%E7%BC%80%E4%B8%BA@
获取回应中的 PassportURLs 字段中 DALogin 部分(斜体部分),即可得到身
份验证地址,注意该连接实际上需要在前面加上 https://,表示要使用 HTTP SSL
协议获取相关信息。 是需要连接的服务器,用 SSL 连接到该服
务器 443 端口,即可进行下面的操作。
HTTP/ 200 OK\r\n
Server: Microsoft-IIS/\r\n
Date: Sun, 27 Sep 2003 11:57:47 GMT\r\n
Connection: close\r\n
PassportURLs:DARealm=,DALogin=
Privacy=
nfigVersion=11\r\n
Content-Length: 0\r\n
Content-Type: text/html\r\n
Cache-control: private\r\n
\r\n
7.在 SSL 连接中发送如下 HTTP 请求:
Authorization 后面跟内容中的“sign-in=”后面为登录的登录名称,“pwd=”后面
为登录名对应的密码,其后内容(斜体部分)为前面服务器返回的 usr 命令后面
部分内容。
如果成功服务器将返回如下信息:
其中最重要的是 Authentication-Info 字段返回的值,取得“from-pp=”后面单
引号中的部分内容(上面斜体下划线部分)。
如果失败服务器返回如下信息(如果失败需要连接其他服务器尝试):
GET / HTTP/\r\n
Authorization:
OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=yxu68@
,pwd=******,lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%
2Emsn%2Ecom,ct=1065400856,kpp=1,kv=5,ver=,tpf=15920bfbfabbe0badb477
90dc51a54fa\r\n
User-Agent: MSMSGS\r\n
Host: \r\n
Connection: Keep-Alive\r\n
Cache-Control: no-cache\r\n
HTTP/ 200 OK\r\n
Server: Microsoft-IIS/\r\n
…..
Authentication-Info:-status=success,tname=MSPAuth,tname=MSPProf,tna
me=MSPSec,from-PP='t=…',ru=\r\n
Content-Length: 0\r\n
\r\n
\r\n
同时服务器有可能将客户端重定向到其他地方,这是将返回如下信息:
HTTP/ 401 Unauthorized\r\n
Server: Microsoft-IIS/\r\n
Date: Sun, 27 Sep 2003 11:58:15 GMT\r\n
PPServer: H: LAWPPIIS6B077\r\n
Connection: close\r\n
Content-Type: text/html\r\n
Expires: Mon, 20 Oct 2003 07:57:14 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
PassportConfig: ConfigVersion=11\r\n
WWW-Authenticate:
-status=failed,srealm=,ts=-3,prompt,cburl=
password%20correctly.%20If%20you%20haven%E2%80%99t%20registered%20with%2
%20Passport%2C%20click%20the%20Get%20a%%20Passport%20link.\r\
n
Content-Length: 390\r\n
\r\n
其中 就是重定向的 URL,这
时 需 要 按 照 这 一 步 开 始 的 方 式 访 问 新 的 服 务 器 , 用
替代 。
8.关闭 SSL 连接,回到 notification 服务器连接上,向服务器再次发送 usr
命令:
命令含义和前面一样,注意的是第三个参数为 S,第四个参数就是上面 SSL
连接中获取的 Authentication-Info 字段中 from-pp 部分。
HTTP/ 302 Found\r\n
Server: Microsoft-IIS/\r\n
Date: Sun, 27 Sep 2003 11:58:32 GMT\r\n
PPServer: H: LAWPPLOG5C006\r\n
Connection: close\r\n
Content-Type: text/html\r\n
Expires: Sun, 27 Sep 2003 11:57:32 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
Authentication-Info: da-status=redir\r\n
Location:
\r\n
USR 7 TWN
St=5OyHvVtsqDmntb4B4z*UOKIkjWzyERUzYHRnO7bmd*!4LS4w!JLRB95Jjopamqb
Rz1APVAq*hqeYScQIt*Se2lyA$$&p=5ArrhL7LNEzouoqpC9kIoeqvBm4wzKnISD3Qz
ZOxOIcz6iJ5w33IQJZ3tQjq9*4z*l6MQ6y6xYtth7QdEQb*Z1kRHUH6Pm6sJsUXfbfNbr
hdu5oOJzdIjNXGVSC5FfheoGrHtrxMp1ZgMgeDcLY0yx6iYoO!0EfXlpQ24avzKIQDA
7ME7pLMFTKtVp5NJHdBI75Szr3P4d37Y$
如果密码正确 notification 服务器将返回 usr 命令,ok 作为第二个参数。
其中第三个参数是用户登录名;第四个参数是用户的昵称(UTF-8 值);第
五个代表身份验证是否通过,1 表示 true;第六个如果是 MSNP7 以上为 0,其他
为 1。其他将返回一些错误。
9.同步本地联系人列表
客户端向服务器发送本地保存的联系人列表版本号:
第二个参数就是当前的联系人列表的版本号,0 表示本地没有任何联系人的
信息。
服务器回应客户端服务器上联系人列表的版本号:
第二个参数是服务器上当前联系人列表的版本号,如果客户端的版本号和服
务器上的版本号相同,则没有后面的两个参数;第三个参数为期望的 LST 命令
个数;第四个参数为期望的 LSG 命令个数。
10.取得在线人员名单,发送上线通知。
客户端向服务器发送如下命令取得在线人员名单:
CHG 命令第二个参数为 NLN 时是取得在线人员名单,并通知他们客户上线
了;第三个参数为一个数值串,目前不明白其作用,但是版本不同,其值不同。
简 体 中 文 MSN Messager + Win2000 下 是 268435492 , 英 文 版 是
268435508,繁体中文 268435500。用途更改用户在线状态,具体请参考更改用
户状态。
以上完成所有登录过程。
USR 7 OK yxu68@ \302\240\345\276\220\346\263\263 1 0\r\n
SYN 8 0\r\n
SYN 8 1056 68 5\r\n
CHG 9 NLN 268435492 \r\n
即时消息发送接收过程
1. 客 户 端 分 别 完 成 登 录 过 程 以 后 , 由 会 话 发 起 方 ( 本 例 中 为
yxu68@)向其 Notification 服务器发送 XFR 命令:
XFR 作用是向 Notification 服务器获取 Switchboard 服务器 IP 地址和端口号。
第一个参数是 TrID,第二个参数是 Switchboard 的缩写 SB。注意和登录过程中
的 XFR 命令中的区别,登录过程是 NS,代表是 Notification 服务器。
Notification 服务器()回复 XFR 命令如下:
服务器回复的 XFR 命令第一个参数是 TrID;第二个参数是 SB;第三个参
数是 Switchboard 服务器的 IP 地址和端口号(用冒号间隔),一般端口号都是
1863,但是不绝对;第四个参数是认证的方式,目前使用 CKI;第五个参数客户
端将要发送的 Switchboard 服务器的认证字符串,需要保留。如果没有初始化客
户端的状态或者状态为 HDN,这个服务器将不返回 XFR 命令,而是返回 913 错
误 913 12\r\n。
2.客户端保持到 Notification 服务器的连接,同时连接到上面提供的
Switchboard 服务器()指定端口上,发送如下命令:
USR 命令第一个参数是 TrID,注意这里的 TrID 是 Switchboard 服务器上重
新设置的一个 TrID,又是从 1 开始,小于 4294967295 (2^32 - 1)的整数,故而这
里需要在添加一个计数器,同时即时再次连接其他的 Switchboard 服务器,这个
计数器也需要保持(不从 1 开始计数,接着上次开始计数);第二个参数是客户
端的登录用户名;第三个参数是上面 Notification 服务器服务器返回 XFR 命令中
的认证字符串。
Switchboard 服务器()返回如下命令:
XFR 12 SB\r\n
XFR 12 SB :1863 CKI \r\n
USR 1 yxu68@ \r\n
该 USR 命令最后一个参数是客户端的昵称。
3.客户端向 Switchboard 服务器()发送如下命令:
CAL 命令第一个参数为 Switchboard 服务器上的 TrID;第二个参数为客户
端(yxu68@)想交流的联系人对象的登录名称。
被邀请的联系人(taogx@)的 Notification 服务器()
向 taogx@ 发出如下命令:
RNG 命令第一个参数是本次会话的 SessionID,需要保存后面的命令将多次
用到该参数;第二个命令是本次会话的 Switchboard 服务器 IP 地址和端口;第
三个参数是身份验证类型,目前为 CKI;第四个参数是身份验证的认证字符串;
第五个是参数是对话发起者的登录名称;第六个参数是对话发起者的昵称。
客户端 taogx@ 连接 Switchboard 服务器()发送 ANS
命令:
ANS 命令第一个参数是客户端 taogx@ 的 Switchboard 服务器 TrID;
第二个参数是客户端登录名称;第三个参数是上面 RNG 命令给出的身份认证字
符串;第四个参数是会话 SessionID。
Switchboard 服务器()向客户端 taogx@ 返回如下命
令:
IRO 命令第一个参数为 TrID 和 ANS 命令第一个参数一样;第二个参数和第
三个参数分别为本次会话中去掉自身以外的联系人序号和联系人总数。
Switchboard 服务器()向客户端 yxu68@ 返回如下
USR 1 OK yxu68@ \302\240\345\276\220\346\263\263\r\n
CAL 2 taogx@\r\n
RNG 17334300 :1863 CKI yxu68@
\302\240\345\276\220\346\263\263\r\n
ANS 1 taogx@ 17334300\r\n
IRO 1 1 1 yxu68@ \302\240\345\276\220\346\263\263\r\n
mailto:yxu68@
命令:
4.消息的发送和接收
客户端 yxu68@ 向 Switchboard 服务器()发送
MSG 命令发送消息:
MSG 命令第一个参数是 TrID(SB 服务器的);第二个参数是指示 MSG 命
令的类型,发送消息时,该参数将置为 N;第三个参数为消息的大小,这个值从
跟在其后的\r\n 后面开始计算,这个\r\n 后面都为消息内容。
Switchboard 服务器()向客户端 taogx@ 发送 MSG 命
令通知该客户端有人发送消息给该客户端:
该 MSG 命令第一个参数是发送消息的联系人登录名称,第二个参数是该联
系人的昵称,第三个参数值后面的消息长度。后面的消息内容和结构和发送方发
送的内容一样。
5.退出会话
任何一方向 Switchboard 服务器()发出 OUT 指令,即可退出
会话:
JOI taogx@ dd\r\n
MSG 7 N 165\r\n
MIME-Version: \r\n
Content-Type: text/plain; charset=UTF-8\r\n
X-MMS-IM-Format: FN=%E5%AE%8B%E4%BD%93; EF=; CO=0; CS=86; PF=0\r\n
\r\n
MSG yxu68@ \302\240\345\276\220\346\263\263 165\r\n
MIME-Version: \r\n
Content-Type: text/plain; charset=UTF-8\r\n
X-MMS-IM-Format:FN=%E5%AE%8B%E4%BD%93; EF=; CO=0; CS=86; PF=0\r\n
\r\n
这时 Switchboard 服务器()会向其他客户端发送 BYE 指令:
BYE 命令只有一个参数,就是退出会话的联系人登录名。
只 有 当 会 话 中 的 联 系 人 都 向 Switchboard 服 务 器 发 送 OUT 指 令 ,
Switchboard 服务器才会终止会话。
6.用户正在输入消息。
任何一方向 Switchboard 服务器()发出 MSG 指令:
这 时 Switchboard 服 务 器 ( ) 会 向 其 他 客 户 端
(yxu68@)发送 MSG 指令:
OUT\r\n
BYE taogx@\r\n
MSG 30 U 86\r\n
MIME-Version: \r\n
Content-Type: text/x-msmsgscontrol\r\n
TypingUser: taogx@\r\n
\r\n
\r\n
MSG taogx@ dd 86\r\n
MIME-Version: \r\n
Content-Type: text/x-msmsgscontrol\r\n
TypingUser: taogx@\r\n
\r\n
\r\n
MSN 连接保持方法
1. 客户端 ping Notification 服务器的方式
客户端发送指令 PNG 给 Notification 服务器:
Notification 服务器回应客户端 QNG 命令:
2. Notification 服务器 ping 客户端的方式
Notification 服务器也会向客户端发送 CHL 指令查看客户端是否断线,同时
验证客户端是否被服务器正确识别。通常称之为 challenges,CHL 指令可以在状
态初始化以后(CHG 命令完成以后)直到会话结束任何时候由 Notification 服务
器发出,不必要周期性回复该命令,但是收到服务器该命令后务必在最短时间内
回复,而且必须回复每一个 CHL 命令,如果服务器器在它规定的时间内没有收
到回复,它将关闭会话。
CHL 指令有两个参数,第一个参数一定是 0,第二个参数是 20 位的数字串,
不可预料,也不可解释的数字串,但是客户端应该保存它,在回复这个命令中要
用到这个数字串。
客户端回复 QRY 指令,说明客户端一切正常。
QRY 指令第一个参数是 TrID,第二个参数是本次回复中使用的 challenges
字符串,第三个参数是后面的回复的有效长度,目前一定是 32,因为后面的回
复是一个经过 md5 算法处理 hash 串。第三个参数后面紧跟着回车换行(0x0D
0xOA),回车换行后面紧跟着一个 32 位的字符串,即 md5 值,其计算方法是:
取得服务器 CHL 命令中的 20 位数值串(10050206314474112402),将 QRY 命
令 中 的 challenges 字 符 串 附 加 在 其 后 构 成 一 个 字 符 串
PNG\r\n
QNG 40\r\n
CHL 0 10050206314474112402\r\n
QRY 1049 PROD0061VRRZH@4F 32\r\n78db65629780912ce9c11c0b1c343b3b
(10050206314474112402PROD0061VRRZH@4F),计算其 MD5 值得到一个 32
位字符串(78db65629780912ce9c11c0b1c343b3b)。当前使用的 challenges 字符串
有 PROD0061VRRZH@4F 、 JXQ6J@TUOGYV@N0M , 一 般 使 用
PROD0061VRRZH@4F。一般为了防止部分数据包丢失,该回复命令将间隔 1
秒发送两次。服务将回应该命令成功:
这样完成服务器和客户端的连接。
QRY 1049\r\n
第三章 MSN 机器人系统设计
系统结构
系统主要由客户端系统和自动问答系统两部分组成。
客户端系统由登陆界面、主 MSN 界面和私聊界面组成。图 给出了客户
端的系统结构。系统启动后,由登陆界面开始输入用户名和密码,然后进入到
主 MSN 界面,主 MSN 界面负责整个程序的运行状态,在这个界面上可以通过
打开私聊界面来与多个人聊天。私聊界面界面管理着机器人与用户的对话。
图 客户端系统结构
自动问答系统由关键字分析及提取、数据库操作和数据库三大部分组成,其
中关键字分析及提取为系统的核心。图 给出了自动问答部分的系统结构。关
键字分析及提取部分负责提取出输入语句包含的关键字,数据库操作部分利用此
关键字在数据库里查找相应回答,并随机选取一条返回。
图 自动问答系统结构
登陆界面
主MSN界面
私聊界面 私聊界面私聊界面
数据库
数据库操作
输入的语句
关键字分析及提取
输出的语句
系统方案选取
本系统采用 MFC 的强大功能支持,是一个基于对话框的 Windows32 应用程
序,使用的编程环境是微软公司的 Microsoft Visual Studio 。网络部分采用
CAsyncSocket 编写。
CAsyncSocket 类在很低的级别上封装了 Windows Sockets API ,该类适合
那些对网络通信细节很了解,但希望利用回调的便利通知网络事件的程序员使用。
利用 CAsyncSocket 编制网络程序不但比较灵活而且能够避免直接调用 Windows
Sockets API 函数的繁琐工作。
系统难点及相应解决方案
1. 由于客户端系统涉及网络,因此单纯的程序结构不能满足。于是本系统
采用消息机制驱动。当底层 socket 收到数据时,会发送消息通知上层处理,然后
再将上层传入的数据发送出去。
2. 由于网络的不稳定,因此数据包在传送中的常常会丢失或延时太长,造
成了 MSN 登陆的中断。于是客户端系统设置了时钟回调函数 OnTimer(UINT
nIDEvent),当发现登陆过程出现中断时,会重启登陆过程,直到登陆成功为止。
3. MSN Messenger 协议内容繁多且更新很快,因此在程序设计上必须能方
便的进行扩展。于是客户端系统采用 Engine 函数来处理所有收到的数据并根据
协议内容控制程序的运行。
4. 由于存在多人同时与机器人对话的情况,因此必须有多个对话实例存在,
而多个实例的管理是个难题。于是本系统使用了容器类 vector 来管理。
5. 由于 MSN Messenger 协议里即时消息发送存在两种方式,即主叫与被叫,
因此必须对两种方式都要考虑到。于是聊天部分采用了两套 Engine 函数。
软件结构
CZxDlg 为程序入口点,由它生成 CMSN,再由 CMSN 产生 CMSNChat。
图 给出了系统的软件结构。
图 软件结构
1. CZxDlg
概述:程序入口点,也是登陆界面。
功能:获得用户输入的用户名密码,并以此初始化 CMSN,并启动 CMSN
界面。
2. CMSN
概述:主 MSN 界面,系统的核心部分。
功能:由输入的用户名密码完成整个登陆过程,当用户点击某个好友时,生
成 CMSNChat 界面负责与其的聊天过程。
内部结构:图 给出了 CMSN 的内部结构。
图 CMSN 内部结构
结构概述:CMSNSocket 为 CAsyncSocket 的派生类,负责接收和发送数据;
当接到数据时,会发送消息通知上层 OnReceive 函数,然后将得到的数据交由
Engine 函数处理。Engine 函数通过 Send 调用 CMSNSocket 发送数据。每次发送
CZxDlg
CMSN
CMSNChat CMSNChatCMSNChat
Engine
WriteStatus
CMSNSocket
OnReceive Send
和接收数据时都会通过 WriteStatus 函数输出状态信息。
3. CMSNChat
概述:聊天界面,可以多个并存。
功能:由输入的用户名密码完成整个登陆过程,当用户点击某个好友时,生
成 CMSNChat 界面负责与其的聊天过程。
内部结构:图 给出了 CMSNChat 的内部结构。
图 CMSNChat 内部结构
结构概述:结构上与 CMSN 类似,只是拥有两个独立的 socket 和 Engine,
因此不再赘述。
EngineSend
WriteStatus
CMSNSocket
OnReceive SendSend
EngineRec
WriteStatusSendRec
CMSNSocket
第四章 MSN 机器人系统实现
系统实现部分
CZxDlg 类
概述:登陆界面。
核心代码分析:
1. OnOK()
当用户点击登陆按钮时,会执行消息响应函数 OnOK()。图 给出了 OnOK
的流程图。
图 OnOK 流程图
CMyListCtr 类
取得用户名m_user和密码m_pwd
m_user和m_pwd
是否为空
是
否 返回
隐藏登陆框
新建一个CMSN对象msn
将m_user和m_pwd赋值给msn
启动msn
退出程序
概述:重载 CListCtr 类,用于显示颜色。
核心代码分析:
1. OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
在重载的 OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)函数里,
添加了着色代码,这个函数在每次 list 控件重画时都会被调用。图 给出了
OnCustomDraw 的流程图。
图 OnCustomDraw 流程图
CMSNSocket 类
概述:重载 CAsyncSocket 类,用于网络的发送与接收。
核心代码分析:
1. OnConnect(int nErrorCode)
在 socket 请 求 与 服 务 器 建 立 连 接 后 , 如 果 成 功 系 统 将 通 过 事 件
FD_CONNECT 调用虚函数 OnConnect。我们可以通过重载 OnConnect 对已经完
成的建连请求进行处理。图 给出了 OnConnect 的流程图。
取得当前正在重画的行
的第一列的字符串
含有sendtitle字符串
否
是 画红色
含有rectitle字符串 是 画绿色
否
画蓝色
图 OnConnect 流程图
2. OnReceive(int nErrorCode)
当 socket 接受到数据后,系统将触发 FD_READ 事件并调用 OnReceive 虚函
数,我们可以通过 Receive 成员函数从 socket 接收缓冲区读取数据。Socket 接受
的数据将一直保存在缓冲区中,直到调用 Receive 成员函数将其读走。图 给
出了 OnReceive 的流程图。
图 OnReceive 流程图
向父窗口发送自定义消息WM_CONNECTOK
,通知连接以建立,可以发送正式的数据信息
调用基类的OnConnect(nErrorCode)函数
定义接收缓冲区recbuf
定义局部变量recstr
清空recbuf
调用Receive函数接收数据
接到数据 否
将收到的数据存入链表
向父窗口发送自定义消息
WM_RECEIVEOK
跳出
是
数据中含有MSG是Continue
否
将recstr以回车换行符切分
成几个小段,每段都存入链
表并向父窗口发送自定义消
息WM_RECEIVEOK
CMSN 类
概述:重载 CDialog 类,用于管理客户端登陆过程和发起会话。
核心代码分析:
1. Ini()
系统第一次运行或每次重启动时,都会调用 Ini()函数。图 给出了 Ini 的
流程图。
图 Ini 流程图
2. OnReceiveOK (WPARAM wparam,LPARAM lparam)
如果连接成功,CMSNSocket 将发送自定义消息 WM_CONNECTOK,其响
应函数 OnReceiveOK。图 给出了 OnReceiveOK 的流程图。
为成员变量赋初值
初始化界面
新建进度条控件并将其显示
新建用于显示用户的列表控件
并将其隐藏
清空存有所有聊天界面指针的
容器vector
开始与
的1863端口连接
创建socket
图 OnReceiveOK 流程图
3. Engine(CString instr)
系统核心函数,负责分析收到的字符串并作出相应回应。图 给出了
Engine 的流程图。
图 Engine 流程图
4. Stop()
系统退出或每次重启动前,都会调用 Stop()函数。在 Stop()里,释放了内存
资源, 并停止了 socket。图 给出了 Stop 的流程图。
图 Stop 流程图
5. OnTimer(UINT nIDEvent)
时钟回调函数,当检测到 TrID 不再变化,即登陆过程中断时,会重启登陆
过程。图 给出了 OnTimer 的流程图。
从CMSNSocket的链表里取出一个
数据存入recstr字符串
将recstr显示到状态列表控件里
执行Engine函数分析recstr
判断instr是哪条命令
根据协议对此命令作出相
应回应
更新进度条
停止socket
释放资源
重置界面控件位置
图 OnTimer 流程图
CMSNChat 类
概述:重载 CDialog 类,用于管理用户与好友的会话过程
核心代码分析:
结构上与 CMSN 类似,只是拥有独立的 socket 和不同的协议,因此不再赘
述。
系统测试
登陆界面
初始用户名为 yourname@,用来提示用户输入自己的 MSN 帐号和密
码。图 给出了登陆界面的测试效果图。
图 登陆界面
主 MSN 界面
是
调用Stop()函数停止
调用Ini()函数重新开始
检测TrID与上次相比是否发生变化
否
返回
mailto:%E5%88%9D%E5%A7%8B%E7%94%A8%E6%88%B7%E5%90%8D%E4%B8%BAyourname@
当点击登陆后,即开始登陆过程。图 给出了主 MSN 登陆界面在启动阶
段的测试效果图。
当登陆完成后,主 MSN 界面上会显示所有的好友,双击即可开始聊天。图
给出了主 MSN 登陆界面在登陆完成后的测试效果图。
图 主 MSN 界面(启动阶段)
图 主 MSN 界面(完成阶段)
聊天界面
聊天界面为打开的聊天界面,在编辑框输入后点击 send 按钮即可发送给对
方。图 给出了聊天界面在对方好友在线时的测试效果图。如果对方好友没
在线,聊天界面会显示 not online。图 给出了聊天界面在对方好友离线时的
测试效果图。
图 聊天界面(在线)
图 聊天界面(离线)
第五章 总结与展望
全文总结
网络在现代生活中扮演着越来越重要的角色,人们已经习惯于在网上聊天、
购物和办公等等。特别是随着我国网民数量的日益增加,聊天工具的使用也越来
越频繁和广泛,相应的聊天机器人的前景也会越来越好。
本文详细分析了 MSN Messenger 协议,并利用其登陆过程和消息发送原理设
计和实现了一款 MSN 客户端。该客户端允许在一台电脑上同时登录多个帐号,
并能与多人展开聊天。同时本文还充分研究了聊天机器人的运作原理,并在此
MSN 客户端基础上设计和实现了 MSN 聊天机器人系统。
工作展望
目前,聊天机器人主要是以联系人的形式出现的,只要你添加相关机器人的
账号,就可以像与真人聊天一样与机器人聊天,并可查询地图、股票、天气预报、
电视节目等信息。目前知名的有一枝独秀的 MSN 机器人小 i、专业的 MSN 股票
机器人牛牛,国内则如腾迅的 QQ 机器人小 Q,但在功能上和 MSN 的系列机器
人相比有一定差距。
就本文来说,未做的工作还有很多,主要有以下几方面:
1. 客户端的视频及音频通讯功能;
2. 客户端的添加删除好友功能;
3. 客户端对好友在线的状态显示;
4. 自动问答部分的实现。
参考文献
[1] 刘耀宾、贺旭东、余金峰.简述 MSN 防汛机器人的设计与功能.治淮 2009 年 02 期.2009
[2] 林立宇.MSN 查号机器人的研究与应用.广东通信技术 2007 年 09 期 .2007
[3] 李刚.打造自己的 MSN 机器人.电脑爱好者 2007 年 03 期 .2007
[4] 袁军辉.MSN 机器人.少年科学 2006 年 02 期 .2006
[5] 袁军辉 Stainless.MSN 聊天机器人开发揭秘——用.NET 开发 MSN 聊天机器人.电脑
爱好者 2004 年 18 期.2006
[6] 清风.DIY 一个属于自己的 MSN 机器人.电脑校园 2004 年 08 期.2004
[7] Zheng、zhiyong.自己做个 MSN 机器人——捷博 MSN 精灵.电脑迷 2004 年 03 期.2004
[8] 王荣福.DIY 你的 MSN 聊天机器人.电脑技术 2005 年 10 期.2005
致 谢
在此论文完成之际,感谢我的指导老师。老师对我的毕业设计予以悉心的指
导,对我们的毕业设计提出了很多建议,指导我做的更完善,还经常鼓励我,增
强我的信心使得我勇于尝试和奋斗,这些鼓励将使我受用终生。在此对老师致以
衷心的感谢和敬意,并祝吴老师工作顺利。
四年的大学生活就要结束了,留下的是太多的回忆和感动。感谢所有的老师
和朋友们。
最后对本次论文评阅和答辩的诸位老师表示感谢。