Ein O’Reilly-Post am Morgen lässt den Tag gut beginnen. Deshalb zeige ich hier eine kleine Perl-Anwendung für Windows, mit der ich den Titel und einen kleinen Auszug des aktuellsten Posts hier im oreillyblog angezeigt bekomme.
Die Anwendung besteht im Prinzip aus drei Teilen:
1. Der Teil für den Taskschedulereintrag
2. Der Teil, der den RSS-Feed ausliest und den Artikel auswählt
2. Der Teil für die Anzeige der Meldung
Was für die UNIX-Welt „cron“ ist, ist der Taskscheduler bei Windows. Hiermit kann man Aufgaben zu bestimmten Zeiten ausführen. Das Skript soll sich selbst in den Scheduler eintragen, weil ich das nicht per Hand machen möchte. Auch dafür gibt es ein Perl-Modul: Win32::TaskScheduler . Also tragen wir das Programm ein:
# create a new task scheduler object my $scheduler = Win32::TaskScheduler->New; # define the trigger options my %task_config = ( BeginYear => 2010, BeginMonth => 8, BeginDay => 1, EndYear => 2201, EndMonth => 8, EndDay => 1, StartHour => 9, StartMinute => 1, MinutesDuration => 0, TriggerType => $scheduler->TASK_TIME_TRIGGER_DAILY, Type => { DaysInterval => 1, }, ); # create new task item my $item_ok = $scheduler->NewWorkItem( 'Test', \%task_config ); if ( $item_ok == 1 ) { # run this script with perl my $name_ok = $scheduler->SetApplicationName( 'perl' ); $scheduler->SetParameters( "$0 -c run" ); # run task as administrator my $result = $scheduler->SetAccountInformation( 'admin_user', 'admin_pass', ); # save task if ( $has_set_name ) { my $return = $scheduler->Save; $scheduler->Activate( $task_name ) if $return; } }
Man kann natürlich alle möglichen Kombinationen eintragen – alle zwei Wochen, nur an bestimmten Wochentagen, und alle x Minuten oder Stunden.
In diesem Fall möchte ich jeden Tag um 9.01 Uhr die Benachrichtigung erhalten. Die Aufgabe startet am 01. August 2010 und läuft bis ins Jahr 2201 ;-)
Jetzt ist das Programm eingetragen, fehlt natürlich noch, dass der RSS-Feed ausgelesen und der Artikel ausgewählt wird. Als Modul wird hier XML::RSS::Parser verwendet. Auch wenn es schon relativ alt ist, funktioniert es zuverlässig:
# get and parse RSS feed
my $feed_url = 'https://oreillyblog.dpunkt.de/feed/'; my $parser = XML::RSS::Parser->new; my $feed = $parser->parse_uri( $feed_url ); # get title of the first item my $title_node = $feed->query( '//item/title' ); my $title = $title_node->text_content; # get text of the first item my $text_node = $feed->query( '//item/description' ); my $content = $text_node->text_content;
Für die Anzeige des Artikels wird eine Desktop-Benachrichtigung verwendet. Als Benachrichtigungsdienst benutze ich Snarl . Das muss beim Start des Perl-Programms schon gestartet sein und es muss auf ankommende Nachrichten lauschen. Diese Einstellung ist sehr schnell gemacht. Für die Kommunikation mit Snarl verwende ich das Modul Net::Snarl.
# show notification my $snarl = Net::Snarl->register( 'Startup feed' ); $snarl->add_class( 'feed' ); $snarl->notify( 'feed', $title, $content, 15 );
Beim Registrieren kann man auch einen Host und Port angeben. So könnte man auch einen Kollegen mit dem Blogpost erfreuen. Die Benachrichtigung bleibt in diesem Beispiel 15 Sekunden sichtbar.
Wie man sieht gibt es für alles Mögliche CPAN-Bibliotheken und man muss sie nur noch zusammenfügen. Einer der Gründe, warum mir Perl so gut gefällt.
Das komplette Skript ist unter http://downloads.perl-magazin.de/oreilly_blog.txt zu finden. Natürlich müssen die oben genannten Module noch installiert werden. Aber das ist mit „cpanminus“ ganz einfach .
Über den Autor: Renée Bäcker ist seit 2002 begeisterter Perl-Programmierer und seit 2003 selbständig. Auf der Suche nach einem Perl-Magazin ist er nicht fündig geworden und hat selbst das Perl-Magazin „$foo“ gestartet. In der Perl-Community ist Renée recht aktiv – als Moderator bei Perl-Community.de, Organisator des kleinen Frankfurt Perl-Community Workshop und Mitglied im Events-Team der Perl Foundation.
8 Kommentare