Die Herbst-Winter-Zeit ist also gekommen. Vor dem Fenster sind die Regenfälle und der Wunsch, Zeit im Freien zu verbringen, immer geringer. Und dann kommt eine Nachricht von einem Freund von mir: " Lass uns Lineage 2 spielen ?" Und wieder stimmte ich der Nostalgie zu und stimmte zu. Wir haben einen neuen Server auf der Ru-ofe ausgewählt und Charaktere erstellt.

Im Gegensatz zu World of Warcraft verfügt Lineage 2 über ein völlig anderes Spielwährungs-Mining-System. Sie müssen rund um die Uhr Monster jagen, um Gewinn zu erzielen. Es war sogar eine Entdeckung für mich, dass RMT (Real Money Trading) für manche Menschen ein Job ist. Außerdem hat das Spiel eine Wirtschaft, die die Spieler bilden. Mit anderen Worten, Sie können mit Buy-Sell oder billigen Ressourcen Geld verdienen, Dinge daraus machen und mit einer Prämie verkaufen. Da das Spiel für uns eine Art Entspannung bleibt, wurde diese Art der Spielwährung von uns gewählt.
Um Gegenstände zu kaufen und zu verkaufen, muss der Spieler online sein (Screenshot oben). Dementsprechend möchte jemand schneller verkaufen (billiger) und jemand schnell kaufen (teurer). Aber was ist, wenn der Unterschied Verkauf - Kauf positiv ist? Nur dieses Beispiel wird daher im Artikel berücksichtigt.
Die Marktpreise sind jedoch recht instabil und ändern sich häufig. Daher ist es wahrscheinlich, etwas "Billiges" zu kaufen und dann noch billiger mit einem negativen Gewinn zu verkaufen. Dies versuchen wir zu vermeiden. Im Allgemeinen wurde beschlossen, ein System der Marktanalyse zu schreiben und mich mit einigen für mich interessanten Technologien zu befassen.
Spoiler :
Die folgenden Technologien werden im Artikel verwendet
Docker, DigitalOcean, NodeJs, Ktor, Prometheus, Grafana, Telegramm-Bot-Benachrichtigung
Zuerst war Daten
Um etwas zu analysieren, müssen wir zuerst etwas bekommen. Es wurden 2 Möglichkeiten zur Informationsbeschaffung in Betracht gezogen.
Schnüffeln - Schreiben Sie eine Anwendung, die den Datenverkehr abhört und analysiert. Die Nachteile dieses Ansatzes sind sehr einfach. Sie müssen ständig online sein und den Markt beobachten, und gemäß den Richtlinien des Servers können sie verbieten. Ich möchte jedoch nur minimale Maßnahmen des Benutzers und es ist wünschenswert, alles so weit wie möglich zu automatisieren.
Parsing - Es gibt eine Seite, die sich auf das Schnüffeln für dieses Spiel spezialisiert hat - l2on.net. Genau das, was wir brauchen! Wir geben diesem Service die Rolle eines Rohdatenkollektors. Es bleibt nur irgendwie, die Daten zu bekommen und mit ihnen zu experimentieren.

Basierend auf der Abfragezeichenfolge verstehen wir, dass wir die Ressourcen-ID übergeben müssen, um Informationen darüber zu erhalten. Wenn wir dies jedoch automatisieren wollen, ist es auch erforderlich, die ID des Spielservers zu übertragen. Nach einer Minute im Quellcode der Seite wurde Folgendes gefunden:

Versuchen ... Großartig! Wir erhalten eine Liste der Kauf- und Verkaufspreise.
Jetzt müssen Sie darüber nachdenken, wie Sie die Site analysieren können.
Die Wahl fiel auf Puppenspieler für NodeJs.
Auf dieser Basis wurde das erste Modul des Subsystems, Scrapper, erstellt. Die Hauptaufgabe besteht darin, zur Site zu gehen, Daten in Form von JSON zu öffnen, zu analysieren und zurückzugeben. Wir nehmen eine Stichprobe der letzten N Elemente und berücksichtigen die Durchschnitts-, Mindest- und Höchstpreise. (Mit Blick auf die Zukunft muss ich sagen, dass Sie das Perzentil verfeinern müssen, um das Rauschen zu bearbeiten, wenn ein Spieler einen zu hohen Preis für den Verkauf oder einen zu niedrigen Preis für den Kauf festlegt.) Wir erhalten die Antwort gemäß den Daten:

Jetzt können wir mit dem nächsten Teil fortfahren - der Datenspeicherung .
Angenommen, wir haben 2-3 Verbraucher unserer Daten und möchten ihnen ein Array geben. Wir möchten auch häufige Anfragen an l2on vermeiden, um nicht auf die schwarze Liste gesetzt zu werden. Wir müssen also ein zweites Modul erstellen, das als Vermittler zwischen l2on und unseren Agenten fungiert.
Die Erhebungsmethode wurde einfach gewählt. Einmal alle 5 Minuten sollte das Modul alle Elemente aus der festgelegten Liste anfordern und eine Ausgabe als Daten für eine Ressource sowie eine Ausgabe für die Analyse bereitstellen.
Für dieses System wollte ich Ktor ausprobieren - eine Serverlösung auf Kotlin.
Ich habe die Datenbank nicht verwendet, aber ich habe beschlossen, die neuesten Daten in Singleton zu speichern. Ja, die Lösung ist nicht die eleganteste, passt aber schnell und wir können sie immer optimieren.
So erschien das zweite Modul des Systems - Harvester .
Harvester stellt dem Benutzer zwei Endpunkte zur Verfügung: / item / {id} und /metrics
Wenn bei ersteren alles klar ist, gibt letztere Daten im Format für das nächste System zurück - Prometheus


Datenspeicherung für Analysen
Der Zwischenlink wurde Prometheus ausgewählt - eine Open Source-Datenbank für Analysen, die über den Pull-Ansatz funktioniert. Mit anderen Worten, bei der Konfiguration müssen Sie in der yaml-Datei den Satz von Datenanbietern und die Abrufhäufigkeit angeben. In unserem Fall ist dies genau der gleiche / Metrik-Endpunkt.
Wir versuchen Prometheus auszuführen (standardmäßig ist es Port 9090) und wenn wir etwas Ähnliches wie Target sehen:

Wir sind also auf dem richtigen Weg. Dies bedeutet, dass Prometheus alle 30 Sekunden zu Harvester geht und den letzten Zustand für alle Waren abholt, an denen wir interessiert sind.
Datenanzeige
Die nächste Stufe ist eine schöne Grafikanzeige.
Für das Rendern wurde Grafana ausgewählt , das auch Open Source ist.
Pluspunkte Grafana und Prometheus - Sie sind in Form von Docker-Containern verfügbar, die ein Minimum an Benutzeraktionen erfordern.
Wenn Sie Grafana (Standardport 3000) zum ersten Mal starten, werden Sie aufgefordert, eine verfügbare Datenbank anzugeben. Wir wählen Prometheus als Basis und schreiben die Adresse vor. Wenn alles gut geht, werden wir sehen:

Der nächste Schritt ist das Zeichnen von Diagrammen.
Ein Beispiel für eine Anfrage zum Zeichnen eines Verkaufscharts:

So sehen wir jederzeit den Durchschnittspreis für Kauf und Verkauf sowie die Preisdynamik.

Es gibt jedoch Zeiten, in denen der Mindestverkaufspreis höher ist als der Höchstkaufpreis. Dies bedeutet, dass wir einen einfachen Gewinn in Form von "Kaufen und Verkaufen" erzielen können. Für den Sendekanal wurde die Benachrichtigung per Telegramm ausgewählt. Erstellen Sie einen Bot und fügen Sie sein Token zu Grafana hinzu (ja, ja, es werden Benachrichtigungen unterstützt).

Es reicht aus, nur die Bedingung festzulegen, unter der diese Benachrichtigung bei uns eingeht.

Wie wir aus der Grafik sehen können, passieren solche Situationen auf dem Markt.

Wolke
Wir packen jedes Subsystem in den Docker-Container und laden es nach Ihren Wünschen in DigitalOcean oder andere Dienste. Dies hindert uns jedoch nicht daran, das gesamte System ohne dedizierte IP zu starten. Jetzt kostet der Mindestcontainer für DO 5 USD pro Monat.
Starten Sie Scrapper zuerst
Docker run -d -p 6661: 6661 --name scrapper l2 / scrapper: aktuell
Hinter ihm Harvester
Docker-Lauf -d -p 6662: 6662 -v / root / harvester: / res --link scrapper: scrapper l2harvester: spätestens
Die Datei ids.txt mit dem Format sollte sich im Ordner / harvester befinden
id1 name1
id2 name2
Fazit
Letztendlich ist das System wie folgt:

In Zukunft ist geplant, einen Agenten hinzuzufügen, um Google Docs zu aktualisieren und die Herstellungskosten im laufenden Betrieb zu berechnen.
Ich weiß nicht, ob diese Betriebszeit einen Nutzen bringt, aber für mich persönlich war es eine gute Erfahrung, mein Wissen auf dem angewandten Gebiet aufzufrischen. Meine Hauptspezifität sind mobile Anwendungen. Die serverseitige Entwicklung ist eine zusätzliche Fähigkeit und Neugier.
Als Ergänzung füge ich Links hinzu, um mich mit dem Code vertraut zu machen:
Scrapper
Mähdrescher
(Sie können Container von Teams sammeln
Docker Build-T Scrapper.
Docker Build-T Harvester.)
Ich hoffe wirklich, dass dieser Artikel jemanden mit nostalgischen Gefühlen inspirierte oder Inspiration für eine neue Idee gab. Vielen Dank, dass Sie den Artikel bis zum Ende gelesen haben!