Greedy Gnome: mientras escribía análisis de mercado en Lineage 2

Entonces ha llegado el tiempo de otoño-invierno. Fuera de la ventana, las lluvias y el deseo de pasar tiempo al aire libre son cada vez menos. Y luego llega un mensaje de un amigo mío: "¿ Juguemos a Lineage 2 ?" Y nuevamente, cediendo a la nostalgia, acepté. Elegimos un servidor nuevo en la ru y los personajes creados.




A diferencia de World of Warcraft, Lineage 2 tiene un sistema de minería de monedas de juego completamente diferente. Necesitas cazar monstruos durante todo el día con el fin de obtener ganancias. Incluso fue un descubrimiento para mí que para algunas personas el RMT (comercio con dinero real) es un poco de trabajo. Además, el juego tiene una economía que los jugadores forman. En otras palabras, puede ganar dinero comprando y vendiendo o comprando recursos baratos, sacar provecho de ellos y vender con una prima. Dado que para nosotros el juego sigue siendo una especie de relajación, fue esta forma de obtener la divisa del juego la que elegimos.


Para comprar y vender artículos, el jugador debe estar en línea (Captura de pantalla anterior). En consecuencia, alguien quiere vender más rápido (más barato) y alguien compra rápidamente (más caro). Pero, ¿qué pasa si la diferencia es vender - comprar positivo? Solo este ejemplo será considerado en el artículo como resultado.


Sin embargo, los precios de mercado son bastante inestables y a menudo cambian. Por lo tanto, es probable que compre algo "barato" y luego incluso más barato para vender con un beneficio negativo. Esto es lo que estamos tratando de evitar. En general, se decidió escribir un sistema de análisis de mercado y tratar con un par de tecnologías que me interesan.


Spoiler
Las siguientes tecnologías se utilizarán en el artículo.
Notificación de bot de Docker, DigitalOcean, NodeJs, Ktor, Prometheus, Grafana, Telegram


Primero fueron los datos


Para analizar algo, primero necesitamos obtener esto. Se consideraron 2 opciones para obtener información.


Sniffing : escriba una aplicación que escuche el tráfico y lo analice. Las desventajas de este enfoque son muy simples. Debe estar constantemente en línea y observar el mercado, y de acuerdo con la política del servidor, pueden prohibirlo. Sin embargo, me gustaría una acción mínima por parte del usuario y es deseable automatizar todo lo más posible.


Análisis : hay un sitio que se especializa en oler este juego: l2on.net. Justo lo que necesitamos! Le damos el papel de un recopilador de datos sin procesar a este servicio. Solo queda obtener de alguna manera los datos y comenzar a experimentar con ellos.




Según la cadena de consulta, entendemos que necesitamos pasar la identificación del recurso para obtener información sobre ella. Sin embargo, si automatizamos esto, también es necesario transferir la identificación del servidor del juego. Después de cavar un minuto en el código fuente de la página, se encontró lo siguiente:




Intentando ... ¡Genial! Obtenemos una lista de precios de compra y venta.
Ahora debe pensar en cómo analizar el sitio.


La elección recayó en Titiritero para NodeJs.
Sobre esta base , se creó el primer módulo del subsistema, Scrapper . Su tarea principal es ir al sitio, abrir, analizar y devolver datos en forma de JSON. Tomamos una muestra de los últimos N elementos, consideramos los precios promedio, mínimo y máximo. (Mirando hacia el futuro, diré que necesita refinar el percentil para editar el ruido si algún jugador pone un precio demasiado alto en la venta o bajo en la compra) Obtenemos la respuesta de acuerdo con los datos:




Ahora podemos pasar a la siguiente parte: almacenamiento de datos .


Supongamos que tenemos 2-3 consumidores de nuestros datos y queremos darles una matriz. También queremos evitar las frecuentes solicitudes de l2on para no ser incluido en la lista negra. Por lo tanto, necesitamos crear un segundo módulo que actúe como intermediario entre l2on y nuestros agentes.


La metodología de la encuesta fue elegida simple. Una vez cada 5 minutos, el módulo debe solicitar todos los elementos de la lista establecida y proporcionar resultados como datos para un recurso, así como resultados para análisis.


Para este sistema, quería probar Ktor , una solución de servidor en Kotlin.
No utilicé la base de datos, pero decidí almacenar los últimos datos en Singleton. Sí, la solución no es la más elegante, pero se ajusta rápidamente y siempre podremos optimizarla.


Entonces apareció el segundo módulo del sistema: Harvester .
Harvester proporciona al usuario dos puntos finales / item / {id} y / metrics
Si todo está claro con el primero, el último devuelve datos en el formato para el próximo sistema: Prometheus




Almacenamiento de datos para análisis


El enlace intermedio fue seleccionado Prometheus , una base de datos de código abierto para análisis que funciona a través del enfoque Pull. En otras palabras, al configurar, debe especificar en el archivo yaml el conjunto de proveedores de datos y la frecuencia de sondeo. En nuestro caso, este es exactamente el mismo punto final / metrics.


Intentamos ejecutar Prometheus (por defecto es el puerto 9090) y si vemos algo similar a Target:




Entonces estamos en el camino correcto. Esto significa que cada 30 segundos, Prometheus va a Harvester y recoge el último estado de todos los productos que nos interesan.


Visualización de datos


La siguiente etapa es una hermosa pantalla gráfica.


Para la representación, se seleccionó Grafana, que también es de código abierto.
Además de Grafana y Prometheus, están disponibles en forma de contenedores Docker que requieren un mínimo de acción del usuario.


Cuando inicie por primera vez Grafana (puerto estándar 3000), le pedirá que especifique una base de datos disponible. Seleccionamos Prometheus como base y prescribimos la dirección. Si todo va bien, entonces veremos:




El siguiente paso es dibujar gráficos.


Un ejemplo de una solicitud para dibujar un gráfico de ventas:




Por lo tanto, en cualquier momento vemos el precio promedio de la compra y venta, así como la dinámica de los precios.




Sin embargo, hay momentos en que el precio mínimo de venta es más alto que el precio máximo de compra. Esto significa que podemos obtener ganancias fáciles en forma de "comprar y vender". Para el canal de envío, Telegram seleccionó la notificación. Cree un bot y agregue su token a Grafana (sí, sí, admite notificaciones)




Es suficiente simplemente establecer la condición bajo la cual nos llegará esta notificación.




Como podemos ver en el gráfico, tales situaciones ocurren en el mercado.




Nube


Empacamos cada subsistema en el contenedor Docker y lo cargamos en DigitalOcean u otros servicios a su gusto. Pero esto no nos impide iniciar todo este sistema sin una IP dedicada. Ahora el contenedor mínimo para DO cuesta $ 5 por mes.


Comience Scrapper Primero
docker run -d -p 6661: 6661 --name scrapper l2 / scrapper: latest


Detrás de él Harvester
docker run -d -p 6662: 6662 -v / root / harvester: / res --link scrapper: scrapper l2harvester: latest
El archivo ids.txt con el formato debe estar en la carpeta / harvester


id1 nombre1
id2 nombre2


Conclusión


En definitiva, el sistema es el siguiente:



Está previsto agregar en el futuro un agente para actualizar Google Docs y calcular el costo de la creación sobre la marcha.


No sé si este tiempo de operación traerá algún beneficio, pero para mí personalmente fue una buena experiencia actualizar mis conocimientos en el campo aplicado. Mi especificidad principal son las aplicaciones móviles. El desarrollo del lado del servidor es una habilidad y curiosidad adicionales.


Como suplemento, adjunto enlaces para familiarizarme con el código:
Scrapper
Cosechadora
(Puedes recoger contenedores por equipos
Docker build -t scrapper.
Docker build -t cosechadora.)


Realmente espero que este artículo haya inspirado a alguien con sentimientos nostálgicos, o haya inspirado alguna idea nueva. ¡Gracias por leer el artículo hasta el final!

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


All Articles