Open Source im professionellen Einsatz
Linux-Magazin 01/2011
© Paul Georg Meister, Pixelio.de

© Paul Georg Meister, Pixelio.de

Perl-Skript analysiert Konversationsinhalte beim Chat

Der Lauscher an der Wand

Ein Lausch-Bot in einem IRC-Kanal springt bei bestimmten Schlüsselwörtern an und benachrichtigt einen definierten User via Instant Messaging über das Gehörte.

673

Open-Source-Projekte wie Catalyst bieten Support über IRC-Kanäle an, in denen Fachleute auf Nutzeranfragen warten. Allerdings stört andauerndes IRC-Gedudel die Konzentration der Helfer, wenn sie nebenbei arbeiten. Oft dreht sich die Diskussion auch um nebensächliche Dinge. Der heute vorgestellte Perl-Bot lauscht auf einem IRC-Kanal und benachrichtigt seinen Herrn und Meister, falls bestimmte Schlüsselwörter fallen.

Der erste Teil der Aufgabe, die Erstellung eines IRC-Bot, geht sehr einfach von der Hand, denn das schon einmal in [2] vorgestellte CPAN-Modul Bot::BasicBot stellt ein einfach erweiterbares Framework für IRC-Bots aller Art bereit. Doch wie erregt der Bot die Aufmerksamkeit seines in tiefe Gedanken versunkenen Users?

Chat über Web-API

Instant Messaging mit aufpoppenden Dialogfenstern bietet sich an, und der Allround-Client Pidgin offeriert die gängigen Protokolle wie Yahoo Messenger, Google Talk, AIM oder MSN.

Vor einiger Zeit öffnete Yahoo seinen Messenger-Service über ein Web-API [3], auf dem sich der User zunächst einloggt und mittels HTTP-Requests Nachrichten mit anderen Yahoo-Messenger-Nutzern austauscht. Das vorgestellte Bot-Skript »irc2ym« klinkt sich in einen IRC-Kanal ein, wartet zunächst und lauscht, meldet und leitet weiter (Abbildungen 1 bis 3).

Abbildung 1: Der Bot »ymbot« verhält sich still, da niemand ein Schlüsselwort erwähnt hat.

Abbildung 2: Ein IRC-Teilnehmer erwähnt »cpan« und der Flüsterer benachrichtigt den User.

Abbildung 3: Der Bot hat die Nachricht an den Yahoo-Messenger-User weitergeleitet.

Erwähnt einer der Chat-Teilnehmer ein Schlüsselwort aus der Datei »~/.irc2ym-keywords« (Abbildung 4), wirft der Bot das Skript »ymsend« an, das sich auf dem Messenger-Web-API einloggt und die aufgeschnappte Textnachricht an einen voreingestellten Messenger-Account weiterleitet. Dies alarmiert den in Gedanken versunkenen User, der seine Arbeit unterbricht, sich dem IRC-Kanal zuwendet und dort sein Fachwissen zur allgemeinen Verfügung stellt.

Abbildung 4: Die Liste der Schlüsselwörter, auf die der Flüsterer anspringt.

Nachrichten ausschnüffeln

Listing 1 leitet eine Klasse »YMBot« von der Basisklasse »Bot::BasicBot« ab und überlädt deren Methode »said()«, die der Bot immer aufruft, wenn ein User in einem IRC-Kanal etwas zum Besten gibt. Der zweite Parameter ist eine Datenstruktur, die unter dem Schlüssel »who« den Benutzernamen des Users und unter »body« den Text der Nachricht führt.

Listing 1:
»irc2ym«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use local::lib;
04
05 ###########################################
06 package YMBot;
07 ###########################################
08 use base qw( Bot::BasicBot );
09 use FindBin qw($Bin);
10
11 my $ymsend       = "$Bin/ymsend";
12 my($home)        = glob "~";
13 my $KEYWORD_LIST_FILE =
14                   "$home/.irc2ym-keywords";
15 my @KEYWORD_LIST = ();
16
17 keyword_list_read();
18
19 ###########################################
20 sub said {
21 ###########################################
22   my($self, $data) = @_;
23
24   if( keyword_match( $data->{body} ) ) {
25     my $rc = system($ymsend,
26      "$data->{who} said: '$data->{body}'");
27     warn "$ymsend failed: $!" if $rc;
28   }
29
30   return $data;
31 }
32
33 ###########################################
34 sub keyword_list_read {
35 ###########################################
36   if( !open FILE, "<$KEYWORD_LIST_FILE" ) {
37     warn "$KEYWORD_LIST_FILE not found";
38     return;
39   }
40
41   while(<FILE>) {
42     chomp;
43     s/#.*//;
44     next if /^s*$/;
45     push @KEYWORD_LIST, $_;
46   }
47   close FILE;
48 }
49
50 ###########################################
51 sub keyword_match {
52 ###########################################
53   my($said) = @_;
54
55   for my $regex (@KEYWORD_LIST) {
56     return 1 if $said =~ /$regex/i;
57   }
58   return 0;
59 }
60
61 ###########################################
62 package main;
63 ###########################################
64 use Bot::BasicBot;
65
66 my $bot = YMBot->new(
67   server    => "irc.freenode.com",
68   channels  => ["#ymtest"],
69   nick      => "ymbot",
70   name      => "Relay to Y!M",
71   charset   => "utf-8",
72 );
73
74 $bot->run();

In diesem Callback ruft der Bot in Zeile 24 die weiter unten definierte Funktion »keyword_match()« auf, die den Nachrichtentext mit einer Liste vorher eingelesener Schlüsselwörter aus der Datei »~/.irc2ym-keywords« vergleicht. Das Skript liest deren Zeilen zu Beginn in den globalen Array »@KEYWORD_LIST« ein.

Passt einer der im Array »@KEYWORD_LIST« gespeicherten regulären Ausdrücke, triggert Zeile 25 das im selben Verzeichnis liegende Skript »ymsend«. Dieses nimmt den Nachrichtentext auf der Kommandozeile entgegen, loggt sich auf dem Web-API ein, führt einige Autorisierungsschritte nach dem Oauth-Protokoll aus und schickt schließlich den Nachrichtentext an den in der Variablen »$recipient« kodierten User.

Die Interaktion mit dem Yahoo-Web-API erfordert vom Skript einige Bocksprünge mit dem voreingestellten Messenger-User, dessen Passwort sowie einem auf [developer.yahoo.com] einzuholenden API-Key und einem "Shared Secret" für die Applikation.

Linux-Magazin kaufen

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

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Der Musikstreaming-Service Spotify pumpt gegen eine monatliche Gebühr Musik auf den Desktop und aufs Smartphone. Noch mehr Groove hat, dass Perl-Hacker Michael Schilli per Oauth-geschütztem Web-API seine Spotify-Playlisten für die Ewigkeit archiviert.

  • Perl-Snapshot

    Ist Perlmeister Schilli unterwegs, weiß er gern, was daheim abgeht. Mit zwei Skripten bekommt er es hin, dass die angeschaffte Billigkamera über das Tumblr-API zyklisch Schnappschüsse auf der Micro-Blogplattform ablegt. Tierisch schick, diese Überwachung.

  • Perl-Snapshot

    Mit einer chinesischen Guillotine und einem Einzugsscanner bewaffnet geht Perlmeister Michael Schilli diesmal seinen Büchern an den Leim. Die Grundlage seiner bibliophoben Tat liefert Google Drive, das mit 5 GByte genug Speicherplatz für ein Online-PDF-Lager mit eingescannten Büchern bietet.

  • Openauth und Archivierung fürs IM in Sugar CRM

    Der Artikel im Linux-Magazin beschreibt, wie die neue Cloud-API in Sugar CRM Dropbox und Pidgin nutzen kann, um die Instant-Messaging-Kommunikation innerhalb des Customer Relationship Managements abzulegen und sie einem Kontakt oder Kunden zuordnet. Dieser Online-Plus-Artikel beschreibt, wie dabei Open Auth und die Archivierung der Dropbox-Inhalte von statten geht.

  • Google lädt zum Test von OAuth 2.0

    Im OAuth 2.0 Playground können Programmierer das Verfahren zur Authentifizierung im Web testen.

comments powered by Disqus

Stellenmarkt

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