Greedy Gnome: alors que j'écrivais des analyses de marché dans Lineage 2

L'heure automne-hiver est donc arrivée. En dehors de la fenêtre, les pluies et l'envie de passer du temps à l'extérieur sont de moins en moins. Et puis un message vient d'un de mes amis, " Jouons à Lineage 2 ?" Et encore une fois, cédant à la nostalgie, j'ai accepté. Nous avons choisi un nouveau serveur sur le ru-ofe et créé des personnages.




Contrairement à World of Warcraft, Lineage 2 a un système d'extraction de devises de jeu complètement différent. Vous devez chasser les monstres 24 heures sur 24 dans le but de gagner des bénéfices. Ce fut même une découverte pour moi que pour certaines personnes, le RMT (Real Money trading) est un peu un travail. De plus, le jeu a une économie que les joueurs forment. En d'autres termes, vous pouvez gagner de l'argent en achetant-vendant ou en achetant des ressources bon marché, en faire des choses et vendre à prix fort. Puisque pour nous le jeu reste une sorte de relaxation, c'est cette façon d'obtenir la monnaie du jeu que nous avons choisie.


Pour acheter et vendre des objets, le joueur doit être en ligne (capture d'écran ci-dessus). En conséquence, quelqu'un veut vendre plus vite (moins cher) et quelqu'un acheter rapidement (plus cher). Mais que faire si la différence est de vendre - acheter positif? Seul cet exemple sera considéré dans l'article en conséquence.


Cependant, les prix du marché sont assez instables et changent souvent. Par conséquent, il est probable qu'il achète quelque chose de «bon marché», puis encore moins cher à vendre avec un bénéfice négatif. C'est ce que nous essayons d'éviter. En général, il a été décidé d'écrire un système d'analyse de marché et de traiter de quelques technologies qui m'intéressent.


Spoiler :
Les technologies suivantes seront utilisées dans l'article
Docker, DigitalOcean, NodeJs, Ktor, Prometheus, Grafana, Telegram bot notification


Le premier était Data


Pour analyser quelque chose, nous devons d'abord obtenir ce quelque chose. 2 options pour obtenir des informations ont été envisagées.


Renifler - écrire une application qui écoutera le trafic et l'analysera. Les inconvénients de cette approche sont très simples. Vous devez être constamment en ligne et surveiller le marché, et selon la politique du serveur, ils peuvent interdire. Cependant, je souhaiterais une action minimale de la part de l'utilisateur et il est souhaitable d'automatiser tout autant que possible.


Analyse - il existe un site spécialisé dans le reniflement pour ce jeu - l2on.net. Exactement ce dont nous avons besoin! Nous donnons le rôle de collecteur de données brutes à ce service. Il ne reste plus qu'à obtenir les données et à commencer à les expérimenter.




Sur la base de la chaîne de requête, nous comprenons que nous devons transmettre l'ID de ressource pour obtenir des informations à ce sujet. Cependant, si nous voulons automatiser cela, il est également nécessaire de transférer l'id du serveur de jeu. Après avoir creusé une minute dans le code source de la page, les éléments suivants ont été trouvés:




Essayer ... Génial! Nous obtenons une liste des prix d'achat et de vente.
Vous devez maintenant réfléchir à la façon d'analyser le site.


Le choix s'est porté sur Puppeteer pour NodeJs.
Sur sa base, le premier module du sous-système, Scrapper, a été créé. Sa tâche principale est de se rendre sur le site, d'ouvrir, d'analyser et de renvoyer des données sous forme de JSON. Nous prenons un échantillon des N derniers éléments, considérons les prix moyens, minimum et maximum. (À l'avenir, je dirai que vous devez affiner le centile pour modifier le bruit si un joueur met un prix trop élevé sur la vente ou bas sur l'achat) Nous obtenons la réponse en fonction des données:




Nous pouvons maintenant passer à la partie suivante - le stockage des données .


Supposons que nous ayons 2-3 consommateurs de nos données et que nous voulons leur donner un tableau. Nous voulons également éviter les demandes fréquentes à l2on afin de ne pas être mis sur liste noire. Nous devons donc créer un deuxième module qui servira d'intermédiaire entre l2on et nos agents.


La méthodologie d'enquête a été choisie simple. Toutes les 5 minutes, le module doit demander tous les éléments de la liste établie et fournir une sortie sous forme de données pour une ressource ainsi qu'une sortie pour l'analyse.


Pour ce système, je voulais essayer Ktor - une solution serveur sur Kotlin.
Je n'ai pas utilisé la base de données, mais j'ai décidé de stocker les dernières données dans Singleton. Oui, la solution n'est pas la plus élégante, mais c'est un ajustement rapide, et nous serons toujours en mesure de l'optimiser.


Ainsi, le deuxième module du système est apparu - Harvester .
Harvester fournit à l'utilisateur deux points d'extrémité / item / {id} et / métriques
Si tout est clair avec le premier, alors le second renvoie des données au format pour le prochain système - Prometheus




Stockage de données pour l'analyse


Le lien intermédiaire a été sélectionné Prometheus - une base de données Open Source pour l'analyse qui fonctionne à travers l'approche Pull. En d'autres termes, lors de la configuration, vous devez spécifier dans le fichier yaml l'ensemble des fournisseurs de données et la fréquence d'interrogation. Dans notre cas, il s'agit exactement du même point de terminaison / metrics.


Nous essayons d'exécuter Prometheus (par défaut, c'est le port 9090) et si nous voyons quelque chose de similaire à Target:




Nous sommes donc sur la bonne voie. Cela signifie que toutes les 30 secondes, Prometheus se rend chez Harvester et récupère le dernier état pour toutes les marchandises qui nous intéressent.


Affichage des données


L'étape suivante est un bel affichage graphique.


Pour le rendu, Grafana a été sélectionné , qui est également Open Source.
Avantages Grafana et Prometheus - ils sont disponibles sous la forme de conteneurs Docker qui nécessitent un minimum d'action de l'utilisateur.


Au premier démarrage de Grafana (port standard 3000), il vous demandera de spécifier une base de données disponible. Nous sélectionnons Prometheus comme base et prescrivons l'adresse. Si tout se passe bien, alors nous verrons:




L'étape suivante consiste à dessiner des graphiques.


Un exemple de demande pour dessiner un graphique des ventes:




Ainsi, on voit à tout moment le prix moyen d'achat et de vente, ainsi que la dynamique des prix.




Cependant, il arrive que le prix de vente minimum soit supérieur au prix d'achat maximum. Cela signifie que nous pouvons obtenir facilement des bénéfices sous la forme «acheter et vendre». Pour le canal d'envoi, la notification a été sélectionnée par Telegram. Créez un bot et ajoutez son jeton à Grafana (oui oui, il prend en charge les notifications)




Il suffit d’établir simplement les conditions dans lesquelles cette notification nous parviendra.




Comme nous pouvons le voir sur le graphique, de telles situations se produisent sur le marché.




Nuage


Nous emballons chaque sous-système dans le conteneur Docker et le chargeons dans DigitalOcean ou d'autres services à votre convenance. Mais cela ne nous empêche pas de démarrer l'ensemble de ce système sans une IP dédiée. Maintenant, le conteneur minimum pour DO coûte 5 $ par mois.


Démarrer Scrapper en premier
docker run -d -p 6661: 6661 --name scrapper l2 / scrapper: latest


Derrière lui Harvester
docker run -d -p 6662: 6662 -v / root / harvester: / res --link scrapper: scrapper l2harvester: dernier
Le fichier ids.txt au format doit se trouver dans le dossier / harvester


id1 nom1
id2 nom2


Conclusion


En fin de compte, le système est le suivant:



Il est prévu à l'avenir d'ajouter un agent pour mettre à jour google docs et calculer le coût de fabrication à la volée.


Je ne sais pas si ce temps de fonctionnement apportera des avantages, mais pour moi personnellement, ce fut une bonne expérience de rafraîchir mes connaissances dans le domaine appliqué. Ma principale spécificité est les applications mobiles. Le développement côté serveur est une compétence et une curiosité supplémentaires.


En complément, je joins des liens pour me familiariser avec le code:
Scrapper
Harvester
(Vous pouvez collecter des conteneurs par équipes
docker build -t scrapper.
docker build -t moissonneuse.)


J'espère vraiment que cet article a inspiré quelqu'un avec des sentiments nostalgiques ou a inspiré une nouvelle idée. Merci d'avoir lu l'article jusqu'au bout!

Source: https://habr.com/ru/post/fr429244/


All Articles