#!/yer/perl/here -w use strict; =pod =head1 NAME jabbergroups =head1 SUMMARY jabbergroups I<--group> someIceCreamGroup I<--group> someJabberGroup I<--username> superfly I<--password> **** I<--storefile> /usr/tmp/jg.dat =head1 DESCRIPTION Parses the RSS feed for the message listing of a Yahoo Groups mailing list and sends new messages to a user via Jabber. I wrote this because I never check the email address I used when I created the login to Yahoo groups and, frankly, I don't need to get more email from YA mailing list. But, it would nice to see when something new has been posted. The program is meant to be run as a cron-job and stores a hash containing { groupname => lastmessage } which is compared every time it is run. Only messages with an id greater than the lastmessage are sent. =head1 OPTIONS Valid options are =over 4 =item B<--group> (required) The name of one, or more, valid Yahoo Groups mailing lists. =item B<--username> (required) A valid Jabber username for I<--server>. =item B<--password> (required) A valid Jabber password for I<--username>. =item B<--server> Default is jabber.com. =item B<--port> Default is 5222. =item B<--resource> Default is jabbergroups. =item B<--sendto> The IM address to which notification of new posts will be sent. If no address is specified, the messages will be sent to I<--username> @ I<--server>. =item B<--storefile> (required) The path to a document that Storable.pm can use to save lastmessage data. =back =cut use Carp; use Getopt::Long; use LWP::UserAgent; use HTTP::Request; use XML::RSS; use Net::Jabber; use Storable; # my @yahoo_groups = qw ( ); my $jabber_username = ""; my $jabber_password = ""; my $jabber_server = "jabber.com"; my $jabber_port = "5222"; my $jabber_resource = "jabbergroups"; my $jabber_recipient = ""; my $storefile = ""; # my $lastmessage = {}; my $jabber = undef; { &main(); exit; } sub main { &GetOptions( "group=s" => \@yahoo_groups, "username=s" => \$jabber_username, "password=s" => \$jabber_password, "resource:s" => \$jabber_resource, "server:s" => \$jabber_server, "port:i" => \$jabber_port, "sendto:s" => \$jabber_recipient, "storefile=s" => \$storefile, ); if (! @yahoo_groups) { croak "No groups to watch. Duh."; } if (! $storefile) { croak "You must specify a storefile."; } if (! $jabber_username || ! $jabber_password) { croak "I can't login to the Jabber server until I know who you are."; } &start_jabber(); if (-f $storefile) { $lastmessage = retrieve($storefile) || croak $!; } map { &munge_group($_); } (@yahoo_groups); store $lastmessage, $storefile || croak $!; return 1; } sub start_jabber { $jabber = Net::Jabber::Client->new(); $jabber->Connect( "hostname" => $jabber_server, "port" => $jabber_port, ) or croak "Cannot connect ($!)\n"; my @result = $jabber->AuthSend( "username" => $jabber_username, "password" => $jabber_password, "resource" => $jabber_resource, ); if ($result[0] ne "ok") { croak "Ident/Auth with server failed: $result[0] - $result[1]\n"; } return 1; } sub munge_group { my $group = shift; my $fetch = "http://groups.yahoo.com/group/$group/messages\?rss=1"; my $agent = LWP::UserAgent->new(); my $res = $agent->request(HTTP::Request->new(GET=>$fetch)); if ($res->{"_rc"} ne "200") { &send_jabber_message("Failed to fetch RSS file for $group : $res->{'_rc'} : $res->{'_msg'}"); return 0; } my $rss = XML::RSS->new(); eval { $rss->parse($res->{"_content"}); }; if ($@) { &send_jabber_message("Failed to parse RSS file for $group : $@"); return 0; } my $last_id = $lastmessage->{ $group }; my @messages = (); foreach my $item (@{ $rss->{'items'} }) { $item->{"link"} =~ /\/(\d+)$/; my $msg_id = $1 || undef; if ((! $msg_id) || ($msg_id <= $last_id)) { next; } &send_jabber_message("$item->{'link'} -- $item->{'title'} , $item->{'description'}"); $last_id = $msg_id; } $lastmessage->{ $group } = $last_id; return 1; } sub send_jabber_message { my $message = shift; my $msg = Net::Jabber::Message->new(); $msg->SetMessage( to => $jabber_recipient, body => $message ); $jabber->Send($msg); return 1; } =pod =head1 TO DO =over 4 =item Add hooks to read password from somewhere other than the comand-line. =item Add usage/help widget =back =head1 VERSION 1.0 =head1 AUTHOR Aaron Straup Cope =head1 SEE ALSO L L L =cut