Es gibt so ein paar Dinge, zu denen ich immer wieder zurückfinde. Zum Beispiel EVE-Online: Seit 2004 steige ich alle paar Jahre wieder in meine Rifter. Auch Python ist so ein Thema: Auch wenn mich dynamische Typisierung zuweilen verzweifeln lässt – nirgendwo sonst schaffe ich es, in so kurzer Zeit einen Prototypen zu entwickeln.
Wie viele Zeilen Code braucht es wohl, um EVE-Online Killmails (Benachrichtigungen über Abschüsse im Spiel) einzulesen und zu speichern? Wir verwenden natürlich Python 3.
Killmails abfragen
Zkillboard.com bietet einen RedisQ-Service an, den wir in kurzen Abständen aufrufen können, um alle Killmails der Plattform seit dem letzten Aufruf zu bekommen. Neben zwei Importen brauchen wir dafür drei Zeilen Python:
import json import urllib.request url = "https://redisq.zkillboard.com/listen.php" data_json = urllib.request.urlopen(url).read() data_dict = json.loads(data_json.decode('utf-8'))
Okay, jetzt haben wir eine schöne Killmail als Python-Dictionary. Es wäre also sinnvoll, das Skript häufig auszuführen, zum Beispiel als Cronjob.
In der Datenbank speichern
Vielleicht sollten wir die Daten also auch irgendwo abspeichern? Vielleicht in einer Datenbank? Mit MongoDB müssen wir uns fürs erste keine Gedanken um Datenbank-Schemata machen:
import pymongo client = pymongo.MongoClient('localhost', 27017) # mongodb default port database = client.eveonline database.killmails.insert_one(data_dict)
Statistiken erzeugen
Vorausgesetzt, wir haben zuvor eine MongoDB-Instanz gestartet, liegen jetzt nach nicht einmal zehn Zeilen Python ein paar Killmails in unserer Datenbank. Das lässt sich jetzt zum Beispiel verwenden, um ein paar Statistiken zu erstellen. Wie schlägt sich denn die Rifter so im Großen und Ganzen?
# rifter ID is 587 database.killmails.count({"package.killmail.attackers.ship_type_id": 587}) database.killmails.count({"package.killmail.victim.ship_type_id": 587})
In meiner Datenbank hatte ich nach ein paar Tagen etwa 7000 Einträge, wobei ich nach „Solo“, also 1vs1-Kämpfen filtere, sonst wären es deutlich mehr. Die beiden Abfragen hier ergaben dann 58 Siege und 151 Abschüsse. Ohne Vergleichswerte ist das wenig aussagekräftig, also wiederholen wir das für ein paar ähnliche Schiffe:
Schiff | Siege | Verluste |
Rifter | 58 | 151 |
Tormentor | 23 | 68 |
Kestrel | 53 | 160 |
Tristan | 111 | 303 |
Da zeichnet sich wohl recht klar ein 1:3 Bild ab. Allerdings sprechen wir hier auch über vier der billigsten Schiffe im ganzen Spiel.
Weitere Schritte
Jetzt haben wir einen kleinen, minimalistischen Prototypen geschrieben dem natürlich noch ein wenig Optimierung gut tun würde:
- Die Daten von zKillboard beinhalten mehr als nur die Killmail. Wir könnten also sinnvollerweise nur data_dict[„package“][„killmail“] speichern.
- Spätestens dann wären ein paar Checks hilfreich, um KeyErrors abzufangen.
- Damit verändern sich natürlich auch die Abfragen.
- Das Skript sollte Killmails in einer Schleife konsumieren, bis der Service eine leere Antwort zurückgibt. Dann müsste man den Cronjob nur alle paar Minuten ausführen.
Alle EVE-Online bezogenen Materialien sind Eigentum von CCP Games