Pull to refresh

Простой Java бот-кликер на примере игры World of Warcraft 3.3.5a

Reading time 5 min
Views 17K
Данный механизм тестировался исключительно на пиратском сервере, потому его работоспособность на официальных серверах не гарантирована.

Все попытки применения — исключительно на свой страх и риск.

Реализация приведена для Windows десктопов.

Итак, создадим простой бот, целью которого будет:

1) зайти в игру;
2) зайти в аккаунт;
3) зайти в игровой мир;
4) открыть почтовый ящик;
5) сформировать и отправить письмо другому игроку;

1) Зайти в игру


Для того чтобы зайти в игру, нам нужно собственно иметь заранее скачанный клиент игры.
В работе мы используем exe файл Wow.exe. Запишем его путь следующим образом:

String WowPatch="D:/Wow/Wow.exe";

Здесь мы записали путь к исполняющему файлу Wow. У Вас этот путь вероятно будет отличаться.

Путь — это конечно хорошо, но этого мало, для того чтобы запустить игру.

Для запуска нам потребуется вот такой код:

String WowPatch="D:/Wow/Wow.exe";
File file =new File(WowPatch);
try {
      Desktop.getDesktop().open(file);
      } 
	catch (IOException e1) 
	{
		e1.printStackTrace();
	}

В результате применения вышеуказанного кода, у вас на компьютере должен запуститься WoW.

WoW мы запустили и тут же столкнулись с новой проблемой — Как сделать так чтобы бот автоматически ввел логин и пароль от аккаунта?

2) Зайти в аккаунт


Теперь? нам нужно записать еще две текстовых переменных.

String Login="YourLogin";
String Password="YourPassword";

Здесь мы записали Логин и Пароль от аккаунта в который собираемся войти. Однако если мы используем из сразу после той части коде, где мы входим в игру — будет неприятность. А все потому, что наш бот будет выполнять код не зависимо от того, загрузился ли Варкрафт, а игре нужно некоторое время для загрузки, если вы работаете на слабом ПК то времени потребуется еще больше.

Чтобы логин и пароль не «ввелись» раньше времени, мы сделаем паузу в нашем коде:

String WowPatch="D:/Wow/Wow.exe";
File file =new File(WowPatch);
try {
      Desktop.getDesktop().open(file);
      } 
	catch (IOException e1) 
	{
		e1.printStackTrace();
	}
Thread.sleep(20000);
String Login="YourLogin";
String Password="YourPassword";

Здесь мы сделали паузу на 20 сек. У меня этого времени хватает более чем, чтобы загрузился WoW. Стоит отметить, что сразу после загрузки WoW мы уже имеем по умолчанию выбранным поле для логина. Все что нам теперь нужно сделать — скопировать логин из нашей переменной в буфер обмена и вставить в поле для логина:

Robot rb= new Robot();

StringSelection stringSelection = new StringSelection(Login);
Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard();
clpbrd.setContents(stringSelection, null);

rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);

Здесь мы скопировали наш Логин в буфер обмена и сымитировав нажатие комбинации Ctrl+V, вставили логин в соответствующее окно.

Теперь нам нужно переключится на окошко для ввода пароля. Это можно сделать двумя путями:

— Мы можем сымитировать движение мыши и клик по второму окошку.
— Мы можем переключиться, сымитировав нажатие на кнопку Tab.

Мы воспользуемся вторым вариантом, так как он проще:

rb.keyPress(KeyEvent.VK_TAB);
rb.keyRelease(KeyEvent.VK_TAB);

Далее скопируем в буфер обмена наш пароль и вставим его:

StringSelection stringSelection2 = new StringSelection(Password);
Clipboard clpbrd2 = Toolkit.getDefaultToolkit().getSystemClipboard();
clpbrd2.setContents(stringSelection2, null);
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);

Ура!!! Мы вошли в меню выбора персонажа. Теперь нужно войти в игровой мир.

3) Зайти в игровой мир


Теперь мы видим на экране меню выбора персонажа. Мы пожалуй не будем особо перебирать и зайдем на первого попавшегося персонажа.

Для того, чтобы войти, мы можем использовать два разных варианта:

— Переместить курсор мыши на кнопку «Войти» и сымитировать клик;
— Сымитировать нажатие на кнопку Enter;

Второй вариант проще, но если мы допишем нажатие сразу после функции входа, то снова будут неприятности, потому снова сделаем паузу, давая игре спокойно зайти в меню выбора персонажа:

Thread.sleep(5000);
rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);

Мне 5 сек. хватает с головой.

О чудо, пошла загрузка игрового мира!

4) Открыть почтовый ящик


Здесь нам снова придется сделать паузу, дабы WoW успел загрузить игровой мир. Так же желательно предварительно подготовить персонажа:

— Максимально приблизить камеру;
— Стать лбом в почтовый ящик;

Для того чтобы открыть почтовый ящик, нужно крикнуть по нему правой кнопкой мыши. Для этого мы переместим курсор мыши и сымитируем клик:


Thread.sleep(30000);
rb.mouseMove(700, 350);
rb.mousePress(InputEvent.BUTTON3_MASK);
rb.mouseRelease(InputEvent.BUTTON3_MASK);

Учитывайте, что позиция мыши указанная мной, рассчитана на разрешение экрана 1366х768.
BUTTON3 — это именно правая кнопка мыши.

Почтовый ящик открыли, теперь перейдем в вкладку «Отправить»:

rb.mouseMove(200, 550);
rb.mousePress(InputEvent.BUTTON1_MASK);
rb.mouseRelease(InputEvent.BUTTON1_MASK);

Здесь мы не только имитировали перемещение мыши по экрану, но и сделали клик левой кнопкой мыши.

Теперь самое время заполнить и отправить письмо!

5) Сформировать и отправить письмо другому игроку


Теперь нам нужно заполнить пункты:

— Имя получателя;
— Тема сообщения;
— Текст сообщения;

String Name="Name";
String Theme="Theme";
String Text="Text";

Для начала поместим в буфер обмена, имя персонажа и вставим его в соответствующую графу:

StringSelection stringSelection3 = new StringSelection(Name);
Clipboard clpbrd3 = Toolkit.getDefaultToolkit().getSystemClipboard();
clpbrd3.setContents(stringSelection3, null);

rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);

rb.keyPress(KeyEvent.VK_TAB);
rb.keyRelease(KeyEvent.VK_TAB);

Мы вставили имя получателя и переключились на другую графу. Теперь нужно вставить тему сообщения:

StringSelection stringSelection4 = new StringSelection(Theme);
Clipboard clpbrd4 = Toolkit.getDefaultToolkit().getSystemClipboard();
clpbrd4.setContents(stringSelection4, null);

rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);

rb.keyPress(KeyEvent.VK_TAB);
rb.keyRelease(KeyEvent.VK_TAB);

Вставили тему сообщения и переключились на третью графу — текст сообщения:

StringSelection stringSelection5 = new StringSelection(Text);
Clipboard clpbrd5 = Toolkit.getDefaultToolkit().getSystemClipboard();
clpbrd5.setContents(stringSelection5, null);

rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);

Вставили текст сообщения. Теперь только осталось нажать на кнопку «Отправить»:

rb.mouseMove(200, 520);
rb.mousePress(InputEvent.BUTTON1_MASK);
rb.mouseRelease(InputEvent.BUTTON1_MASK);

Переместили курсор и нажали левой кнопкой мыши на «Отправить».

Вот собственно и все. Надеюсь, это было полезно хоть кому-то. Так же очень надеюсь, что данная статья не была воспринята как руководство к действию и не приведет к увеличению количества спама в игре.
Tags:
Hubs:
+4
Comments 12
Comments Comments 12

Articles