編寫自己的MSN機器人

概述
現在各類即時通信軟件琳琅滿目,相信接觸過INTERNET的人都會使用過其中的一部分。在中國就目前用戶量而言,騰訊公司的QQ、微軟公司的MSN Messenger以及網易公司的POPO排名在前三位。不過令人比較遺憾的是,騰訊公司和網易公司對於QQ以及POPO使用的通信協議並沒有對外界公開,正是由於這樣的技術壁壘,使得一些即時通信的開發者很難在這些用戶羣中開闢新的客戶服務渠道。
       不過值得慶幸的是,由微軟公司開發的MSN即時通信軟件,其客戶端與WINDOWS系統的緊密整合,加之其運行穩定、簡單易用以及全世界通用性強等特點。簡體中文版一經推出,用戶數量即以幾何數量的增加。更令大家歡呼雀躍的是微軟公司還提供的MSN的開發API並在其網站上向全世界公佈了MSN的通信協議。這令衆多開發者爲MSN拓展功能和對客戶進行更個性化的服務成爲可能,例如著名的MSN PLUS就是一款通過MSN API開發的MSN功能擴展插件,目前已經爲衆多MSN使用者所接收。
       同時,通過MSN的通信協議,網絡上更出現了爲數衆多的使用MSN通信協議的MSN機器人。他們通過接收用戶的消息並進行自動化的處理,使MSN的用戶能夠享受到各類公共信息的服務。
技術介紹
       由於MSN通信協議是基於TCP/IP的ASCII文本協議,因此通過WINDOWS的SOCKET與微軟架設在全球的MSN服務器按照既定的協議進行通信,就可以與全球的MSN用戶進行即時的消息和文件的傳輸(具體的MSN協議可以通過該網頁獲得http://www.hypothetic.org/docs/msn/index.php)。不過MSN的協議頗爲複雜,而且通信命令全部都是英語的縮寫,對於初識該協議的開發者來說,熟悉和實現協議費時又費力。
       現在網絡上有一些實現了MSN P8協議的開發包可以供開發者使用,這樣就可以使大家把精力更專注於邏輯的實現。
       目前比較流行的開發包有兩種:
1.         jMSN是封裝了MSN Messenger開放的通訊協議的JAVA API,通過這個API開發者完全可以使用JAVA語言模擬出MSN Messenger軟件,API的作者也提供一個用JAVA語言編寫的在某方面功能甚至比MSN Messenger還強大的MSN 客戶端軟件。由於採用了跨平臺的JAVA語言開發,因此該軟件也可同時運行於其他操作系統,目前已經經過測試的有各種Linux系統以及Mac OS上,當然還有視窗操作系統。jMSN是一個韓國人開發的開放源碼的API,可以從http://sourceforge.net/projects/jmsn/站點上下載,該項目的首頁基本上以韓文爲主,包括它的API文檔的說明都是韓文。
2.         dotMSN是由一位丹麥的高手開發的基於.NET的開發包,使用的使MSN P8協議,雖然它沒有支持到目前剛剛推出的MSN P10。但是,其開發包的功能之強大,是我使用過的MSN開發包中最好的。尤其值得稱道的是,作者對於dotMSN提供了非常詳盡的文檔支持和示例代碼(http://members.home.nl/b.geertsema/dotMSN/example/Example.zip)。利用該開發包,你可以輕鬆地實現自己的MSN機器人。
現在,我就來帶領大家建立自己的MSN機器人了。
技術準備
       在使用dotMSN之前,我先給大家介紹一下.NET框架的大致情況以及VS.NET集成開發環境,這樣便於大家在開發時更方便、快捷。
.NET框架
       .NET 框架是 Windows Server System 構建,部署與運行 Web 服務與應用程序的編程模型。該框架託管了大部分深層結構,讓開發人員專注於撰寫應用程序的業務邏輯代碼。.NET 框架的基本構成如下:
l         公共語言運行庫(CLR)
l         .NET Framework類
l         ASP.NET
l         Web Service
l         .NET遠程處理
l         Windows窗體類
其中CLR和.NET框架是所有基於.NET程序的基礎。
CLR可以是各類不同的應用程序(ASP.NET程序、移動程序、WINDOWS窗體程序)等都基於同樣的運行庫中。在部署和產品發佈中可以輕鬆地屏蔽掉在VS 6.0時代被大家成爲“DLL噩夢”的DLL重複版本問題。
.NET 框架包括了大量類,接口,以及值類型,使開發過程得以加速和優化,同時提供了系統功能的訪問途徑。爲了實現跨語言操作性,.NET 框架類型遵從公共語言規範 (CLS) ,因此可以使用任何有編譯器支持的語言。這就允許企業的 IT 部門在保留現有開發人員基礎上得以拓展,迅速開始 .NET 應用程序的開發,或利用完全的互操作性對現有應用程序用 .NET 特性加以改進。
其他的基本構成大都與不同類型的應用有關。
ASP.NET 是一個革命性的編程框架,使快速開發強大的 Web 應用程序和服務成爲可行。它提供了最方便、最靈活的途徑來構建,部署和運行 Web 應用程序,面向任何瀏覽器或設備。
XML Web 服務是一個包裝成單個實體的系列函數集,併發布出來爲其他應用程序提供數據和服務。應用程序通過行業標準的萬維網協議與數據格式,如 HTTP,XML,以及簡單對象訪問協議 (Simple Object Access Protocol, SOAP) 來訪問 Web 服務,且不需要關心 Web 服務的具體實現方法。Web 服務是建立開放分佈式系統的基石。
通信是跨網絡或跨應用程序域對象的關鍵因素,這些對象又被稱作遠程對象。.NET 遠程處理提供了一種強力高效的機制,允許對象之間跨越應用程序域實現交互。
存在於 .NET 應用程序及應用程序域之間的通信,通過負責在遠程對象之間傳送消息的通道而產生。一條消息被通道傳送前,會首先被格式化程序格式化(編碼或解碼)。.NET 框架支持 HTTP 和 傳輸控制協議 (TCP) 通道,以及 SOAP 和二進制的格式化程序。HTTP 通道使用 SOAP 格式化程序來傳送消息,而 TCP 通道使用二進制格式化程序。這兩種通道都可以自定義使用其他的格式化程序。第三方提供的通道同樣是可行的。HTTP 通道使用 SOAP 格式化程序來傳送消息,而 TCP 通道使用二進制格式化程序。這兩種通道都可以自定義使用其他的格式化程序。第三方提供的通道同樣是可行的。
Windows 窗體拓展了傳統的完全桌面化的 Windows 應用程序,同時,Visual Studio 帶來的開發體驗將我們帶入托管代碼與公共語言運行庫的世界。
VS.NET集成開發環境
要創建在 .NET 公共語言運行庫和 .NET 框架類中運行託管代碼的 .NET 應用程序,Visual Studio .NET 是首選的集成開發環境 (IDE)。它延續了 Visual Studio 的傳統,允許開發人員編譯以前的非託管 C++ 或 C# 應用程序。
Visual Studio .NET 讓快速開發應用程序 (RAD) 通過高效開發工具得以實現。一個緊密集成且統一的可視環境簡化了開發 Web 應用程序的過程,降低了學習曲線。共享的超文本標記語言 (HTML),XML,以及樣式表編輯器令使用任何 Visual Studio 語言開發 Web 應用程序變得十分容易,包括使用新的 C# 編程語言。
Visual Studio .NET 允許開發人員快速構建新的託管代碼的應用程序,面向 .NET 框架豐富的功能與類庫。Visual Studio .NET 同樣允許開發人員採用優化過的編譯器出品傳統的非託管代碼的 C++ 應用程序,如 Microsoft Word 或 Microsoft Excel。
程序開發
       下面大家就和我一起開始製作自己的機器人吧
引入dotMSN開發包
首先我們要先建立一個解決方案,由於.NET框架CLS(通用語言規範)可以支持多種不同的開發語言,因此你在建立解決方案的時候可以使用目前.NET支持的VB.NET、C#、J#、C++等語言。
 
在解決方案建立後,第一步需要做的就是將dotMSN開發包引用到解決方案中來,以便我們可以在今後的開發過程中使用。
  
 
可以看到在引用的文件列表中已經加入了DotMSN的開發包,下面在我們通過IDE設計好機器人程序的用戶界面後就可以開始使用DotMSN與MSN服務器通信了。
在DotMSN中有Messenger類,它就是你編程的全部,所以你在程序的開始就要聲明該類的一個對象並同時申請內存及初始化:
 
     private DotMSN.Messenger messenger = new Messenger();
 
在你輸入的MSN機器人的郵件地址、認證密碼及顯示的名稱後,首先要做的就是登錄到MSN服務器上,我這裏自己編寫了一個StartMSN函數來包含登錄動作,當然該函數中不止包含登錄,對於登錄以後MSN的一些消息事件也做了重載的聲明:
 
     //啓動MSN程序
     private void StartMSN()
     {
         try
         {                 
              //確認輸入的PASSPORT帳號不是默認的設置,否則報錯誤!
              if(txtMail.Text == "[email protected]")
                   MessageBox.Show(this, "鍵入你的PASSPORT以登錄MSN服務器!");
              else
              {
                   //事件重載代碼段
                   //重載上線函數
                   messenger.ContactOnline += new Messenger.ContactOnlineHandler(ContactOnline);
                   //重載下線函數
                   messenger.ContactOffline += new Messenger.ContactOfflineHandler(ContactOffline);
                   //重載聯繫人加入函數
                   messenger.ContactAdded += new Messenger.ContactAddedHandler(ContactAdded);
                   //重載會話創建函數
                   messenger.ConversationCreated += new Messenger.ConversationCreatedHandler(ConversationCreated);
                   //重載同步處理函數
                   messenger.SynchronizationCompleted += new Messenger.SynchronizationCompletedHandler(OnSynchronizationCompleted);
                   messenger.Connect(txtMail.Text, txtPass.Text);
                   Log(this.txtMail.Text + "登錄成功!");
                   messenger.SynchronizeList();
              }
         }
         catch(MSNException e)
         {
              MessageBox.Show(this, "連接失敗:" + e.ToString());
              Log("連接失敗:" + e.ToString());
         }            
     }
 
其中messenger的Connect方法是登錄MSN服務器的主要方法,在登錄之前我們需要對於MSN的一些消息事件做重載處理,以便將來這些事件觸發時可以調用我們自己編寫的邏輯處理代碼。
在登錄到MSN服務器成功後,馬上需要調用的方法就是SynchronizeList(),即與服務器同步聯繫人列表,列表分爲以下4種:
l         ForwardList:所有有效聯繫人列表,可以互相發送消息。
l         ReverseList:所有你在對方聯繫人列表中的聯繫人列表。
l         BlockedList:所有你阻止的聯繫人列表。
l         AllowedList:所有能夠看到你狀態的聯繫人列表。
通過對於上述4種列表的操作,可以讓機器人瞭解所有聯繫人的相關狀態並實施相應的操作。
在同步聯繫人列表結束後,需要設置messenger的狀態,MSNStatus是狀態的枚舉量,使用SetStatus方法來進行設置,狀態包括:在線、離線、離開、馬上回來、外出就餐等,通過對狀態變量的設置可以讓聯繫人看到機器人的不同在線情況。同時通過messenger.Owner.Name的設置可以讓機器人在聯繫人端顯示你需要的名稱。
接下來比較主要的工作就是對於MSN各類事件的重載處理了,我這裏舉兩個事件處理的例子,其他的事件可以從dotMSN的幫助文件中查閱。機器人的各類邏輯就是通過對於這些事件的重載來實現的。
     //會話創建時間處理程序
     private void ConversationCreated(Messenger sender, ConversationEventArgs e)
     {
         //記錄會話創建日誌
         txtLog.AppendText("會話創建成功!/r/n");
         //當聯繫人加入對話時處理函數
         e.Conversation.ContactJoin += new Conversation.ContactJoinHandler(ContactJoined);            //連接建立時處理函數
         e.Conversation.ConnectionEstablished += new Conversation.ConnectionEstablishedHandler(ConnectionEstablished);
         //聯繫人輸入消息時處理函數
         e.Conversation.UserTyping += new Conversation.UserTypingHandler(ContactTyping);
         //處理消息收到消息
         e.Conversation.MessageReceived += new Conversation.MessageReceivedHandler(MessageReceived);
         //接收文件傳輸時處理函數
         e.Conversation.FileTransferHandler.InvitationReceived +=new DotMSN.FileTransferHandler.FileTransferInvitationHandler(FileTransferHandler_FileTransferInvitation);
         }
 
第一個需要處理的就是會話創建事件,也就是機器人與聯繫人開始會話的情況,代碼中重載了5個相關的事件,從代碼中已經能夠猜想這些事件的大致用途了。會話創建事件本身的重載工作是在StartMSN()中聲明的。下面就是這些事件的重載代碼:
 
     //聯繫人輸入消息時處理函數
     private void ContactTyping(Conversation sender, ContactEventArgs e)
     {
         txtLog.AppendText(e.Contact.Name + "正在輸入消息.../r/n");
         Log(e.Contact.Name + "正在輸入消息...");
     }
     //聯繫人加入對話處理函數
     private void ContactJoined(Conversation sender, ContactEventArgs e)
     {
         //聯繫人加入對話,記錄聯繫人姓名到日誌中
         txtLog.AppendText(e.Contact.Name + "加入對話!/r/n");
         Log(e.Contact.Name + "加入對話!");
         //輸入歡迎詞
         sender.SendMessage("你好啊!我是" + messenger.Owner.Name);
         sender.SendMessage("發送短信請使用以下命令:手機號碼#要發送的內容");
         //sender.SendMessage("如果需要幫助文件,請鍵入get_help_file");
     }
       //連接建立處理函數
     private void ConnectionEstablished(Conversation sender, EventArgs e)
     {
         txtLog.AppendText("連接完成!/r/n");
     }
     //收到聯繫人消息時處理函數
     private void MessageReceived(Conversation sender, MessageEventArgs e)
     {
         string msg_rcv = e.Message.Text;
         msg_rcv = e.Message.Text.Replace("/0", "");
         txtLog.AppendText(e.Sender.Name + "說:" + msg_rcv + "/r/n");
         Log(e.Sender.Name + "說:" + msg_rcv);
         string msg_dnt = MessageHandle(msg_rcv, e.Sender.Name, e.Sender.Mail);
         sender.SendMessage(msg_dnt);
         Log("機器人發送消息:" + msg_dnt);
     }
     //文件接收動作處理函數
     private void FileTransferHandler_FileTransferInvitation(FileTransferHandler sender, FileTransferInvitationEventArgs e)
     {
         //接收動作爲真             
         e.Accept = true;
         //收到的文件保存在D:/MSN_BOT_FILES下
         string tmpfile = "D://FileOfBot//" +                            sender.Conversation.Messenger.Owner.Name + "@" + e.FileTransfer.FileName;
         e.FileTransfer.ReceiveStream = new FileStream(tmpfile, FileMode.Create, FileAccess.ReadWrite);
         txtLog.AppendText("接收文件並保存到:" + tmpfile + "/r/n");
     }
 
       在這些事件當中,MessageReceived事件比較重要,它表示當機器人接收到用戶發送的文字消息時所進行的處理邏輯,這裏也就是你可以自由發揮的地方了!我這裏編寫了獨立的MessageHandle函數來對於所有收到的消息進行處理。在該處理函數中,所有機器人的智能情況和相關的業務功能都可以根據你自己對於機器人的定位來實現。
我這裏的機器人所做的就是將用戶發送的消息命令解碼並根據用戶輸入的目標移動中斷髮送移動短信。當然這裏是需要後端有短信網關或者是相關的短信發送設備的支持。你看,你輕鬆地就擁有了自己的短信服務機器人了。
在後端有相關數據庫的支持下,機器人同樣可以根據用戶的輸入來查詢數據庫的相關信息並返回給用戶。
在拓展用戶、客戶服務、產品推介等方面又多了一條網絡的途徑!
 
 
 
結尾
       好了,關於MSN機器人方面就先寫到這裏吧。目前我自己也在更深入地鑽研MSN的協議,希望能夠與具有相同興趣的朋友一起交流。期待着你們的來信,
 
 
發佈了37 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章