Google搜查列

 

2013年7月9日 星期二

使用Perl 發GTalk

常常在使用PERL管理我的系統,用得最多就是系統檢測
在管理裡,最希望是可以達到即時通知道Syster Administrator管理人

最即時收到訊息有手機的簡訊(短訊) ,電話的方式
桌上型電腦有MSN,SKYPE,GTalk,Pidgin等
而智慧型手機的通訊有SKYPE,GTalk,LINE,Whatsapp等……

寫這個程式的出發點是我的系統裡有UPS不斷電,但如在假日發生時,也可以透過即時通訊軟體通知管理人
我的UPS是山特(台灣飛瑞)



其管理軟體winpower裡,用得上的是郵件和簡訊
不過沒有即時通知功能
不過被我在安裝目錄下發現了一個UPSEVENT.CSV 的事件文字檔案
在裡面的我只關注4個事件代號和發生事件時間
00 市電斷電
03 市電覆電
04 RS232斷線
05 RS232連線

使用Perl定期檢讀這個檔案(例如每5分鐘),在發生事件時使用XMMP協定通知我的指定帳號
經過多方測試,使用GTALK是大宗表現不錯,也有其優點
1.在GMAIL裡可以記錄GTALK通訊內容(歷史事件)
2.也有PC和手機app 或GMAIL,都會同時通知到(NB,桌機,手機,WEB MAIL的GMAIL)
3.GTalk接口簡單,使用XMPP,但連線需TLS加密

編寫前,如果執行Perl的系統是windows ,請記得安裝XMPP套件模塊,是LINUX的話那要安裝一下XMPP喔

在傳送後,手機會收到GTALK的訊息(無奈傳送中文會產生亂碼,只好再研究一下囉)


另外,如果想要寫GTALK機器人的話,可以參考使用perl gtalk套件
Net::XMPP::Client::GTalk

#!/usr/bin/perl


use strict;
use Net::XMPP;
if(1==1) { #這裡可以方一些檢查的程式
  $temptext="EVENT\n";
  &sendgtalk("$temptext");#呼叫傳送gtalk
}


#副程式 傳送GTalk 訊息給指定帳號
sub sendgtalk{
        my $username = "flybird001";#傳送人帳號
        my $password = "xxxxxxxxxx";#傳送人密碼
        my $resource = "nagios";
        ## End of configuration
        $ARGV[0]="touser";#接收人帳號
        $ARGV[1]=shift;     #訊息內容
        my $len = scalar @ARGV;
       
        if ($len ne 2) { #檢查是否有兩個參數
           die "about [touser] and [message]?\n";
        }
       
        my @field=split(/,/,$ARGV[0]);
       
        #------------------------------------
       
        # Google Talk & Jabber parameters :
       
        my $hostname = 'talk.google.com';
        my $port = 5222;
        my $componentname = 'gmail.com';
        my $connectiontype = 'tcpip';
        my $tls = 1;
       
        #------------------------------------
       
        my $Connection = new Net::XMPP::Client();
       
        # Connect to talk.google.com
        my $status = $Connection->Connect(
               hostname => $hostname, port => $port,
               componentname => $componentname,
               connectiontype => $connectiontype, tls => $tls);
       
        if (!(defined($status))) {
           print "ERROR:  XMPP connection failed.\n";
           print "        ($!)\n";
           exit(0);
        }
       
        # Change hostname
        my $sid = $Connection->{SESSION}->{id};
        $Connection->{STREAM}->{SIDS}->{$sid}->{hostname} = $componentname;
       
        # Authenticate
        my @result = $Connection->AuthSend(
               username => $username, password => $password,
               resource => $resource);
       
        if ($result[0] ne "ok") {
           print "ERROR: Authorization failed: $result[0] - $result[1]\n";
           exit(0);
        }
       
        # Send messages
        foreach ( @field ) {
        $Connection->MessageSend(
                to       => "$_\@$componentname",
                resource => $resource,
                subject  => "Notification",
                type     => "chat",
                body     => $ARGV[1]);
        }

}

2 則留言:

小虫 提到...

加上
use Encode;

及把
body => $ARGV[1]);
換成
body => decode("utf8",$ARGV[1]));
就不會有亂碼了。

飛鳥 提到...

我有試過這個方式,不過接收到還是亂碼

Google Analytics