Bots in Foren
Eines vorweg: die hier vorgestellten Module sind an sich zwar keine Bots (es fehlt die KI), erfüllen aber die gleichen Aufgaben.
Doch wieso sollte man "Bots" realisieren wollen? Ich habe sie damals ins SPBB integriert, weil ich etwas realisieren wollte, was bis
dahin nicht existiert hat. Und heute? Es liegt auf der Hand, sie sollen uns Arbeit abnehmen. In Foren werden oftmals die gleichen
Fragen gestellt und man ist es irgendwann leid, darauf zu anworten. Da ist es doch schön, wenn man jemanden hat, der diese Fragen
stets gutmütig beantwortet, Themen schließt und Benutzer zurechtweist, im Zweifel sogar kurzzeitig oder auf Dauer bannt und das rund
um die Uhr und kostenlos.
Mir geht es in diesem Tutorial um die Grundlagen. Zwar stammen die Codebeispiele aus dem in PHP geschriebenen SPBB, aber in welcher
Sprache und mit welchem Forum ihr diese Anregungen verwirklicht, soll euch trotzdem freistehen.
Ausgangspunkt ist immer der vom Benutzer eingegebene Text. Nach dem Absenden des Formulars wird dieser nach Schlüsselbegriffen durchsucht,
die die Reaktion des "Automatisierungsmoduls" bestimmen.
Zunächst ist es sinnvoll, eine Regelliste zu erstellen, z.B. so:
$beitrag2 = strtolower($_POST[beitrag]);
$wort[1] = substr_count("$beitrag2","hallo"); if ($wort[1]>0) { $begr = 1; }
$wort[2] = substr_count("$beitrag2","$bot_name"); if($wort[2]>0) { $me = 1; }
Nun geht es an die Auswertung:
if(($begr) && ($me)) { $antwort = "Hallo, $user"; }
Der oben stehende Teil durchsucht den Text nach zwei verschiedenen Wörtern: einmal nach "hallo" und einmal nach dem Namen des Moduls,
der vorher natürlich mit $bot_name = "bot"; deklariert werden muss.
Da die Funktion substr_count Groß- und Kleinschreibung unterscheidet, wird in der ersten Zeile der Beitrag vom Formular komplett
in Kleinschreibung umgewandelt. Der Varialenname ist deshalb ein anderer, weil der Beitrag ja nicht Lowercase (durchgehend kleingeschrieben)
gespeichert werden soll.
Der zweite Teil wird nun selber aktiv und formuliert die Antwort für den Fall, dass beide Wörter mindestens einmal im Text gefunden wurden.
Dabei lassen sich die Wörter in der Bedingung durch die Klammern beliebig kombinieren.
Nun stehen wir vor einem Problem. Denn wenn wir die Antwort direkt einfügen, wird die Antwort unseres "Bots" auch sofort erscheinen.
Wenn wir auf die Zeit eines Posts einfach ein paar Sekunden draufaddieren, mag das später zwar nicht auffallen, aber bis dahin ist die
Antwort etwas auffällig.. Also brauchen wir eine Art "Zwischenablage". Beim SPBB sieht das etwa so aus:
if($antwort)
{
$result = mysql_query("INSERT INTO queue (prozess, optionales, o2, o3, o4, o5, o6, o7) VALUES ('$bot_name', '$szeit', '$poster', '$antwort', '$szeit', '62.224.$xip1.$xip2', '$totopic', '$f_id')");
}
Zu den unbekannten Variablen:
- $szeit ist die aktuelle Zeit plus einen Zufallswert zwischen 60 und 600 Sekunden.
- $poster ist der Besucher, der das Formular abschickt.
- $xip1 und $xip2 sind Zufallswerte zwischen 0 und 255, mit denen sich der "Bot" eine IP-Adresse zusammenbaut.
- $totopic ist die laufende Nummer des ausgewählten Themas.
- $f_id ist die laufende Nummer des ausgewählten Forums.
Die Variablen $poster, $toptopic und $f_id oder deren Äquivalente sollten von den entsprechenden Forensystemen schon vorher deklariert werden.
$xip1, $xip2 und $szeit müssen wir selbst erzeugen:
$xip1 = rand(0,255);
$xip2 = rand(0,255);
$szeit = time()+rand(60,600);
Damit hätten wir die Antwort in die Zwischenablage geschickt. Von dort aus muss sie irgendwie in das passende Thema verschoben werden.
Es liegt nahe, sich eine Datei zu schreiben und diese überall zu einzufügen. Das könnte z.B. so aussehen:
$result = mysql_query("SELECT * FROM queue WHERE prozess = '$bot_name' AND optionales < '$zeit'");
while($row = mysql_fetch_row($result))
{
$waits_id = $row[0];
$result1 = mysql_query ("INSERT INTO beitraege (poster, beitrag, zeit, ip, totopic, tofid) VALUES ('$bot_name', '$row[4]', '$zeit', '$row[6]', '$row[7]', '$row[8]')");
$delqueue = mysql_query("DELETE FROM queue WHERE wait_id = '$waits_id' AND prozess = '$bot_name'");
}
Was das nun im Einzelnen bewirkt?
Zunächst werden alle Einträge aus der Ablage geholt, deren Wartezeit ($szeit) abgelaufen ist. Diese werden dann nacheinander "abgefertigt".
$waits_id ist die laufende Nummer des Prozesses in der Datenbank.
$result1 kopiert den Text, der in der Ablage gespeichert ist, in den entsprechenden Thread.
$delqueue löscht den Beitrag aus der Warteschleife.
Damit ist das Grundprinzip abgehakt. Nun gibt es das anfangs erwähnte Problem: die Codebeispiele beziehen sich allein aufs SPBB. Wenn ihr das,
was ihr eben gelesen habt, umsetzen wollt, so habt ihr jede Menge Arbeit vor euch, denn jedes Forum hat seine eigenen internen Variablen
(Foren ID, Topic ID, Formularname usw) und wenn das Forum seine Daten in Textdateien speichert, wir die Sache noch komplizierter.
Mir ist klar, dass viele von euch "Bots" in Foren als unnötige Spielereien ansehen. Aber ich habe gute Erfahrungen gemacht. Ich habe zu
Zeiten des SPBB-Hostingservice drei dieser "Bots" (davon ein Quizbot) parallel eingesetzt, alle hatten eigene Fähigkeiten (neue Themen eröffnen,
Benutzer verwarnen, (zeitlich begrenzt) bannen) und wurden durchaus für echte Benutzer gehalten.