Gnomo ganancioso: Como escrevi análises de mercado no Lineage 2

Então chegou a hora do outono-inverno. Do lado de fora da janela, as chuvas e o desejo de passar o tempo ao ar livre são cada vez menores. E então uma mensagem vem de um amigo meu: " Vamos jogar o Lineage 2 ?" E, novamente, cedendo à nostalgia, concordei. Escolhemos um servidor novo e criamos personagens.




Ao contrário do World of Warcraft, o Lineage 2 possui um sistema de mineração de moeda de jogo completamente diferente. Você precisa caçar monstros o tempo todo com o objetivo de obter lucro. Foi até uma descoberta para mim que, para algumas pessoas, o RMT (negociação com dinheiro real) é um pouco trabalhoso. Além disso, o jogo tem uma economia que os jogadores formam. Em outras palavras, você pode ganhar dinheiro com compra-venda ou compra de recursos baratos, tirar proveito deles e vender com um prêmio. Como para nós o jogo continua sendo uma espécie de relaxamento, foi essa a maneira de obter a moeda do jogo que escolhemos.


Para comprar e vender itens, o jogador deve estar online (Captura de tela acima). Por conseguinte, alguém quer vender mais rápido (mais barato) e alguém compra rapidamente (mais caro). Mas e se a diferença for vender - comprar positivo? Apenas este exemplo será considerado no artigo como resultado.


No entanto, os preços de mercado são bastante instáveis ​​e frequentemente mudam. Portanto, é provável que compre algo "barato" e depois ainda mais barato para vender com lucro negativo. É isso que estamos tentando evitar. Em geral, foi decidido escrever um sistema de análise de mercado e lidar com algumas tecnologias que são interessantes para mim.


Spoiler :
As seguintes tecnologias serão usadas no artigo
Docker, DigitalOcean, NodeJs, Ktor, Prometheus, Grafana, notificação de bot do Telegram


Primeiro foi Data


Para analisar algo, primeiro precisamos obter esse algo. Foram consideradas 2 opções para obter informações.


Farejando - escreva um aplicativo que ouvirá o tráfego e o analisará. As desvantagens dessa abordagem são muito simples. Você precisa estar constantemente online e assistir ao mercado, e de acordo com a política do servidor, eles podem banir. No entanto, eu gostaria de uma ação mínima do usuário e é desejável automatizar tudo o mais possível.


Análise - existe um site especializado em cheirar esse jogo - l2on.net. Apenas o que precisamos! Atribuímos o papel de um coletor de dados brutos a esse serviço. Resta apenas obter de alguma forma os dados e começar a experimentar com eles.




Com base na cadeia de consulta, entendemos que precisamos passar o ID do recurso para obter informações sobre ele. No entanto, se automatizarmos isso, também será necessário transferir o ID do servidor do jogo. Após digitar um minuto no código fonte da página, foi encontrado o seguinte:




Tentando ... Ótimo! Temos uma lista de preços de compra e venda.
Agora você precisa pensar em como analisar o site.


A escolha recaiu sobre o Puppeteer para os NodeJs.
Em sua base , foi criado o primeiro módulo do subsistema, Scrapper . Sua principal tarefa é acessar o site, abrir, analisar e retornar dados na forma de JSON. Tomamos uma amostra dos últimos N elementos, consideramos os preços médio, mínimo e máximo. (Olhando para o futuro, direi que você precisa refinar o percentil para editar o ruído, se algum jogador colocar um preço muito alto na venda ou baixo na compra) Temos a resposta de acordo com os dados:




Agora podemos passar para a próxima parte - armazenamento de dados .


Suponha que tenhamos de 2 a 3 consumidores de nossos dados e queremos fornecer a eles uma matriz. Também queremos evitar solicitações frequentes para l2on, para não ficar na lista negra. Portanto, precisamos criar um segundo módulo que atue como intermediário entre o l2on e nossos agentes.


A metodologia da pesquisa foi escolhida simples. Uma vez a cada 5 minutos, o módulo deve solicitar todos os itens da lista estabelecida e fornecer saída como dados para um recurso e saída para análise.


Para este sistema, eu queria experimentar o Ktor - uma solução de servidor no Kotlin.
Não usei o banco de dados, mas decidi armazenar os dados mais recentes em Singleton. Sim, a solução não é a mais elegante, mas é rápida, e sempre poderemos otimizá-la.


Então o segundo módulo do sistema apareceu - Harvester .
O Harvester fornece ao usuário dois pontos de extremidade / item / {id} e / métricas
Se tudo estiver claro com o primeiro, o segundo retornará dados no formato para o próximo sistema - Prometheus




Armazenamento de dados para análise


O link intermediário foi selecionado Prometheus - um banco de dados de código aberto para análises que funciona através da abordagem Pull. Em outras palavras, ao configurar, você precisa especificar no arquivo yaml o conjunto de provedores de dados e a frequência da pesquisa. No nosso caso, esse é exatamente o mesmo ponto de extremidade / métricas.


Tentamos executar o Prometheus (por padrão, é a porta 9090) e, se virmos algo semelhante ao Target:




Então, estamos no caminho certo. Isso significa que a cada 30 segundos Prometheus vai para Harvester e escolhe o último estado para todos os produtos em que estamos interessados.


Exibição de dados


A próxima etapa é uma bela exibição gráfica.


Para renderização, Grafana foi selecionado , que também é de código aberto.
Vantagens Grafana e Prometheus - estão disponíveis na forma de contêineres do Docker que requerem um mínimo de ação do usuário.


Quando você inicia o Grafana (porta padrão 3000), ele solicita que você especifique um banco de dados disponível. Selecionamos Prometeu como base e prescrevemos o endereço. Se tudo correr bem, veremos:




O próximo passo é desenhar gráficos.


Um exemplo de uma solicitação para desenhar um gráfico de vendas:




Assim, a qualquer momento vemos o preço médio da compra e venda, bem como a dinâmica dos preços.




No entanto, há momentos em que o preço mínimo de venda é superior ao preço máximo de compra. Isso significa que podemos obter lucro fácil na forma de "comprar e vender". Para o canal de envio, a notificação foi selecionada pelo Telegram. Crie um bot e adicione seu token ao Grafana (sim, sim, ele suporta notificações)




Basta estabelecer simplesmente a condição sob a qual essa notificação chegará até nós.




Como podemos ver no gráfico, essas situações acontecem no mercado.




Cloud


Empacotamos cada subsistema no contêiner do Docker e o carregamos no DigitalOcean ou em outros serviços ao seu gosto. Mas isso não nos impede de iniciar todo o sistema sem um IP dedicado. Agora, o contêiner mínimo para DO custa US $ 5 por mês.


Inicie o Scrapper primeiro
docker run -d -p 6661: 6661 --name scrapper l2 / scrapper: mais recente


Atrás dele Harvester
docker run -d -p 6662: 6662 -v / root / harvester: / res --link scrapper: scrapper l2harvester: mais recente
O arquivo ids.txt com o formato deve estar na pasta / harvester


id1 name1
id2 name2


Conclusão


Por fim, o sistema é o seguinte:



Está planejado no futuro adicionar um agente para atualizar o Google Docs e calcular o custo de criação em tempo real.


Não sei se esse tempo de operação trará algum benefício, mas para mim, pessoalmente, foi uma boa experiência atualizar meus conhecimentos no campo aplicado. Minha principal especificidade são as aplicações móveis. O desenvolvimento no servidor é uma habilidade e curiosidade adicionais.


Como complemento, anexo links para me familiarizar com o código:
Scrapper
Colheitadeira
(Você pode coletar contêineres por equipes
docker build -t scrapper.
docker build -t harvester.)


Eu realmente espero que este artigo tenha inspirado alguém com sentimentos nostálgicos ou tenha inspirado alguma nova idéia. Obrigado por ler o artigo até o fim!

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


All Articles