twibbo:t - Beispiel: Basisinstallation

twibbo:t besteht an sich aus zwei Teil-Prozessen:
Der Collector-Prozess holt die letzten Tweets der User ab denen er selbst folgt. Diese Tweets werden zur späteren Bearbeitung in die Datenbank geschrieben.
Der Worker-Prozess erledigt die eigentliche Arbeit. Er holt die Tweets aus der Datenbank und arbeitet sie anhand seiner Aufgabenliste ab.

Dabei ist die "Arbeitsliste" das eigentliche Herzstück des Bots. In ihr wird definiert auf was der Bot in den Nachrichten reagiert. Er versteht dabei die Tweets sozusagen als Kommandos die von ihm erledigt werden.

Installation

Anforderungen

Dateien entpacken

Die Dateien im Zip-Archiv auf den Webserver entpacken. Dem Ordner "log" Schreibrechte geben (777), wenn Log-Files geschrieben werden sollen.

Für die Funktionsweise des Twitterbots sind die Dateien config.php, ClassDB.php, ClassCollector.php und ClassWorker.php zwingend erforderlich. Sollte kein Autoloader verwendet werden, emfpiehlt es sich die Datei autoloader.php ebenfalls zu verwenden (mehr über Autoloader).

Datenbank installieren

Der Twitterbot benötigt zwei Datenbank-Tabellen in denen Prozessdaten gespeichert werden. Das SQL-File "twibbo.sql" kann einfach z.b. über den phpMyAdmin der MySQL-Datenbank ausgeführt werden.

Damit ist die Installation des Twitterbots abgeschlossen.

config.php

Enthält die Datenbank-Konfiguration. Hier müssen die eigenen Zugangsdaten eingetragen werden:

define('DB_HOST', 'localhost'); define('DB_NAME', 'database_name'); define('DB_USER', 'database_user'); define('DB_PW', 'user_password');

Nach erfolgreicher Installation und einbinden der config.php des Bots kann der Bot einfach instanziert werden:

require_once('config.php'); //beide teil-Przesse instanzieren $TwibboCollector = new ClassTwibboCollector(); $TwibboWorker = new ClassTwibboWorker();

Nun wäre es sinnvoll wenn der Bot zuerst Daten abholt um sie später zu bearbeiten:

$friends = $TwibboCollector->getFriends(); if ($friends != FALSE) { foreach ($friends->user AS $friend) { $tweets = $TwibboCollector->getTweets(strval($friend->screen_name)); foreach($tweets AS $tweet) { $TwibboCollector->saveTweet(intval($tweet->id), strval($tweet->text), strval($friend->screen_name)); } } } else echo 'Sorry, I've no friends.';

Nachdem die Daten in der Datenbank sind kann jetzt der Worker-Prozess die tweets verarbeiten:

$tasks = $TwibboWorker->getTaskList(); $completed_tasks = $TwibboWorker->getCompletedTasks(); if (is_array($tasks)) { foreach ($tasks AS $task) { if (!in_array($task['tweet_id'], $completed_tasks)) $TwibboWorker->findTask($task); } } else echo 'Go chillin\', didn\'t found any task.';

Jetzt ist twibbo:t in seiner Basisversion schon betriebsbereit!

twibbo:t - Beispiel: Dem Bot neue Aufgaben beibringen

twibbo:t ist ein wissbegieriger und lernfähiger kleiner Bot. Er lernt schnell und gern!

Um ihm neue Aufgaben "bei zu bringen" kann einfach Klasse ClassTwibboWorker erweitert werden.
Dazu sind zwei Dinge notwendig, zum einen muss dem Bot in der prepareMessage() mitgeteilt werden auf welches Kommando er reagieren soll. In unseren beispielen haben wir uns für Hashtags entschieden:

private function prepareMessage($message, $author_name) { $message = strval($message); $author_name = strval($author_name); //@reply vorbereiten $tmp = 'via @'.$author_name.': '; //Cut-Tag gefunden if (strpos($message, '#c') !== FALSE) return $tmp.str_replace('#c', '', str_replace($this->command, '', $message)); //Geben-Befehl gefunden if (strpos($message, '#gib') !== FALSE) return 'Ich gebe '.substr($message, strpos($message, '@')); //Wettersuche if (strpos($message, '#weather') !== FALSE) return $this->doWeatherCommand($message, $author_name); //Kein Befehl gefunden, Nachricht zurückgeben return $tmp.$message; }

danach wird die Klasse um eine Funktion erweitert die dann die eigentliche Verarbeitung des Tweets vornimmt. Für das Wetter-Kommando sieht das dann so aus:

private function doWeatherCommand($message, $author_name) { $request_url = 'http://wetter.web.de/cgi-bin/webde/wetter_stadt.pl?NAME=##search_string_##&SUBMIT=Suchen&TYP=0'; //Nachricht zerlegen, Suchwort finden $query_string = str_replace('#weather ', '', substr($message, strpos($message, '#weather '))); $request_url = str_replace('##search_string_##', urlencode($query_string), $request_url); $error_message = '@'.$author.' '.$query_string.' hat heute kein Wetter.'; //ParsR initalisieren, Seite anfragen $parsr = new ParsR(); $parsr->readUri($request_url); $data = $parsr->extractData('compare', ''); if (empty($data[0])) { echo $error_message; } $parsr->setResource($data[0]); $city_name = $parsr->extractData('', ''); $rows = $parsr->extractData('', ''); if (empty($city_name[0]) || empty($rows[0])) { echo $error_message; } //Nachricht zusammenbauen $message = '@'.$author_name.' Wetter für '.$city_name[0].': Temperaturen '.html_entity_decode($rows[10]); $message .= ' - '.html_entity_decode($rows[5]).; $message .= '; Regenrisiko '.html_entity_decode($rows[15]).'; Wind: '; $message .= html_entity_decode($rows[20]).' '.html_entity_decode($rows[25]); return $message; }

Mit diesen zwei kleinen Eingriffen kann der Bot schnell neue Dinge lernen und somit seinen Anwendern mehr Komfort bieten ;)