利用程式發送 MSN 訊息

會寫這個程式,主要是因為一個重要的 Web 應用程式三不五時會掛掉,而系統管理員希望能在第一時間發現這個情況(以免使用者來電開罵)。

要偵測伺服器是否掛點,可以用 .NET 的 TcpClient 嘗試連接伺服器的特定 port,這種簡單的方法不僅可以用在 Web 伺服器,也可以用於資料庫伺服器(例如:嘗試連接 Oracle 伺服器的 1521 port)。

一旦發現伺服器無法正常運作,程式可以發送 mail 通知系統管理員,可是系統管理員不見得會經常收信,這樣的時效性就不夠快。現在 MSN messenger 已經很普遍,如果發現系統出問題時,能夠發即時訊息給相關人員,似乎是個不錯的辦法。

這裡我用來發送 MSN 即時訊息的元件是 MSNPSharp。這個元件有附一個 Windows Forms 範例程式可以參考,此範例就像一個陽春型的 MSN Messenger,可以讓你登入 MSN 伺服器、發送訊息給聯絡人等等。

仔細研究這個範例程式,大概就可以瞭解 MSNPSharp 的基本用法,同時也可以發現,此元件大量運用了非同步處理的程式撰寫模型。這種非同步的撰寫方式不僅增加了學習門檻,除錯也比較麻煩,更重要的是,這並不是我想要的。

我的需求很簡單:當程式需要發送 MSN 訊息時,就先登入 MSN 伺服器,然後依事先設定的聯絡人逐一發送文字訊息。訊息發送的對象有可能是離線狀態,這沒關係,繼續發送給下一位聯絡人即可。

針對上述需求,我寫了一個簡單的 wrapper 類別:SimpleMsnMessenger。這裡我不打算詳細說明原理,謹列出幾個重點步驟:
  1. 建立 Messenger 物件 => messenger。
  2. 利用 messenger.Connect() 登入伺服器。
    關鍵事件:messenger.Nameserver.SignedIn
  3. 利用 messenger.CreateConversation() 建立 Conversation 物件 => conversation。
    關鍵事件:messenger.ConversationCreated
  4. 利用 conversation.Invite(("someone@hotmail", ClientType.PassportMember); 邀請對方加入對話。
    關鍵事件:conversation.Switchboard.ContactJoined (已成功邀請對方加入對話)
  5. 利用 conversation.SwitchBoard.SendTextMessage() 發送文字訊息。
有興趣研究的朋友可以參考這篇文章:MSNPSharp傳送信息程序詳解,大致瞭解其設計原理後,再對照範例程式來研究,應該就比較容易瞭解 MSNPSharp 的基本用法。

SimpleMsnMessenger 的完整程式碼可按此連結下載。Note: 此程式碼還有許多改進空間,尤其是錯誤處理的部分,但基本上還堪用。

以下是使用此 wrapper class 的範例:

class ServerAliveChecker

{

private SimpleMsnMessenger msn = new SimpleMsnMessenger("robot@hotmail.com", "password");

private void SendMsn(StringBuilder text)

{

string receivers = ConfigurationManager.AppSettings["ReceiverMsn"];

if (String.IsNullOrEmpty(receivers))

{

return;

}

lblStat.Text = "正在傳送 MSN 訊息...";

Application.DoEvents();

string[] msnMail = receivers.Split(';');

try

{

msn.Connect();

// 等待登入動作完成。

while (msn.IsConnecting && msn.ErrorCount <= 0)

{

Application.DoEvents();

}

if (msn.Connected && msn.SignedIn)

{

// 登入成功

foreach (string mail in msnMail)

{

msn.SendTextMessage(mail, text.ToString());

}

// 等待訊息全部發完,但只等待一段時間。

DateTime now = DateTime.Now;

while (!msn.MessageQueueEmpty)

{

Application.DoEvents();

System.Threading.Thread.Sleep(500);

TimeSpan ts = DateTime.Now.Subtract(now);

if (ts.Minutes >= 3)

{

break;

}

}

msn.Disconnect();

}

else

{

string err = "MSN Messenger 登入失敗";

if (msn.ErrorCount > 0)

{

LogError(err + ": " + msn.LastError.Message);

}

else

{

LogError(err + "。" + msn.LastError.Message);

}

return;

}

}

catch (Exception ex)

{

LogError(ex.ToString());

}

}

}



按此連結下載完整的類別與範例原始碼

20 則留言:

  1. 請問可以提供完整的source code嗎?
    thx

    回覆刪除
  2. 我把整個範例程式(包含元件)包成 zip 檔放在網路硬碟上了。超連結請看內文。

    回覆刪除
  3. 感謝!
    您這篇文章對我很有幫助
    目前小弟在研究source 中

    回覆刪除
  4. 請問一下現在還可以用嗎?
    似乎沒辦法登入><

    回覆刪除
  5. 到目前為止,程式都還正常運作喔!

    回覆刪除
  6. 請問要怎樣能在登入後
    抓到我MSN上的暱稱或是狀態之類的
    有甚麼指令能抓ㄇ???

    回覆刪除
  7. 在上方的範例中有用到
    msn.MessageQueueEmpty

    但在 SimpleMsnMessenger 卻沒有 MessageQueueEmpty 的public 可以使用

    不知是哪出了問題

    回覆刪除
  8. 啊! 抱歉,SimpleMsnMessenger 少了一個 MessageQueueEmpty 屬性的定義。我已經把更正的版本放上去,您可重新下載,或自行加上這段程式碼:

    public bool MessageQueueEmpty
    {
    get
    {
    return (msgQueue.Count == 0);
    }
    }

    回覆刪除
  9. 您好:
    看到您的文章您真的非常厲害
    請問可以寄給我完整的source code嗎?
    現在我們很需要您的source code
    以下是我的信箱也是我的MSN

    jay1393@yahoo.com.tw

    也希望可以跟您換個MSN有些相關問題想跟您請教.也可以交個朋友.
    非常感謝您!

    回覆刪除
  10. 文章裡面有提供完整 source code 的下載連結喔!

    回覆刪除
  11. 忘了說....我對 MSNPSharp 的研究,其實也就僅止於這篇文章裡面的程式碼,因為目前我所需要的也就只是簡單的發訊息功能而已。若要了解更完整的用法,還是建議大家研究一下 MSNPSharp 附的範例程式喔。

    回覆刪除
  12. 因為我現在所需要的就是要讓我的專題題目OPENNMS能夠在網段出現問題的時候,發送訊息給管理者,裡面是有內建發送MAIL的功能,但是我現在需要讓他能夠發送MSN訊息告知網路哪邊出了問題,以便達到更即時的通知,而在網站查資料以後發現你所用的東西與我所需要的有類似之處,而小弟我對JAVA懂得實在不深,還想請你不嗇給予指導.

    回覆刪除
  13. 想請問這程式碼使用在vs2010中,是否也可以正常運作呢?我使用時stat一值停在"登入中..."
    想問是不是哪邊有出了甚麼問題呢

    回覆刪除
  14. Hi Ben,
    這個範例程式似乎已經不能運作了。就像你說的,登入時會一直停留在嘗試登入的狀態。
    我試過官網新版的範例程式是 OK 的,可以參考看看:
    http://code.google.com/p/msnp-sharp/downloads/detail?name=MSNPSharp_504_RELEASE.zip

    回覆刪除
  15. 好的~我試試看~謝謝^^

    回覆刪除
  16. MSNPSharp 5.04的好多方法都不一樣了,就單純發訊息通知某些人這件事情來說,寫法變得簡單了。

    回覆刪除
  17. 嗯。昨晚還試了一下連結新版 DLL,重新編譯這個範例程式時,一堆錯誤。也難怪啦,這個範例是三年多前寫的,一直沒動,而 MSNPSharp 一直都有在繼續發展。

    回覆刪除
  18. YA! 有除錯完成要分享喔!

    回覆刪除

技術提供:Blogger.
回頂端⬆️