我想为Magic: The Gathering Online编写一个交易机器人。该机器人应该等到有人提出交易、接受、查看其他交易者提供的卡片(信息显示在屏幕上),并执行其他类似功能。我有几个问题:
- 它怎么知道有人在提供交易?
- 它怎么知道其他交易者有一些卡片(信息存储在图片中)?
我现在无法想象该怎么做,我没有经验,直到现在我一直在为我的物理必需品编写控制台程序。
我想为Magic: The Gathering Online编写一个交易机器人。该机器人应该等到有人提出交易、接受、查看其他交易者提供的卡片(信息显示在屏幕上),并执行其他类似功能。我有几个问题:
我现在无法想象该怎么做,我没有经验,直到现在我一直在为我的物理必需品编写控制台程序。
首先,您应该注意一些网络游戏禁止使用机器人,因为它们会给某些玩家带来不公平的优势。MTGO服务条款似乎对此没有任何说明,尽管它们确实对可能对服务产生负面影响的任何事情进行了限制。他们还表示,将来有可能会添加 API,因此他们似乎并不反对自动化的想法,但目前不支持。这里要小心,但看起来写一个机器人应该是可以的,只要它没有有害或滥用。这不是法律建议,最好向运行 MTGO 的人征求许可。编辑自从我写了这篇文章,有人指出已经有很多机器人,所以编写机器人应该没有问题。
假设服务条款没有禁止它,但他们没有 API,你将不得不找到一种方法来检测正在发生的事情,并自动控制游戏。有一个关于编写扑克机器人的很好的系列文章(存档副本),其中包含有关如何将 DLL 注入应用程序、抓取屏幕和控制应用程序的一些很好的信息。这可能会为您提供做此类事情的起点。
您可能还想寻找其他人已经为此编写的工具。看起来有几个现有的 MTGO 机器人,但它们看起来都有点粗略(有一些关于它们窃取密码的报告),所以要小心。
由于这个答案似乎仍然得到了赞成,我可能应该用一些更有用的信息来更新它。写这篇文章后,我发现了一个很棒的 UI 自动化系统,叫做Sikuli。它允许您在 Python 中编写自动化 GUI 的程序。它包括图像识别功能,可以很容易地识别按钮、卡片和其他 UI 元素;您只需截取屏幕截图,将其裁剪以仅包含您感兴趣的内容,然后进行模糊图像匹配(以便更改背景等不会导致匹配失败)。它甚至包括一个自定义 IDE,允许您将这些屏幕截图直接嵌入到源代码中,这样您就可以准确地看到代码在寻找什么。这是一个例子来自文档(对于代码格式表示歉意,鉴于 StackOverflow 的 HTML 受限子集,在代码中内联图像并不容易):
def resizeApp(app, dx, dy):
switchApp(app)
corner = find(Pattern().targetOffset(3,14))
drop_point = corner.getTarget().offset(dx, dy)
dragDrop(corner, drop_point)
resizeApp("Safari", 50, 50)
与上面链接的文章中提到的将 DLL 注入您正在调试的进程中的技术相比,这更容易上手。Sikuli 完全在 UI 级别运行,因此您永远不必修改您正在自动化的程序或担心对内部结构的更改会破坏您的脚本。
它不擅长的一件事是处理文本。它具有 OCR 功能,但它们并不是那么好。但是,如果文本是可选择的,您可以选择文本,复制它,然后直接查看剪贴板。
如果我要编写一个机器人来自动化一些没有好的 API 或基于文本的界面的东西,Sikuli 可能是我会使用的第一个工具。
这个答案是根据我的评论构建的。
您尝试做的事情很难,无论您尝试做什么。
可以说,最简单的方法是完全模仿用户。所以应用程序按下按钮,移动鼠标等。这样做的缺点是它依赖于能够识别屏幕。
如果您可以更改游戏文件,这会更容易,因为您可以将所需的卡片皮肤(更改图像(纹理))为单一独特的颜色。
主要的缺点是您必须将游戏作为顶级窗口或让游戏在虚拟机中运行。两者都不理想。
另一种方法是读取进程内存。您也许可以找到一个内存位置列表,这会使事情变得更简单,否则它涉及大量的工作,一个调试器来推断内存地址。它也有助于(很多)能够理解汇编。
第三种方法是截取数据包,并修改它们。这比上面的方法更容易,因为它(至少对我而言)更容易逆向协议引擎,因为您需要处理的信息更少。只需设置一个数据包嗅探器并使用一个不同的变量(例如卡)执行操作并比较差异。
您需要检查的是您没有违反 EULA。我不知道游戏是如何运作的,但我遇到的大多数游戏都有一个 EULA,它禁止(即你被禁止)做我提到的任何事情。