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

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

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