Как сделать (создать) бот программу(кликер)?

               Итак в этой статье я продемонстрирую как создать простого бота основанного на визуальном поиске объектов на экране. Преимуществом данного метода является «незаметность» для различных систем защиты от ботов. Для написания бота мы естественно будем использовать специализированную среду для разработки ботов NOMAD BoT. Если боты создаются для того чтобы сэкономить ваше время на совершение однообразных рутинных действий, то NOMAD создан для того, чтобы сэкономить ваше время при написании бота.  В сравнении с написанием ботов на неспециализированных средах программирования или на не очень специализированных разработка на NOMAD может происходить в десятки, а то и в сотни раз быстрее. (т.к. для начала вам еще придется разработать инструменты обнаружения объектов, которые в NOMAD  уже встроены готовые). Скачать дистрибутив NOMAD с уже установленным ботом из этой статьи вы можете по этой ссылке (внимание! настройки программы в дистрибутиве рассчитаны на установку его в папку по умолчанию, если вы устанавливаете его в другое место, то измените пути к базе и конструктору с проигрывателем!)

Управлять многими — то же, что управлять немногими. Дело в организации.

Сунь Цзы

           Нашей задачей сейчас является демонстрация того, как делается бот программа, а потому для автоматизации мы выберем что-нибудь простое и в то же время всем доступное, например, Калькулятор. Конечно это не онлайн игра, но поверьте, создание бота для онлайн игры ничем не отличается. (внимание пример работает в Windows 8 и Windows 7, причем калькулятор должен выглядеть как на скриншоте, который есть ниже по тексту, т.е. например, в Windows XP калькулятор называется и выглядит иначе, и потому там бот работать не будет)

           Для того чтобы начать играть «автоматически» в что нибудь нам необходимо пройти следующие этапы:

  1. Сформулировать для себя задачу. Каких целей должен достигать наш бот. 
  2. Какие действия он должен выполнять для этого?
  3. Исходя из задачи определить какие объекты он должен видеть,  и каким образом, и на какие события реагировать для достижения целей описанных в пункте 1.
  4. Создание алгоритма.
  5. Программирование.

         Задачей нашего бота будет бесконечно складывать  на калькуляторе 2 числа 59 и 3.

         Для достижения нашей цели нам необходимо, чтобы наша программа нажимала на кнопки 5 и 9 калькулятора, а в случае успеха на кнопку + и кнопку 3 и затем кнопку =

         Следовательно эти объекты мы и должны будем искать на изображении, а затем тыкать в них мышью. Также мы будем анализировать число 59 и число 0 в поле результата, а также кнопку CE, для того чтобы сбросить вычисления на 0 перед началом очередной итерации.

          Итак, наш алгоритм: В бесконечном цикле сначала ищем и жмем мышью на кнопку 5, и на кнопку 9. В случае успеха делаем паузу 3 секунды (чтобы успеть насладиться результатом). Затем проверяем есть ли у нас изображение числа 59, если есть то  находим и кликаем мышью на кнопки + и 3 калькулятора, если эти операции также выполнены успешно, то находим и кликаем по кнопке = калькулятора. После чего спим 5 секунд. Затем проверяем, если в поле результата нет картинки 0, значит необходимо нажать кнопку CE, чтобы сбросить результаты предыдущих вычислений.  После чего итерация повторяется. При нажатии кнопки Esc программа останавливается.

Продемонстрируем код программы которая у нас получилась:

            Тут мы забежали немного вперед, написав сразу код, т.к. в NOMAD сначала необходимо создать шаблоны изображений которые мы будем искать. Так если посмотреть в код, то можно увидеть следующие записи:  five,nine,fiftynine,plus,three,equal,zero,CE — что это? а это собственно и есть те шаблоны, в NOMAD с ними можно работать из кода как с объектами, т.е. пишем имя объекта в коде и вызываем его метод, например: FindPicture — найти изображение шаблона, MouseClick(‘l’) — найти изображение шаблона и кликнуть левой кнопкой мыши по нему. Для того чтобы подробно изучить возможности и функции NOMAD рекомендую обратиться к документации. А сейчас я в кратце опишу как нам создать недостающие шаблоны:

Во первых создадим базу данных, для этого в Launcher нажмем кнопку ADD, в открывшимся окне заполним в первом поле имя базы данных (например Калькулятор), и во втором поле укажем каталог где мы хотим хранить все что мы напрограммировали. Т.е. собственно исходник нашей программы, или иными словами базу данных. Далее жмем кнопку Save и в списке у нас должна появится запись. Выбираем ее и  жмем кнопку Constructor.

Во вторых нужно создать и настроить это конвеер скриншотов, объект который отвечает за фотографирование окна в нашем случае окна калькулятора. Итак, открываем программу в режиме Constructor, в открывшемся окне справа мы должны увидеть такую картину:

ObjectTree

На пункте выделенном на картинке голубым цветом жмем правой кнопкой мыши и выбираем пункт меню «добавить конвеер скриншотов». В появившемся окошке указываем его имя — «Calc». И нажимаем кнопку Input. После чего объект с таким именем должен появиться в дереве объектов в разделе ScreenShotPipe. Найдем его там и кликнем на нем левой кнопкой мыши. В левой части программы появится окошко следующего вида (свойства могут идти в другом порядке):

CalcIO

Я уже заполнил его так как оно должно выглядеть у вас. Фактически все уже указанно необходимо только в поле WindName написать слово Калькулятор. Все конвеер готов и мы можем приступать к созданию шаблонов, где я и расскажу зачем вообще мы делали этот конвеер.

 В третьих запустим калькулятор и сделаем его снимок, для того чтобы сделать снимок необходимо нажать кнопку ScreenShot  в левом верхнем углу Конструктора. После этого у нас появится окно TV со снимком экрана. Теперь нам необходимо нажать кнопку Cut и выделить в окне TV  наш калькулятор, результатом этих действий должно быть окно TV с изображением калькулятора.

CalcTV

Нажимаем кнопку Borders (примечание. с момента написания этой статьи в программе появился режим FixBorders (кнопка черный мониторчик с луной), рекомендую использовать именно его. Используется он точно также как Borders, но работает на динамических изображениях гораздо стабильнее) и начинаем делать шаблоны. Объясню как это делается на примере шаблона для кнопки «+» — мы должны выбрать на изображении самый характерный его участок, который не повторяется в других местах. Собственно и выбираем сам символ +, нажимаем на кнопку Select, и выделяем этот знак в квадратик:

calcTempTV

Кликаем правой кнопкой мыши внутри пунктирного квадратика и у нас появляется окно:

insert

в поле имя которого мы пишем «plus» (так как этот объект у нас в коде был написан) и жмем Input. В разделе Templates дерева объектов у нас появился объект с таким именем. Нажмем на него и  слева появится уже знакомое нам окошко:

calcOITemp

Тут нам нужно поменять свойство ConnectedScreen  в нем мы должны выбрать конвеер скриншотов который мы создавали вначале, т.к. по умолчанию тут выбран глобальный конвеер, который фотографирует весь рабочий стол целиком, а не только наш калькулятор. На этом минимальная настройка шаблона закончена и думаю нам этого будет достаточно. Более подробно об этом можно узнать в документации. Вам лишь осталось поступить аналогичным образом со всеми остальными объектами, которые мы должны добавить в шаблоны. После добавления всех шаблонов дерево объектов должно выглядеть следующим образом:

OIFullTree

 

Очень важно, чтобы наименования в точности включая регистр ввода соответствовали тому, что вы видите на картинке. В примере шаблоны five и nine сделаны другим способом, в режиме ColMap, за подробностями того как это делается предлагаю обратиться к документации. На работу кода программы это не окажет особого влияния и вы можете сделать все шаблоны тем же образом как и шаблон кнопки +. А можете ничего не делать, и скачать готовый дистрибутив с примером :-)

Для того чтобы создать шаблоны fiftynine и zero необходимо делать шаблон участка калькулятора выделенного на картинке:

calcshot  

 По шаблонам все. 

3) Еще нам необходимо создать графический интерфейс программы через который она будет общаться с пользователем. Для этого необходимо в Конструкторе программы войти в меню «Окна» и выбрать пункт  «Дизайнер Формы»

 FormDesigner

 

Откроется окно с формой, на которой нужно дважды щелкнуть и из открывшегося окна добавить объект Button в обоих полях формы пишем Start. Жмем ОК и выходим из формы, а на главной форме у нас появилась кнопка Start,  нажимаем на нее и появляется опять меню свойств, жмем на закладку Events и видим следующее:

OIButton

 

В колонке Value на против события OnClick дважды щелкаем мышью, и в Value автоматически заполняется значение на картинке выше. А в центральном окне появляется текстовый редактор:

TextEditor

Вот этот текст мы и должны заменить кодом, который я привел в начале статьи. Все теперь программа готова. Для запуска необходимо сохранить программу нажав кнопку с изображением двух дискет, затем откомпилировать программу нажав кнопку с картинкой перекрещенных отвертки и ключа, а затем нажать кнопку Launch, или запустить ее из лаунчера. Из конструктора программа всегда запускается в отладочном режиме, поэтому будут показываться отладочные сообщения. Если мы все сделали верно то должны увидеть окно с кнопкой которое мы создали:

runtime

Запускаем калькулятор, делаем его видимым на рабочем столе и жмем кнопку старт. Когда надоест жмем кнопку Esc, и ждем сообщения о том что программа закончена.

Вот и все. Сложно? Делать это на обычном языке программирования сложнее в разы. Лично у меня написание этого бота заняло не более получаса, чего не могу сказать об этой статье.

Другие примеры ботов можно поискать на форуме http://nomadbot.com/forum/index.php например, тут

Как сделать (создать) бот программу(кликер)?: 19 комментариев

  1. Приветствую, отличная статья!
    Все получилось, но есть несколько вопросов.
    Как заставить мышку двигаться на много быстрее, а то
    все очень медленно происходит?
    Возможно ли с вами связаться лично?

    1. 1) Вы скачали обновление? В новых версиях мышка двигается быстро. В Launcher нажать кнопку Update.
      2) Зарегистрироваться на форуме и отправить мне личное сообщение.

  2. Как сделать так, чтобы бот кликал только при 100% распозновании

    1. Свойство «к» в итеме шаблона должно быть = 1, тогда будет при 100%. На динамически меняющихся изображениях 100% достигнуть сложно.

  3. Я пытался создать бота для сайта, но заметил странную вещь, на красивых тяжелых сайтах с движущимися элементами на скриншотах в режиме borders границы становятся толще, а если сначала сохранить этот же скриншот сайта в паинте, а потом заскринить в программе, то в borders все по другому, или если закрыть вкладку с сайтом и потом заскринить то тоже все нормально.
    Еще хотелось бы узнать какой код нужно написать чтобы программа одновремено нажимала несколько кнопок, ну или по очереди нажимала и удерживала, а потом по очереди отпускала. Например вызывала диспетчер задач.

    1. 1) В режиме borders результат зависит от общей яркости изображения. Поэтому если она существенно меняется, то меняются и формы границ. Т.е. данный фильтр существенно снижает чувствительность к изменению цветов, но не исключает ее полностью.
      2) функции KeyDown, KeyUp шаблона. или WinApi функции.

  4. Может ли программа двигать курсором удерживая при этом лкм?

  5. Скажите пожалуйста, можно ли сделать так чтобы программа нажимала какую либо клавишу. Например, я знаю, что можно написать Katrinka.KeyPress(75);, но я бы хотел чтобы программа сразу нажимала, а не искала сначала картинку .

    1. KeyPress и прочие команды клавиатуры не ищут картинку, т.к. в этом нет смысла. Почему был сделан такой вывод?

      по поводу использования режима «borders» рукомендую ознакомится с этим

      1. Понятно. А почему курсор передвигается медленно?
        Например, заданы 10 координат в цикле repeat на которые нужно нажать, программа нажимает на все секунд через 10.

        1. кнопка update в launcher активна? тогда ее нужно нажать. Если программа фиксирует движение мышью, которое сделал пользователь, она становится на паузу на 10 секунд, чтобы дать пользователю сделать свои дела. В остальных случаях задержек быть не должно, в любом случае изображение не может искаться 10 секунд, это слишком долго. Поэтому я пока не понял проблему.

          1. Я сделал цикл repeat из 15 шт. MOUSECLICKINCOORD(…); цикл один раз проходит примерно в течение 7 секунд. И чем больше расстояние между координатами тем больше задержка. Можно ли сделать так, чтобы этот цикл проходил несколько раз в секунду?

          2. Между нажатием и отпусканием кнопки может быть пауза до 500 миллисекунд, 10 раз это уже 5 секунд…в принципе могу уменьшить паузу.

  6. У меня была такая задача: есть что- то вроде игры, где есть прямоугольник , например, 4на4из картинок. Картинки меняются раз в секунду. Есть 8 нужных на которые нужно нажать и 8 не нужных. Как можно это реализовать? Программа если и находит их, то не успевает на них нажимать.

Комментарии запрещены.

Bot Development Engine