在线交易机器人

时间:2009-12-26 22:32:11

标签: bots

我想为Magic: The Gathering Online编码交易机器人。该机器人应该等到有人提供交易,接受,查看其他交易者可用的卡(信息显示在屏幕上),并执行其他类似功能。我有几个问题:

  1. 怎么知道有人提供交易?
  2. 怎么知道其他交易者有一张卡(信息存储在图片中)?
  3. 我现在无法想象如何做到这一点,我没有经验,直到现在我一直只为我的物理现象编写控制台程序。

2 个答案:

答案 0 :(得分:12)

首先,你应该注意到一些在线游戏禁止机器人,因为它们可以给某些玩家不公平的优势。 MTGO Terms of Service似乎对此没有任何说明,尽管他们确实对可能对服务产生负面影响的任何事情施加限制。他们还said他们有可能在将来添加API,所以他们似乎不反对自动化的想法,但目前还没有支持它。在这里仔细阅读,但看起来编写机器人应该没问题,只要它不是有害或滥用。这不是法律建议,并且向运行MTGO的人员征求许可是个好主意。 编辑自从我写这篇文章以来,已经指出已经有很多机器人,所以编写机器人应该没有问题。

假设服务条款没有禁止它,但它们没有API,你必须找到一种方法来检测正在发生的事情,并自动控制游戏。有一个非常好的series of articles on writing poker botsarchived copy),它有一些关于如何将DLL注入应用程序,刮擦屏幕和控制应用程序的良好信息。这可能为你提供了做这类事情的起点。

您可能还想查找其他人为此而编写的工具。看起来有几个现有的MTGO机器人,但它们看起来都有点粗略(有一些关于它们窃取密码的报告),所以要小心。

修改

由于这个答案似乎仍然有待提升,我应该用一些更有用的信息来更新它。自写这篇文章以来,我发现了一个名为Sikuli的优秀UI自动化系统。它允许您使用Python编写自动化GUI的程序。它包括图像识别功能,可以很容易地识别按钮,卡片和其他UI元素;你只需截取屏幕截图,将其裁剪为仅包含您感兴趣的内容,并进行模糊图像匹配(以便更改背景等不会导致匹配失败)。它甚至包括一个自定义IDE,允许您直接在源代码中嵌入这些屏幕截图,因此您可以准确地查看代码所需的内容。这里是文档中的an example(代码格式化的道歉,在StackOverflow的HTML限制子集中,在代码中内联图像并不容易):

def resizeApp(app, dx, dy):                      
    switchApp(app)                                
    corner = find(Pattern(enter image description here).targetOffset(3,14)) 
                                                  
    drop_point = corner.getTarget().offset(dx, dy)
    dragDrop(corner, drop_point)                  
                                                  
resizeApp("Safari", 50, 50)                      

这比上面链接的文章中提到的将DLL注入正在调试的进程中的技术要容易得多。 Sikuli完全在UI级别运行,因此您无需修改​​自动化的程序,也不必担心内部更改会破坏您的脚本。

有一点是处理文本有点差;它具有OCR功能,但它们并不是那么好。但是,如果文本是可选的,您可以选择文本,复制文本,然后直接查看剪贴板。

如果我要编写一个机器人来自动化没有良好API或基于文本的界面的东西,Sikuli可能是我想要达到的第一个工具。

答案 1 :(得分:6)

这个答案来自我的评论。

你想要做的事情很难,无论如何都要努力去做 可以说,最简单的方法是完全模仿用户。因此应用程序按下按钮,移动鼠标等。这样做的缺点是它依赖于能够识别屏幕 如果您可以更改游戏文件,则更容易,因为您可以将所需的卡片(将图像(纹理))更改为单一的唯一颜色。
主要的缺点是你必须将游戏作为顶级窗口或让游戏在虚拟机中运行。这两者都不是理想的。

另一种方法是读取进程内存。您可能能够找到一个内存位置列表,这将使事情变得更简单,否则它涉及大量的辛勤工作,一个调试器来推断内存地址。它也有助于(很多)能够理解装配。

第三种方法是拦截数据包并改变它们。这比上面的方法(至少对我来说)更容易反转引擎协议,因为你需要处理的信息较少。只需设置数据包嗅探器并使用一个不同的变量(例如,卡)执行操作并比较差异即可。

您需要检查的是您没有违反EULA。我不知道游戏是如何运作的,但是我遇到的大多数游戏都有一个EULA禁止(即你被禁止)做我提到的任何事情。