Open Source im professionellen Einsatz
Linux-Magazin 09/2010
© akai, Photocase.com / Maksim Tselishchev, 123RF.com

© akai, Photocase.com / Maksim Tselishchev, 123RF.com

Börsenkurs-Alerting im Eigenbau

Tierische Kurssprünge

Ein in Perl geschriebenes Pidgin-Plugin ignoriert dröge Börsentage, an denen die Kurse stillstehen, aber schlägt per Instant Message Alarm, falls die Aktien anfangen Achterbahn zu fahren.

822

Der Instant-Messenger-Client Pidgin [2] läuft nicht nur auf mehreren Betriebssystemen, sondern unterstützt auch eine Vielzahl IM-Protokolle: Ob Yahoo oder MSN, ob Google Talk oder IRC - das freie Pidgin bringt sie alle unter einen Hut und vereinfacht die Kommunikation mit Online-Freunden, die unterschiedliche Angebote nutzen. Pidgins Plugin-Architektur trägt maßgeblich dazu bei, dass der Tausendsassa mit neu auftauchenden oder sich ändernden Protokollen mithält und seinen funktionellen Abdeckungsradius stetig erweitert.

Dabei ist es nicht einmal notwendig, Plugins in Pidgins Muttersprache C zu schreiben und als Shared Libs bereitzustellen. Auch in Hochsprachen wie Perl geschriebene Skripte bindet er klaglos ein. Falls sie mit Pidgins Glib-basierter Eventloop zusammenarbeiten, dürfen sie sogar langwierige Operationen wie das Einholen von Webseiten ausführen, ohne dass Pidgins grafische Oberfläche zu ruckeln anfängt.

Es erscheint zunächst verrückt, dass ein C-Programm zusammen mit einem Perl-Skript im Springseiltakt in derselben Eventschleife hüpft. Wer sich aber erinnert, dass auch Perl letztlich nur ein Abstraktionslayer über einer C-Schicht ist und deshalb genauso gut Events einhängen und empfangen kann, dem erschließt sich die Logik.

Alarm bei Achterbahnfahrt

Das hier vorgestellte Pidgin-Plugin zeigt sich zunächst nicht, nimmt aber in regelmäßigen Abständen Kontakt mit einem Aktienticker-Service auf. Mit dessen Hilfe schaut es, ob eines der in einer Konfigurationsdatei abgelegten Papiere anfängt wild zu steigen oder kräftig an Wert zu verlieren. Tritt dies ein, öffnet das Plugin ein Kommunikationsfenster zum eingeloggten User nach Abbildung 1 und zeigt die Gesamtliste aller überwachten Aktien an, samt den einzelnen prozentualen Tagesänderungen.

Abbildung 1: Der Aktienmarkt-Wecker alarmiert den Anleger, weil die Google-Aktie um mehr als 2 Prozent gestiegen ist.

Der User gibt in der Konfigurationsdatei nach Abbildung 2 vor, welche Tickersymbole ihn interessieren und ab welcher prozentualen Änderung er einen Weckruf wünscht. Bei Zeilen, die lediglich das Aktienkürzel und keine Prozentzahl vorgeben, nimmt das Plugin automatisch 2 Prozent Toleranz an.

Abbildung 2: In der Yaml-Datei setzt der User bestimmte Aktien auf eine Beobachtungsliste und gibt bei Bedarf Prozentpunkte vor.

Simple Erweiterung

Das Plugin in Listing 1 gestaltet sich mit 74 Zeilen recht simpel. Pidgin lädt es, falls das entsprechende Perl-Skript mit einer »pl«-Endung ausführbar im richtigen Verzeichnis liegt und der User es im Plugin-Menü konfiguriert hat (siehe Abschnitt "Installation").

Listing 1:
»pidgin-stockwatch.pl«

01 #!/usr/local/bin/perl -w
02 use strict;
03
04 use Pidgin;
05 use lib local::lib;
06 use Glib;
07 use WatchQuotes;
08
09 our %PLUGIN_INFO = (
10   perl_api_version => 2,
11   name        => "Pidgin Stockwatch",
12   summary     => "Stock Alert via IM",
13   version     => "1.0",
14   author      => "Mike Schilli " .
15                  "<m@perlmeister.com>",
16   load        => "plugin_load",
17   unload      => "plugin_unload",
18 );
19
20 our $USER     = "mikeschilli";
21 our $PROTOCOL = "prpl-yahoo";
22
23 our $WATCH_QUOTES = WatchQuotes->new();
24
25 ###########################################
26 sub plugin_init {
27 ###########################################
28   return %PLUGIN_INFO;
29 }
30
31 ###########################################
32 sub plugin_unload {
33 ###########################################
34   my($plugin) = @_;
35
36   Purple::Debug::info("stockwatch",
37       "Plugin unloaded.n");
38
39   1;
40 }
41
42 ###########################################
43 sub plugin_load {
44 ###########################################
45   my($plugin) = @_;
46
47   Purple::Debug::info("stockwatch",
48       "Plugin loaded.n");
49
50   $WATCH_QUOTES->init();
51   $WATCH_QUOTES->watch( &quotes_update );
52 }
53
54 ###########################################
55 sub quotes_update {
56 ###########################################
57     my($msg) = @_;
58
59     Purple::Debug::info("stockwatch",
60         "Updating Quotes.n");
61
62     my $account = Purple::Accounts::find(
63         $USER, $PROTOCOL);
64
65     my $conv = Purple::Conversation->new(
66         1, $account, $USER);
67
68       # user not online?
69     return unless defined $conv;
70
71     $conv->get_im_data->write(
72         $PLUGIN_INFO{name}, $msg,
73         0, time );
74 }

Das Plugin muss die vom Pidgin-API vorgeschriebenen Callbacks »plugin_init()« und »plugin_load()« definieren. Ersteres springt Pidgin an, um Informationen über das Plugin einzuholen und es später im Menü »Tools | Plugins« anzuzeigen.

Der Zocker entscheidet per Mausklick, ob er das Plugin aktivieren möchte. Tut er dies, kommt der Callback »plugin_load« ab Zeile 43 zum Zug, der die Aufgaben des Plugins definiert. Deaktiviert ein entmutigter Anleger das Plugin wieder, erledigt es in »plugin_unload()« eventuell noch letzte Aufräumarbeiten, bevor Pidgin es aus dem Speicher wirft.

Das weiter unten beschriebene Modul »WatchQuotes« liest die Konfigurationsdatei, sobald Zeile 50 im Plugin dessen »init()«-Methode aufruft. Zeile 51 startet anschließend den kontinuierlich arbeitenden Überwachungsprozess mit dem Aufruf der Methode »watch()«. Ihr überreicht das Plugin-Skript eine Referenz auf den ab Zeile 55 definierten Callback »quotes_update«, der eine ihm übergebene Nachricht in eine IM-Konversation verpackt und dem angenehm oder unangenehm überraschten User schickt.

Dazu findet die Methode »find()« eines »Purple::Account«-Objekts in den Zeilen 62 und 63 den hoffentlich eingeloggten User, die Zeilen 65 und 66 bauen zu diesem eine Konversation auf, die sich in einem Objekt der Klasse »Purple::Conversation« manifestiert. Geht dabei etwas schief, zum Beispiel weil der festgelegte User gar nicht auf dem angegebenen Service eingeloggt ist, bricht Zeile 69 ab und die Nachricht bekommt nie das Licht eines turbulenten Börsentages zu sehen.

Geht aber alles gut, schickt die in Zeile 71 aufgerufene »write()«-Methode die Nachricht los und legt als Absender willkürlich den Namen des Plugins fest. Der letzte Parameter setzt mit der Perl-Funktion »time()« noch die aktuelle Uhrzeit, die Pidgin neben jeder Nachricht anzeigt.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Hingucker für Spekulanten

    Das eine Panel bringt pfiffige Applets mit, das andere hat eine spektakuläre Optik - aber alles Gute ist selten beisammen. Als Abhilfe bietet sich Perlpanel an. Plattformunabhängig ist es ganz nach dem eigenen Geschmack mit selbst geschriebenen Perl-Applets erweiterbar. Als Beispiel dient ein Börsenticker.

  • Seid umschlungen, Millionen!

    Das Perl-Skript »dagobert« zeigt auf Kommando die aktuellen Vermögensverhältnisse seines Besitzers an. Es rechnet den Inhalt mehrerer Konten und Aktiendepots zusammen und gestattet es dem Anwender, eigene Plugins einzuhängen.

  • Hört die Signale

    Mit etwas Perl ordnet Pidgin - der Tausendsassa unter den Instant-Messaging-Clients - verschiedenen Kommunikationspartnern unterschiedliche Klänge zu und spielt sie zu eintreffenden Nachrichten ab.

  • Kurvendiskussion

    Zahlenreihen taugen vielleicht für gelangweilte Buchhalter, nicht aber für Programmierer. Die bevorzugen Grafiken, besonders wenn sie den Wertverlauf ihres Aktienportfolios beschreiben. Das vorgestellte Perl-Skript zeichnet Turmdiagramme und hilft die Performance im Auge zu behalten.

  • Perl-Snapshot

    Passend zum Titelthema: Mike
    Schilli nutzt Mouse und Moose, um
    Distributionsrepositories abzufragen.

comments powered by Disqus

Ausgabe 06/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.