很早就想给 Messenger 写个 Bot玩玩,
有一段时间还分析过messenger的协议,不过Messenger这东东每次更新必然升级协议,搞得到后来都没力气跟他玩了。
Live Messenger 算是有了个
Add-In SDK, 不过这个Add-in本来不是用来作Bot用的,功能很弱而且限制颇多:
- Messenger 只能 Load 一个Add-In Dll (这点其实可以绕过去,写一个Add-In ,再自己公开了一个Interface,然后每次Init的时候到一个固定的Folder去动态加载所有实现了这个Interface的Dll)
- Add-In 能做的事情非常有限,它只能响应Receive Message Event去 Reply message。
- Add-In 只能Reply Message 给 Message 的Sender,不能发给第3方。
- Add-In 只能回复1条Message 给Message 的 Sender (Kao,这个是最致命的,很多东东基本上没的玩了)
不过看在至少能Reply Message的份上,凑合着用用把:
首先要Enable Messager 的 Addin功能,缺省情况下,这个Feature是disable的。
改一下注册表,加个DWORD key in HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger\AddInFeatureEnabled
set the value to 1, Restart your messenger, Login and open option window: Add-In tab 就出现了:
(有时候你会发现改了注册表Add-In Tab还是没有出来, 如果确定你的Registry没有改错,重装一下Live Messenger应该可以解决问题,还不行的话,请回忆你前半生的所作所为以检查RPWT)
当然,在这里只是Load,要激活Add-In,你还要Turn On它:
Add-In的开发很容易,简单的引用Messenger Program Folder里的MessengerClient.dll,再创建一个Class实现IMessengerAddIn。IMessengerAddIn 接口实现也很简单,在Initialize里注册一下你的ReplyMessage事件处理函数就行了。
Online SDK里有Sample Code,基本只要照抄。唯一要注意一点的就是编译出的Dll file name 要和你的 实现 IMessengerAddIn 的Class的FullName相同,比如说你的Class叫MyCompany.Testing.MyMessagerAddIn, dll 名字就得叫做MyCompany.Testing.MyMessagerAddIn.dll。
对了,给你的Add-In Dll 加上Strong Name 并且Add to GAC, 否则Add-In dll 会Run 在Internet Permission Set,不能读写本地文件,不能访问Database,不能... 基本上除了可以Reply个"Hello World",你的AddIn啥也干不了。
调试也挺痛苦,我刚开始是用VS.Net 直接 Attach msnmsgr.exe 这个进程,然后在Messenger里 Load Addin Dll, 如果你在Compile Add-in dll之后刷新了GAC里Dll 版本的话,Initalize method 上的断点是能起作用的。后来就索性先当这Add-In是个普通的Class Library, 用NUnit 或者直接写个test winform project 来调试了。