Perl-Programmierung: Net::OSCAR
Allgemeines zu Net::OSCAR
BearbeitenDas Perl-Modul Net::OSCAR stellt dem Programmierer eine einfache Möglichkeit zur Verfügung, mit dem standardisierten Instantmessagingprotokoll OSCAR, welches unter anderem von ICQ und AIM verwendet wird zu arbeiten. Anwendungsmöglichkeiten sind beispielsweise ein eigener Client oder Bots. Das OSCAR-Protokoll funktioniert nicht Peer2Peer-basiert. Jeder Client braucht einen OSCAR-Kompatiblen Account um mit dem Netzwerk kommunizieren zu können. Mit dem Account und einem gültigen Passwort kann sich der Client über einen Loginserver in das Netzwerk einwählen. Innerhalb des Netzwerks ist jeder andere Teilnehmer über eine neunstellige Identifikationsnummer (UIN) erreichbar.
Das ClientObjekt Net::OSCAR
BearbeitenUm mit Net::OSCAR arbeiten zu können müssen wir das Modul installiert haben (vgl. Benutzen des CPAN) und es anschliessend in unseren Code einbinden:
#!/usr/bin/perl
use strict;
use warnings;
use Net::OSCAR qw(:standard);
Anschließend müssen wir ein Net::OSCAR-Objekt erzeugen. Es stellt sämtliche Methoden und Attribute bereit, die nötig sind um mit dem Netzwerk zu arbeiten:
my $client = Net::OSCAR->new();
Der Login
BearbeitenDer nächste notwendige Schritt besteht darin, eine Verbindung zu einem Loginserver aufzubauen und ihm die Logindaten zu übermitteln. Diese Daten können fix im Programm gespeichert sein, werden meist jedoch praktischer durch eine Usereingabe festgelegt. Um sich letztendlich beim Server anmelden zu können stellt Net::OSCAR die Methode signon($UIN,$passwort) zur Verfügung. Bei der Eingabe der UIN ist es immer praktisch bereits beim einlesen eine Überprüfung vorzunehmen ob die Nummer gültig ist:
while(1)
{
print "Bitte geben sie die UIN des zu vertretenden Accounts ein:\n";
$uin = <>;
chomp $uin;
last if ($uin !~ /\D/ and length($uin) == 9);
print "Falsche(s) Zeichen!\n" if ($uin =~/\D/);
print "UIN hat falsche Länge!\n" if (length($uin)!=9);
}
Als nächste Schritte werden das Passwort eingelesen und der Login vorgenommen:
print "Bitte geben sie das dazugehörige Passwort ein:\n";
$pw = <>;
chomp $pw;
$client->signon($uin,$pw);
Das Eventsystem
BearbeitenBeim Arbeiten mit einem Instantmessaging-Programm sind wir auf Ereignisse angewiesen, die wir zeitlich sowie ablaufstechnisch nicht steuern können. Beispielsweise eine einkommende Nachricht. Zu diesem Zweck ist das Net::OSCAR-Modul Eventbasiert aufgebaut (vergleichbar mit Gtk2). Für die verschiedenen Ereignisse die während einer OSCAR-Session auftreten können stellt Net::OSCAR verschiedene Methoden bereit, mit denen wir Ereignisse an Subroutinen binden können. ##
Hier eine kleine Liste der wichtigsten Ereignisse um mit Net::OSCAR zu arbeiten:
Callback | Bedeutung |
---|---|
signon_done | Dieses Ereignis wird ausgelöst, wenn ein Login erfolgreich abgeschlossen wurde (interessant für die Überprüfung des Logins) |
im_in | Einkommende Nachricht |
buddy_in | Ein Mitglied der Kontaktliste des eingeloggten Netzwerkmitglieds hat sich eingewählt |
buddy_out | Ein Mitglied der Kontaktliste des eingeloggten Netzwerkmitglieds hat sich ausgewählt |
Jedes Event kann mit der Methode set_callback_<callbackname> (\&subroutine); an eine Routine gebunden werden. Ein kleines Beispiel für das signon_done-Ereignis:
sub login_erfolgreich
{
print "Ich bin da wo ich hinwollte :)\n";
}
$client->set_callback_signon_done(\&login_erfolgreich);
So können wir leicht fehlgeschlagene Logins frühzeitig erkennen und dem User melden.
Nachrichten senden
BearbeitenMit der Methode send_im($empfänger, $message) können wir einem Netzwerkteilnehmer eine Instantmessage zukommen lassen. Ein Beispiel könnte einfacher nicht sein:
$client->send_im(123456789,"Hello World!");
Mit eingehenden Nachrichten umgehen
BearbeitenJetzt kommen wir zum interessanten teil der Sache. Ich möchte hier ein kleines Beispiel coden, in dem eine eingehende Nachricht an den Absender zurückgeschickt und ihm gleichzeitig sein Away-Status mitgeteilt wird
Wie gehen wir mit einkommenden Nachrichten um? Die Voraussetzung hierfür ist natürlich, dass wir das Ereignis im_on an eine Subroutine binden, die die Nachricht für uns verarbeitet:
$client->set_callback_im_in(\&nachricht_kommt);
Danach müssen wir (früher im Code) eine Routine schreiben, die eine Nachricht für uns bearbeitet. Praktischerweise werden allen Funktionen, die durch eine Callbackverbindung mit im_in ausgelöst werden Absender-UIN, Nachricht und Away-Status des Absenders als Parameter mitgegeben.
sub nachricht_kommt
{
my($client, $sender, $message, $away_status) = @_;
my $awaystring = " Du bist gerade Da!";
$awaystring = " Du bist gerade nicht da" if ($away_status);
$client->send_im($sender,$message.$awaystring);
}
Der Logout
BearbeitenWir können unser Net::OSCAR-Objekt mit der simplen Methode signoff() wieder aus dem OSCAR-Netzwerk ausloggen:
$client->signoff();
Weitergehende Informationen
BearbeitenUm mit Net::OSCAR sinnvoll arbeiten zu können ist es nötig, RegEx und das Modul zusammen zu verwenden. Gemeinsam stellen sie ein mächtiges Werkzeug dar und erlauben es intelligente Bots zu schreiben.
Wer noch nie mit einem Instanstmessagingsystem zu tun hatte sollte sich Pidgin, einen OpenSource Instant-Messaging Client anschauen, um einen Einblick darin zu erhalten welche Tätigkeiten eines Menschlichen Users sich wie mit Net::OSCAR nachstellen lassen. Weiterhin ist die komplette Dokumentation des Moduls im CPAN zu empfehlen: Net::OSCAR im CPAN