Ich habe es bisher leider noch nicht geschafft, den Beleidigungsbot fertig zu programmieren. Aus aktuellem Anlass würde ich gerne dem allgemeinen Alltagssexismus die Schuld dafür in die Schuhe schieben. Die europäische Flüchtlingspolitik ist auch echt scheiße und überhaupt habe ich heute morgen sehr eklige Dinge aus der WG-Spülmaschine geholt.
Aber das was ich bisher gelernt habe, kann ich schonmal verbloggen. Der Code für den Beleidigungsbot ist für mich eh sehr neu, komplex und relativ lang, daher ist es vermutlich keine so blöde Idee, einen Teil schon vorab zu erklären. Danke Spülmaschine!
Für den Beleidigungsbot habe ich als erstes diese sehr hilfreiche Anleitung von Travis McCrea verwendet. Es müssen nur noch die Variablen verändert werden um einen simplen funktionierenden Bot zu bauen.
Leider ist in dem Artikel nicht alles was passiert detailliert erklärt. Das werde ich in den folgenden Blogposts mal selber versuchen. Dann kann ich mich auch dem Vorwurf entziehen, ich hätte seinen Artikel einfach geklaut – was nämlich stimmt. Aber wir sind hier ja auch in Internetland.
Um was geht es?
Um das Programm wirklich einfach und zugänglich zu erklären, sollte ersteinmal geklärt werden, was IRC überhaupt ist.
IRC steht für Internet Relay Chat und ist ein Chat-System das auf dem IRC protocol beruht. Ein sehr altes aber effizientes Protokoll, welches jedoch auch etwas wacklig ist aufgrund seiner Netzwerktopologie. In Kürze: Zwischen den TeilnehmerInnen besteht immer nur eine Kommunikationsverbindung, was Kapazitäten schont, aber auch unsicher ist, da es keine sogenannten Redundanzen gibt. Das heißt, die Verbindung bricht ab, wenn ein Server mal ausfällt. So etwas wird „netsplit“ genannt und führt dazu, dass einige TeilnehmerInnen eines Channels rausfliegen und die Verbliebenen kichern [Anm.: Ich habe gerade erfahren, dass es sehr viel komplizierter ist. Aber ich finde die Erwähnung, dass Kommunikation, Liebesbeziehungen und Netsplits immer sehr viel komplizierter sind, als es auf den ersten Blick scheint, überflüssig].
Das IRC Protokoll ermöglicht das Chatten in Channels und Querys. Channels können problemlos eröffnet und wahlweise registriert werden. Beliebig viele TeilnehmerInnen können einen Channel betreten und dort miteinander chatten. Querys können von UserIn zu UserIn private Kommunikation ermöglichen.
Ich selber bin in einigen IRC-Channeln ab und zu oder regelmäßig unterwegs. Zum Beispiel im Channel zu diesem Blog (##fionalerntprogrammieren, ich bin nicht immer dort, freue mich aber auf BesucherInnen und Austausch im Channel, sonst sind da meistens ein paar harmlose Lurker/Trolle). Insbesondere in der Hacker- und Nerd-Szene ist IRC recht beliebt. Ich habe eine Weile darüber nachgedacht, woran das wohl liegt, aber die schönste Liebeserklärung kam von Nerds in einem IRC-Channel selbst:
15:38 <Fotografiona> man kann aber verschlüsselt kommunzieren oder? 15:38 <erlehmann> naja, niedrige barriere, gibt quasi überall clients, keine absichtlichen inkompatibilitäten. 15:38 <plomlompom> Fotografiona, es ist so schön text-only / minimalistisch. 15:38 <erlehmann> hmmnaja. zum server schon über SSL. 15:39 <erlehmann> fotografiona, das einzige chat-protokoll, dass ähnliche vorteile von verbreitung und unterstützung durch unendlich viele clients hat ist XMPP und das ist sehr viel schwieriger zu implementieren. 15:40 <plomlompom> Ja, ein IRC-Client ist recht einfach zu schreiben. 15:40 <erlehmann> und max-nachrichtenlänge sind 512 bytes, nicht 140 zeichen wie bei SMS-twitter 15:41 <plomlompom> IRC ist ein Hacker-Traum, offen und dezentral, und leicht zu implementieren. 15:41 <erlehmann> es gibt viele irc-clients und dies hier ist meiner #http://blog.dieweltistgarnichtso.net/uii-a-minimalist-irc-client 15:41 -oiler_in|#nodrama.de- uii – a minimalist IRC client | Die Welt ist gar nicht so. <http://blog.dieweltistgarnichtso.net/uii-a-minimalist-irc-client> 15:41 <erlehmann> plomlompom „leicht zu implementieren“ mein arsch 15:41 <moeffju> Damals gab es auch noch keine Geheimdienste. 15:42 <Fotografiona> verstehe komplett 15:42 <Fotografiona> ich nehm das als zitat
Aber wie so oft wäre es vermutlich am Besten, wenn ihr einfach mal selber IRC ausprobiert, um euch ein Bild zu machen. Dafür könnt ihr euch einen Client installieren, also ein Programm mit welchem ihr am IRC teilnehmen könnt, oder über einen Browser chatten, so wie damals bei knuddels! Die meisten Channels die ich kenne laufen auf dem freenode-Server. Ihr könnt beispielsweise mal in den #debian oder #linux channel reinschauen oder in meinen (nicht die zwei Rauten vergessen!). In den genannten Channels wird allerdings nicht allzu viel los sein. Womöglich werden dort aber hin und wieder Äußerungen nach einem bestimmten redundanten Muster hineingeschrieben – von einem Bot.
Was wollen wir?
In IRC-Channels gibt es manchmal einen oder mehrere Bots, welche z.B. die Überschrift eines Links ausgeben, falls jemand diesen in den Chat postet. Andere Bots regeln den Rausschmiss von UserInnen und manche sind nur da, um andere Leute zu beleidigen und Zwietracht zu säen. Bots sind genauso wie du und ich Mitglieder des Channels, aber automatisiert durch ein Skript, beispielsweise in Python. Der Bot muss also in der Lage sein, sich über das IRC Protokoll mit dem Channel zu verbinden und dort entweder nur zu lauern oder eine Handlung auszuführen.
Ich möchte einen Bot bauen, der vor allem das mit dem Zwietracht macht. Um besonders fies zu sein und möglichst viel Schaden anzurichten, habe ich mir verschiedene Handlungen und Eigenschaften des Bots überlegt und versucht, diese in Code umzusetzen. Bis ich damit fertig bin, wird es noch dauern, bis dahin reicht ein Bot, der in einen Channel hineingeht und dort kollektiv die Leute beleidigt.
Was programmieren wir?
Der Code beginnt wieder mit einer she-bang-Zeile. Danach werden ein paar Module importiert, dann die Variablen definiert und anschließend kommen einige socket-Funktionen und zum Ende ein paar Schleifen.
#!/usr/bin/env python
import sys
import socket
import string
HOST="irc.freenode.net"
PORT=6667
NICK="beleidigungsbot"
IDENT="beleidigungsbot"
REALNAME="beleidigungsbot"
CHAN="##fionalerntprogrammieren"
readbuffer=""
s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" % NICK)
s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("JOIN :%s\r\n" % CHAN)
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "Na ihr Penner?"))
while 1:
readbuffer=readbuffer+s.recv(1024)
temp=string.split(readbuffer, "\n")
readbuffer=temp.pop( )
for line in temp:
line=string.rstrip(line)
line=string.split(line)
if(line[0]=="PING"):
s.send("PONG %s\r\n" % line[1])
Die Teile des Codes die verändert werden müssen, sind die Werte und Strings mit denen die Variablen im ersten Block belegt werden. Wenn ihr auf einem freenode Server bleibt, dürften die ersten Werte aber gleich bleiben. Nur die Namen unter nick, ident und realname müsst ihr ändern. Dann noch den Channel-Namen einfügen und natürlich das was ihr eurem Chat mitteilen wollt am Ende des zweiten Blocks. Probiert’s einfach aus.
Und jetzt?
1. Code kopieren
2. Modifizieren
3. Speichern
4. Ausführen
5. Debuggen
6. Ausführen
7. Lauern
8. Magie
9. Freuen
So einfach ist das!
In den nächsten Posts werd ich versuchen, das Ganze zu erklären, aber das hier dürfte ersteinmal reichen. Es lohnt sich, für das Verständnis ersteinmal die Einleitung des RFCs (Request for Comments) über IRC zu lesen. Ich muss aber selber erst noch ein paar Dinge über das Programm verstehen, da das auch meine erste Anwendung ist, die irgendwas mit dem Internet macht.
Bis dahin viel Spaß beim Trollieren!
Übrigens:
Eine kleine Sache die ich schon dazuprogrammiert habe, ist eine etwas größere Auswahl an Beleidigungen in einer Liste. Also muss eine Liste (zum Beispiel namens beleidigungen) angelegt werden, die mehrere Elemente umfasst. Mit „from random import choice“ kann ich daraus ein zufälliges Element zurückgeben lassen und diese Variable anstelle der manuell eingetippten Nachricht einsetzen. In den letzten Posts steht eigentlich alles notwendige dafür, insbesondere in „Zufallssex„.