用于在线游戏的 Java 机器人
Posted
技术标签:
【中文标题】用于在线游戏的 Java 机器人【英文标题】:Java bot for an online game 【发布时间】:2012-08-26 18:07:42 【问题描述】:我正在使用java.awt.Robot
在 java 中创建一个机器人。该机器人在浏览器上运行良好(我也使用 Microsoft Word 对其进行了测试!)但是当我在游戏中运行它时,唯一可以运行的函数是 mouseMove
。我想为我构建一个只需按下键盘按钮的机器人。
我实例化机器人类
Robot r = new Robot();
然后我做一些简单的事情: 按z,按1,移动鼠标右键。
r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);
r.keyPress(KeyEvent.VK_1);
System.out.println("Press 1 button");
r.keyRelease(KeyEvent.VK_1);
System.out.println("Release 1 button");
r.delay(1000);
System.out.println("Move mouse");
r.mouseMove(110, 690);
System.out.println("Press");
r.mousePress(InputEvent.BUTTON3_MASK);
System.out.println("Release");
r.mouseRelease(InputEvent.BUTTON3_MASK);
为什么会这样?如果这个 Robot 类在后台运行,它可以在游戏中执行这些动作吗?
谢谢
更新:例如,如果我在 PES 2012 上运行我的机器人,它可以正常工作,但如果我在像阴谋集团这样的在线游戏上运行它,它就不能工作?游戏的保护系统没有检测到任何东西,所以情况并非如此。
【问题讨论】:
游戏经常对机器人进行“防御”——这只是一种可能性。 尝试在keyPress
和keyRelease
事件之间添加几毫秒的延迟。如果这是一款普通的街机风格游戏,那么我敢打赌,该游戏只是轮询每个滴答声以查看按键是否当前按下,而不是捕捉诸如“按键按下”和“按键释放”之类的瞬时事件.
试过了,还是不行……
Java: use Robot while running fullscreen app 的可能重复项
也许不是,我觉得这家伙对游戏中运行的机器人有问题……我认为这也是游戏对机器人的防御系统。
【参考方案1】:
这在很大程度上取决于它是什么类型的游戏。 如果代码只是模拟键盘操作等系统输入。它应该看起来像一个普通人。
但是从它的外观来看。从你的例子。它以闪电般的速度运行,因此它可能根本没有检测到输入,和/或反机器人措施对你试图机器人的所谓游戏进行了测量。正在阻塞输入。将延迟混合在一起。看看是否有帮助。我会回来寻求更多帮助。这点我不专业。但这是我的最佳猜测。
编辑:
当我的意思是延迟在触发按键事件之前放置一个延迟。这样它就有时间处理按键。
【讨论】:
没有。没用我在按键事件触发器之间添加了一些延迟【参考方案2】:首先,大多数游戏都有机器人保护,因此请确保为机器人添加延迟,也许还有“冷却时间”。在r.delay(1000)
声明之前,机器人做了两个即时操作。
我几乎可以肯定它不起作用,因为击键速度太快了:它们会立即按下并释放。在你实例化 Robot 类之后尝试添加bot.delay(500)
(或更多,取决于游戏);在所有按键功能之前。这会在机器人完成的所有动作之间增加 500 毫秒的延迟。
public static void doStuff()
Robot r = new Robot();
r.delay(500); //Or more - depends on the game
r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);
r.keyPress(KeyEvent.VK_1);
System.out.println("Press 1 button");
r.keyRelease(KeyEvent.VK_1);
System.out.println("Release 1 button");
r.delay(1000);
System.out.println("Move mouse");
r.mouseMove(110, 690);
System.out.println("Press");
r.mousePress(InputEvent.BUTTON3_MASK);
System.out.println("Release");
r.mouseRelease(InputEvent.BUTTON3_MASK);
我认为 Z 和 1 键不起作用的唯一原因是完成所有操作的速度。游戏可能有一个反机器人系统。
【讨论】:
【参考方案3】:您的代码可能会在游戏中过快地按下和释放按键。 经常有游戏要求您至少延迟 40 毫秒至 80 毫秒来按下和释放键。试试这个应该会有所帮助 -
public static void doSomething() throws Exception
Robot rbt = new Robot();
int typingTimes = 20;
while(timer-- > 0)
rbt.keyPress(KeyEvent.VK_1);
//You can use Thread.sleep() after each keyPress to increase the delay
Thread.sleep(500);
rbt.keyRelease(KeyEvent.VK_1);
rbt.keyPress(KeyEvent.VK_Z);
//You can use Robot's delay() method after each keyPress too
rbt.delay(500);
rbt.keyRelease(KeyEvent.VK_Z);
希望这会有所帮助!
【讨论】:
以上是关于用于在线游戏的 Java 机器人的主要内容,如果未能解决你的问题,请参考以下文章
如何为 gtalk 创建一个搜索在线帮助 Java 的机器人?