因此,秋冬季节到了。 在窗户外面,下雨和花时间在户外的欲望越来越少。 然后我的一个朋友传来一条消息,“ 让我们玩《 天堂2》吗?” 再说一次,我怀旧了。 我们在规则上选择了一个新的服务器并创建了角色。

与《魔兽世界》不同,《天堂2》拥有完全不同的游戏货币挖掘系统。 为了获取利润,您需要全天候狩猎怪物。 甚至对我来说,发现对于某些人来说RMT(真实货币交易)还是一件容易的事。 而且,游戏具有玩家形成的经济性。 换句话说,您可以通过买卖来赚钱或购买便宜的资源,从中赚钱,然后以高价出售。 由于对我们来说游戏仍然是一种放松,因此我们选择了这种获取游戏货币的方法。
要购买和出售物品,玩家必须在线(上面的截图)。 因此,有人想卖得更快(更便宜),有人想买得更快(更昂贵)。 但是,如果差额是卖出-买入正数怎么办? 因此,本文将仅考虑此示例。
但是,市场价格非常不稳定并且经常变化。 因此,很可能会买到一些“便宜”的东西,然后以更低的价格卖出负利润。 这就是我们要避免的事情。 总的来说,决定编写一个市场分析系统,并处理一些我感兴趣的技术。
扰流板
本文将使用以下技术
Docker,DigitalOcean,NodeJs,Ktor,Prometheus,Grafana,Telegram机器人通知
首先是数据
要分析某些东西,我们首先需要得到一些东西。 考虑了两种获取信息的选择。
嗅探 -编写一个可以监听流量并对其进行分析的应用程序。 这种方法的缺点非常简单。 您需要保持在线状态并密切关注市场,并根据他们的服务器政策禁止他们这样做。 但是,我希望用户采取最少的操作,因此希望使所有操作尽可能自动化。
解析 -有一个专门从事嗅探此游戏的网站-l2on.net。 正是我们需要的! 我们将原始数据收集器的角色赋予此服务。 它仍然只是以某种方式获取数据并开始对其进行试验。

根据查询字符串,我们知道我们需要传递资源ID以获得有关它的信息。 但是,如果我们要自动执行此操作,则还必须转移游戏服务器的ID。 在页面的源代码中花了几分钟之后,发现以下内容:

尝试...很棒! 我们获得购买和销售价格的清单。
现在,您需要考虑如何解析站点。
这个选择落在了用于NodeJ的Puppeteer上。
在此基础上,创建了子系统的第一个模块Scrapper 。 它的主要任务是前往站点,以JSON的形式打开,解析和返回数据。 我们抽取了最后N个元素的样本,并考虑了平均,最低和最高价格。 (展望未来,我想说的是,如果某些玩家对销售标价过高或购买标价过低,则需要调整百分位数以编辑噪音)。我们根据数据得出答案:

现在,我们可以继续进行下一部分- 数据存储 。
假设我们有2-3个数据使用者,我们想给他们一个数组。 我们还希望避免频繁请求l2on,以免被列入黑名单。 因此,我们需要创建第二个模块来充当l2on和我们的代理之间的中介。
选择调查方法很简单。 每5分钟一次,模块应从已建立的列表中请求所有项目,并提供输出作为一种资源的数据以及分析输出。
对于这个系统,我想尝试Ktor -Kotlin上的服务器解决方案。
我没有使用数据库,但是我决定将最新数据存储在Singleton中。 是的,该解决方案不是最优雅的解决方案,但可以快速解决,我们将始终能够对其进行优化。
因此,系统的第二个模块出现了-Harvester 。
Harvester为用户提供两个端点/项目/ {id}和/指标
如果前者一切正常,则后者以下一个系统-Prometheus的格式返回数据


数据存储以进行分析
中间链接被选为Prometheus,Prometheus是一个通过Pull方法工作的开源数据库。 换句话说,在配置时,您需要在yaml文件中指定数据提供者的集合和轮询频率。 在我们的例子中,这是完全相同的/指标终结点。
我们尝试运行Prometheus(默认情况下为端口9090),并且如果看到类似于Target的内容:

所以我们走在正确的轨道上。 这意味着,每隔30秒,普罗米修斯就会去收割机,并获取我们感兴趣的所有商品的最后状态。
数据显示
下一步是漂亮的图形显示。
为了进行渲染,选择了Grafana,它也是开源的。
加上Grafana和Prometheus-它们以需要最少用户操作的Docker容器形式提供。
首次启动Grafana(标准端口3000)时,它将要求您指定一个可用的数据库。 我们选择普罗米修斯作为基地,并规定地址。 如果一切顺利,那么我们将看到:

下一步是绘制图形。
绘制销售图表的请求示例:

因此,我们随时可以查看购买和出售的平均价格以及价格动态。

但是,有时最低销售价格高于最高购买价格。 这意味着我们可以以“买卖”的形式获得轻松获利。 对于发送通道,Telegram选择了通知。 创建一个机器人并将其令牌添加到Grafana(是的,它确实支持通知)

只需简单地确定将收到此通知的条件即可。

从图表中可以看出,这种情况发生在市场上。

云
我们将每个子系统包装在Docker容器中,然后根据您的喜好将其加载到DigitalOcean或其他服务中。 但这并不能阻止我们在没有专用IP的情况下启动整个系统。 现在,DO的最低集装箱费用为每月5美元。
首先启动刮板
docker run -d -p 6661:6661 --name scraper l2 / scraper:最新
在他身后的收割机
码头工人运行-d -p 6662:6662 -v /根/收割机:/ res-链接刮板:刮板l2收割机:最新
格式为ids.txt的文件应位于/ Harvester文件夹中
id1名称1
id2名称2
结论
最终,系统如下:

计划在将来添加一个代理来更新google文档,并即时计算制作成本。
我不知道此操作时间是否会带来任何好处,但是对我个人而言,这是一次很好的经验,可以使我重新了解应用领域的知识。 我的主要特点是移动应用程序。 服务器端开发是一项附加技能和好奇心。
作为补充,我附上了链接以使自己熟悉代码:
刮刀
收割机
(您可以按团队收集容器
docker build -t刮板。
docker build -t收割机。)
我真的希望本文能激发人们怀旧之情,或为某些新想法提供灵感。 感谢您阅读本文的结尾!