Riech mal wie ich riech
hör mal wie ich stodda
ich bin einer von euch, Mensch
ich bin doch kein Robodda.
(Dendemann – O Robota)

Ich muss etwas erklären, und eigentlich ist es dafür schon fast zu spät. Am 27. Januar 2016 habe ich ein kleines Wesen in die Welt gesetzt, welches seither mein Leben bereichert. Die Rede ist von @robodda, meinen Twitter-Roboter. Dieses Dings hat schon für einige Verwirrung gesorgt, daher ist es allerhöchste Eisenbahn, etwas Klarheit zu schaffen. Das Wichtigste, was zu sagen ist: Ich bin @dasaweb und nicht @robodda! Ich schreibe nicht persönlich unter diesem @robodda-Account. Gut, verwand ist der Kleine schon mit mir, so ähnlich wie Kinder mit einem verwand sind. Aber ein Kind ist er auch nicht, er ist einfach nur ein Roboter. Präzise müsste man sagen ein „Bot“, was Wikipedia folgendermaßen definiert:

Unter einem Bot (von englisch robot „Roboter“) versteht man ein Computerprogramm, das weitgehend automatisch sich wiederholende Aufgaben abarbeitet, ohne dabei auf eine Interaktion mit einem menschlichen Benutzer angewiesen zu sein.

So sieht es aus. Der @robodda ist ein Computerprogramm, auf welches ich im laufenden Betrieb keinen Einfluss nehme, das eigenständig Tweets veröffentlicht, Nutzern folgt und entfolgt, Tweets anderer favorisiert und auf sie antwortet usw. Er verhält sich also fast wie ein normaler Twitterer. Das ist jedenfalls das hehre Ziel. Und die Verwandschaft zu mir besteht darin, dass er sich aus meinen bisher veröffentlichten Tweets bedient, sich daraus Textbausteine generiert und aus diesen Textbausteinen seine eigenen Tweets bastelt. Klar, ich leiste eine Art Erziehungsarbeit, in dem ich die Algorithmen, die sein Verhalten bestimmen, immer wieder anpasse und weiter optimiere, damit er immer mehr meinen Vorstellungen von einem guten Bot entspricht. Sonst ist er aber wirklich ein eigenständiges Wesen.
Diese Klarstellung, dass ich nicht der Bot bin, ist wirklich wichtig. Denn es kann schon mal sein, dass so ein Bot verbal Amok läuft, wie Microsoft in den letzten Wochen mit seiner Kreatur „Tay“ schmerzlich erfahren musste. Und auch mein kleiner Bot ist nicht so unschuldig wie er zunächst anmutet. Ein Beispiel:

Dann REP-Wahlwerbung im ersten Semester: Nicht im Weg stehen.
— Robodda (@robodda) March 24, 2016

Oder auch der hier:

GLS, ihr Pisser!
— Robodda (@robodda) February 27, 2016

Aber eigentlich ist es unfair, solche Ausrutscher als erstes zu zitieren, denn in der Regel ist das Kerlchen doch recht putzig und hier und da durchaus kreativ. Beispiele:

Diese Sache mit dem Hinhalten der anderen Wange finde ich ja gut, ich bin wach.
— Robodda (@robodda) January 30, 2016

Alter Schwede, kein Wunder, dass das eben scheiße war.
— Robodda (@robodda) February 16, 2016

Der frühe Vogel ist klein und hat Rückenwind.
— Robodda (@robodda) April 11, 2016

Manchmal wird er geradezu philosophisch:

Eine Frage treibt mich um: „Wann bin ich hier auf der Metaebene.“
— Robodda (@robodda) March 9, 2016

Ich bin aber erst recht!
— Robodda (@robodda) March 20, 2016

Der damit gesicherte Rechner ist immer noch nicht mal metaphorisch.
— Robodda (@robodda) February 3, 2016

Ich mag ihn, und ich hatte ja neulich schon mal erwähnt, dass man auch zu Dingen eine Beziehung aufbauen kann. Dazu müssen sie sich noch nicht einmal menschlich verhalten, aber wenn sie menschliche Züge haben können wir uns kaum dagegen wehren. Den @robodda wieder abzuschalten würde sich zum jetzigen Zeitpunkt ziemlich falsch anfühlen. Außer der Wind dreht und es passiert das, wovor viele irgendwie Angst haben:

Quelle: http://xkcd.com/1646/

„I bet it’s not too hard“. Dachte ich mir auch, nachdem ich über den Bot von @grindcrank (darf ich vorstellen, der @grindbot!) inspiriert wurde und dann den Artikel von @dasnuf über ihren @nufbot gelesen hatte. Ja, es gibt noch mehr Bots da draußen, ziemlich viele sogar. Und eine ganze Gruppe davon basieren auf dem gleichen Code, den ich schließlich auch verwendet habe. Es gibt auch andere, vermutlich intelligentere, wie den Account @deepdrumpf zum Beispiel, aber ich hatte mit @grindcrank jemanden an der Hand, bei dem ich wusste, dass er mir zur Not unter die Arme greifen kann. Mein Ziel war außerdem, das kleine Wesen auf meinem Raspberry Pi zum Leben zu erwecken, und speziell dazu habe ich kein Tutorial gefunden. Falls es dich interessiert folgt also hier eine grobe Anleitung zur Installation eines Twitter-Bots auf dem Raspberry Pi:

Der Code: twitter_ebooks
Der ganze Code basiert auf der Bibliothek , die man hier auf Github finden kann. Sie enthält den ganzen Code, der die Kommunikation mit Twitter übernimmt. Einzig das Verhalten des Bots muss sich jeder selbst stricken, ein Grundgerüst findet man allerdings auch hier: ebooks_example. Ich komme später noch kurz auf meine Anpassungen zu sprechen.
Angefangen hatte ich mit diesen beiden Tutorials (1 & 2), die mich letztendlich aber nicht wirklich ans Ziel gebracht haben. Immerhin konnten sie den Weg grob vorzeichnen.
Twitter-Account und Twitter-App
Als erstes braucht man für seinen Bot natürlich einen eigenen Twitter-Account. Damit dieser Account auch dann vom Bot über die Twitter-Schnittstellen bedient werden kann muss eine Twitter-App angelegt werden. Dazu loggt man sich bei Twitter mit dem Bot-Account ein und erstellt dann unter https://apps.twitter.com/ eine neue App für das Tierchen. Einfach durchklicken. Am Ende bekommt man die Schlüssel, die man später für die Authentifizierung benötigt (Consumer Key, Consumer Secret, …).
Installation auf dem Raspberry Pi
Ich skizziere nur kurz und grob den Weg, aber für den mitdenkenden Leser sollte das genügen, um selbst einen Bot zum Laufen zu bringen. Zunächst brauchen wir Ruby, was für mich auch Neuland war.

sudo apt-get install ruby
sudo apt-get install ruby1.9.1-dev
sudo gem install twitter_ebooks

Das hat allerdings nicht geklappt:
ERROR: Error installing twitter_ebooks:
twitter_ebooks requires Ruby version > 2.1
Ich musste Ruby updaten und habe dazu dieses Shell-Skript hier heruntergeladen und ausgeführt (wichtig: ausführen ohne sudo). Nach etwas weniger als 30 Minuten war Ruby dann in der passenden Version installiert, wie eine Abfrage mittels
ruby –version
zeigte. Weiter ging es dann mit:

gem install twitter_ebooks
gem install bundler
git clone https://github.com/mispy/ebooks_example.git
cd ebooks_example
bundle install

Die heruntergeladenen Files habe ich dann in einen Ordner ~/www/robodda geschoben. Dort lag dann auch die Datei bots.rb, die das Verhalten des Twitter-Bots steuert. Die Datei muss man an seine Bedürfnisse anpassen, vor allem müssen Username, Consumer Key und Consumer Secret (aus der Twitter-App) eingetragen werden. Anschließend führt man
ebooks auth
aus und macht einfach sorgfältig, was das Tool einem sagt (URL aufrufen, Authentifizierungs-Code kopieren, in die bots.rb eintragen, …).
Hat das geklappt will der Bot mit den Tweets aus dem persönlichen Twitter-Archiv gefüttert werden. Ich war mir sicher, dass ich dazu in meinem Twitter-Profil das Archiv anfordern, herunterladen und einbinden muss, aber es ist noch viel einfacher:
ebooks archive DEINTWITTERNAME corpus/DEINTWITTERNAME.json
ebooks consume corpus/DEINTWITTERNAME.json
Es ist auch möglich, mehr als einen Twitter-Account dem Bot als Textbasis zu verfüttern, das geht dann folgendermaßen:
ebooks archive DEINTWITTERNAME corpus/DEINTWITTERNAME_1.json
ebooks archive DEINTWITTERNAME corpus/DEINTWITTERNAME_2.json
ebooks consume-all DEINTWITTERNAME corpus/DEINTWITTERNAME_1.json corpus/DEINTWITTERNAME_2.json
Das ganze sollte man regelmäßig neu laufen lassen, damit der Bot auch immer die aktuellen Tweets bekommt. Am besten die Kommandos also in ein Shell-Skript packen und per Crontab ab und zu ausführen.
Bot starten
Der Bot kann jetzt einfach per
ebooks start >> robodda.log
gestartet werden. Allerdings stirbt er dann, sobald man das Terminal-Fenster schließt. Daher habe ich ihn als Dienst eingerichtet. Dazu legt man sich eine Datei in der Art /etc/init.d/robodda an und kopiert in etwas so einen Inhalt hinein:

#! /bin/sh
### BEGIN INIT INFO
# Provides: ebooks
# Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Twitter-Bot @robodda
# Description:
### END INIT INFO

case „$1“ in
start)
echo „Hauche dem @robodda Leben ein!“
# Starte Programm
cd /home/pi/www/robodda; /home/pi/.rbenv/shims/ebooks start >> /home/pi/www/robodda/robodda.log &
;;
stop)
echo „Der kleine @robodda wird eingeschl채fert…“
# Beende Programm
killall ebooks
;;
restart)
echo „Der kleine @robodda wird wiederbelebt…“
# Beende Programm und starte es gleich wieder
killall ebooks
cd /home/pi/www/robodda; /home/pi/.rbenv/shims/ebooks start >> /home/pi/www/robodda/robodda.log &
;;
*)
echo „Benutzt: /etc/init.d/robodda {start|stop|restart}“
exit 1
;;
esac

exit 0

Jetzt kann man den kleinen Bot folgendermaßen starten, stoppen oder resetten:
sudo /etc/init.d/robodda start
sudo /etc/init.d/robodda stop
sudo /etc/init.d/robodda restart
Das hat bei mir anfangs auch gut funktioniert, aber mittlerweile schafft es der Bot so nicht, mehr als einen Tweet anzusetzen. Er läuft zwar noch, bleibt aber stumm. Daher habe ich ihn im Moment einfach in einer Screen-Session laufen. Nicht so elegant, weil ich ihn so nach einem Reboot des Raspberry Pi immer manuell neu starten muss, dafür läuft aber aber stabil. Auch was wert.
Bot erziehen
Wichtig ist es, das Verhalten des Bots nach und nach an die eigenen Vorstellungen anzupassen. Also wann und wie viel twittert er, wann soll er jemandem folgen, wie viel Herzchen verteilt er, wie stark lässt er sich auf Diskussionen ein usw. Dieses Verhalten wird in der Datei bots.rb konfiguriert. Mir hat @grindcrank mit seiner Botdefinition einen sehr guten Ausgangspunkt gegeben, vielen Dank an dieser Stelle nochmal! Ich habe dann vor allem noch diverse Wahrscheinlichkeiten angepasst und dem Kleinen beigebracht, nachts doch bitte zu schlafen und tagsüber nicht ganz so hyperaktiv zu sein wie der @grindbot. Ich drehe immer wieder hier und da an ein paar Schräubchen, aber es ist wie im echten Leben, man hat immer noch etwas auszusetzen. Im Großen und Ganzen bin ich aber mittlerweile ganz zufrieden.
Es wird.