Kommentare 8

Gut informiert in den Tag mit Perl

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://blog.oreilly.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

  1. Hallo,

    was mache ich wenn bei der Installation von Win32::TaskScheduler folgendes erscheint:

    TaskScheduler.xs:1410: error: ‚ITask‘ has no member named ‚SetMaxRunTime‘
    TaskScheduler.xs: In function ‚XS_Win32__TaskScheduler_SetCreator‘:
    TaskScheduler.xs:1435: warning: assignment makes pointer from integer without a cast
    TaskScheduler.xs:1436: error: ‚ITask‘ has no member named ‚SetCreator‘
    TaskScheduler.xs: In function ‚XS_Win32__TaskScheduler_GetCreator‘:
    TaskScheduler.xs:1466: error: ‚ITask‘ has no member named ‚GetCreator‘
    TaskScheduler.xs:1469: warning: initialization makes pointer from integer without a cast
    TaskScheduler.xs: In function ‚XS_Win32__TaskScheduler_GetMostRecentRunTime‘:
    TaskScheduler.xs:1496: error: ‚ITask‘ has no member named ‚GetMostRecentRunTime‘
    dmake.EXE: Error code 129, while making ‚TaskScheduler.o‘
    UNICOLET/Win32-TaskScheduler2.0.3.zip
    C:\strawberry\c\bin\dmake.EXE — NOT OK
    Running make test
    Can’t test without successful make
    Running make install
    Make had returned bad status, install seems impossible
    Failed during this command:
    UNICOLET/Win32-TaskScheduler2.0.3.zip : make NO

    cpan>

  2. Am einfachsten dürfte sein, wenn Du das Modul mit PPM installierst:

    D:\>ppm
    PPM interactive shell (0.01_01) – type ‚help‘ for available commands.
    PPM> search Win32-TaskScheduler
    Packages available from http://www.bribes.org/perl/ppm:
    Win32-TaskScheduler [2.0.3] Perl extension for managing Win32 jobs scheduled
    via Task Scheduler
    PPM>

  3. Wenn ich Active perl nutzen würde hääte ich das schon versucht, ich verwende aber Strawberry Perl (auf Win7 64Bit).

  4. Hallo,

    StrawberryPerl hat auch einen PPM-Client (wenn auch nur einen rudimentären, der nicht so viel kann wie das ActiveState-PPM). Der Ausschnitt, den ich oben gepostet habe, stammt aus einer StrawberryPerl-Installation unter Windows 7 (allerdings 32bit).

    – Renée

  5. Das war mir nicht klar, danke.
    Ist es denn sinnvoll Packete sowohl aus dem CPAN als auch via PPM zu installieren, kommen die sich da nicht irgendwann mal in die quere?

  6. Hallo,

    ich bevorzuge die Methode, die Du auch schon versucht hast: Installation mit CPAN (ich benutze dafür „cpanminus“). In Fällen wie diesen hier, installiere ich die Module aber auch mal mit PPM. Das ist mir aber erst dreimal passiert.

    In die Quere kommen die sich nicht, da beides nach C:\strawberry\perl\site\lib installiert wird. D.h. wenn mit CPAN ein Update für ein Modul installiert wird, wird das alte dort überschrieben.

    Bisher hatte ich noch keine Probleme.

    – Renée

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.