作者 主題: [ 分享 ] 使用Jabber實作即時通知  (閱讀 6390 次)

0 會員 與 1 訪客 正在閱讀本文。

willie0220

  • 憂鬱的高中生
  • ***
  • 文章數: 142
    • 檢視個人資料
[ 分享 ] 使用Jabber實作即時通知
« 於: 2005-10-13 15:46 »
終於被我亂試出來了
相關討論在
http://phorum.study-area.org/viewtopic.php?t=32299
以下是小弟對Jabber的簡單介紹以及理解,若有謬誤,請不吝指正:

[前言]
Jabber是開放規格的IM protocal(Jabber底層是XMPP),前陣子Google推出的Google Talk也是使用Jabber作為其通訊協定。使用Jabber最大的好處就是有許許多多的Client程式可以使用,不用擔心相容性的問題。如Gaim就直接內建了Jabber protocal支援,只要有Gmail帳號者即可使用Gaim與Google Talk互通。原本的目標,是希望能針對Google Talk作即時的通知,但是因為我的主機因故不能裝perl的IO::Socket::SSL模組(Google Talk強制要使用TLS連線),是故最後使用jabber.org的帳號作為測試環境。

[需要安裝的套件]
1.perl的版本需要5.8以上
2.perl的Net::XMPP模組
   安裝方式:perl -MCPAN -e 'install Net::XMPP'
   
[申請帳號]
1.開啟Gaim的帳號清單,點選"新增按鈕"
2."通訊協定"選擇"Jabber","帳號"輸入你想要的帳號(比方willie.tw)、"密碼"。"伺服器"欄位使用預設的jabber.org即可,其餘皆用預設值,然後按"註冊"。此時若你的帳號沒有人使用,則會註冊成功,否則會傳回註冊失敗的訊息。此時只要改帳號即可。
3.請加入"server_agent@jabber.org"為好友(這是我註冊的專用通知帳號XD),或者是你要設定自己專用的通知帳號也可以。

[程式碼]
視需求修改以下程式碼17~19行,比如"willie.tw@jabber.org"改成你的帳號(xxx@jabber.org),存檔(假設檔名是sendMessage)。
請注意要將此檔存成utf8編碼,否則中文訊息會變成亂碼。
轉碼程式請參考iconv或piconv的manpage。
使用方式為:
sendMessage <client端的位址> <登入主機的位址>
代碼: [選擇]

#!/usr/bin/perl
use Net::XMPP;
use encoding utf8;
$client = new Net::XMPP::Client();
$client->SetCallBacks(
  onauth  => \&SendMessage
);
$client->Execute(
  hostname  =>  'jabber.org',
  port      =>  5222,
  tls       =>  0,
  username  =>  'server_agent',
  password  =>  'asdfghjk',
  resource  =>  'Work'
);

sub SendMessage {
  $client->MessageSend(to=>'willie.tw@jabber.org',
                    subject=>"SSH登入通知",
                    body=>"使用者${ARGV[0]}登入主機${ARGV[1]}中...\n"
  );
  $client->Disconnect();
}


[使用示範]
在/etc/hosts.allow加入下面這行,其中%c會被tcp_wrapper代換成登入者位址,%H會被代換成該主機的位址
代碼: [選擇]
sshd:ALL:spawn (/your/path/sendMessage %c %H) &

希望對各位有幫助