原理:
因为google的 gtalk采用了xmpp协议,因此用开源的实现方案轻松无比,任何jabber的客户端经小改之
都可以与GTalk互通,此段代码用的条件
perl 5.6.0及以上
Net:XMPP
Net:Ping
#
!/usr/bin/perl -w
use strict;
use Net :: XMPP;
use Net :: Ping;
# ##########################################
#use Net::Ping mod check the remote machie
#is alive or not!
#sub ping
############################################
sub ping{
open END , " >/tmp/bot/ping_end_gtalk.txt " or die " cann't open file: $! " ;
my @ip = qw{x . x . x .. 30
x . x . x . x . 33
x . x . x . x . 34
x . x . x . x . 35
x . x . x . x . 36
x . x . x . x .. 39
};
my $host ;
my $check = Net :: Ping -> new();
foreach $host ( @ip ){
if ( $check -> ping( $host )) {
print END " $host is alive. " ;
}
else {
print END " WARNING!!! $host is unreachable. " ;
}
}
$check -> close ();
close END;
}
& ping;
# #########################################
#gtalk send ping_file to x5ywsir
########################################
my $username = " ark119 " ;
my $password = " xxxxxxxxx " ;
my $body ;
my $to = " x5ywsir " ;
my $resource = " PerlBot " ;
# # End of configuration
#------------------------------------
# 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. " ;
print " ($!) " ;
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] " ;
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] " ;
exit ( 0 );
}
# Send message
open PING_FILE , " /tmp/bot/ping_end_gtalk.txt " ;
while ( < PING_FILE > ){
print $body = $_ ;
$Connection -> MessageSend(
to => " $to@$componentname " , body => $body ,
resource => $resource );
sleep 5 ;
}
close PING_FILE;
use strict;
use Net :: XMPP;
use Net :: Ping;
# ##########################################
#use Net::Ping mod check the remote machie
#is alive or not!
#sub ping
############################################
sub ping{
open END , " >/tmp/bot/ping_end_gtalk.txt " or die " cann't open file: $! " ;
my @ip = qw{x . x . x .. 30
x . x . x . x . 33
x . x . x . x . 34
x . x . x . x . 35
x . x . x . x . 36
x . x . x . x .. 39
};
my $host ;
my $check = Net :: Ping -> new();
foreach $host ( @ip ){
if ( $check -> ping( $host )) {
print END " $host is alive. " ;
}
else {
print END " WARNING!!! $host is unreachable. " ;
}
}
$check -> close ();
close END;
}
& ping;
# #########################################
#gtalk send ping_file to x5ywsir
########################################
my $username = " ark119 " ;
my $password = " xxxxxxxxx " ;
my $body ;
my $to = " x5ywsir " ;
my $resource = " PerlBot " ;
# # End of configuration
#------------------------------------
# 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. " ;
print " ($!) " ;
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] " ;
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] " ;
exit ( 0 );
}
# Send message
open PING_FILE , " /tmp/bot/ping_end_gtalk.txt " ;
while ( < PING_FILE > ){
print $body = $_ ;
$Connection -> MessageSend(
to => " $to@$componentname " , body => $body ,
resource => $resource );
sleep 5 ;
}
close PING_FILE;