Итак в этой статье я продемонстрирую как создать простого бота основанного на визуальном поиске объектов на экране. Преимуществом данного метода является «незаметность» для различных систем защиты от ботов. Для написания бота мы естественно будем использовать специализированную среду для разработки ботов NOMAD BoT. Если боты создаются для того чтобы сэкономить ваше время на совершение однообразных рутинных действий, то NOMAD создан для того, чтобы сэкономить ваше время при написании бота. В сравнении с написанием ботов на неспециализированных средах программирования или на не очень специализированных разработка на NOMAD может происходить в десятки, а то и в сотни раз быстрее. (т.к. для начала вам еще придется разработать инструменты обнаружения объектов, которые в NOMAD уже встроены готовые). Скачать дистрибутив NOMAD с уже установленным ботом из этой статьи вы можете по этой ссылке (внимание! настройки программы в дистрибутиве рассчитаны на установку его в папку по умолчанию, если вы устанавливаете его в другое место, то измените пути к базе и конструктору с проигрывателем!)
как написать вирус из 9 символов
5.9 MiB
5920 Downloads
Детали
Управлять многими — то же, что управлять немногими. Дело в организации.
Нашей задачей сейчас является демонстрация того, как делается бот программа, а потому для автоматизации мы выберем что-нибудь простое и в то же время всем доступное, например, Калькулятор. Конечно это не онлайн игра, но поверьте, создание бота для онлайн игры ничем не отличается. (внимание пример работает в Windows 8 и Windows 7, причем калькулятор должен выглядеть как на скриншоте, который есть ниже по тексту, т.е. например, в Windows XP калькулятор называется и выглядит иначе, и потому там бот работать не будет)
Для того чтобы начать играть «автоматически» в что нибудь нам необходимо пройти следующие этапы:
- Сформулировать для себя задачу. Каких целей должен достигать наш бот.
- Какие действия он должен выполнять для этого?
- Исходя из задачи определить какие объекты он должен видеть, и каким образом, и на какие события реагировать для достижения целей описанных в пункте 1.
- Создание алгоритма.
- Программирование.
Задачей нашего бота будет бесконечно складывать на калькуляторе 2 числа 59 и 3.
Для достижения нашей цели нам необходимо, чтобы наша программа нажимала на кнопки 5 и 9 калькулятора, а в случае успеха на кнопку + и кнопку 3 и затем кнопку =
Следовательно эти объекты мы и должны будем искать на изображении, а затем тыкать в них мышью. Также мы будем анализировать число 59 и число 0 в поле результата, а также кнопку CE, для того чтобы сбросить вычисления на 0 перед началом очередной итерации.
Итак, наш алгоритм: В бесконечном цикле сначала ищем и жмем мышью на кнопку 5, и на кнопку 9. В случае успеха делаем паузу 3 секунды (чтобы успеть насладиться результатом). Затем проверяем есть ли у нас изображение числа 59, если есть то находим и кликаем мышью на кнопки + и 3 калькулятора, если эти операции также выполнены успешно, то находим и кликаем по кнопке = калькулятора.
5 способов превратить унылую жизнь в грандиозный проект | Ева Кац | TEDxMuravyovAmurPark
После чего спим 5 секунд. Затем проверяем, если в поле результата нет картинки 0, значит необходимо нажать кнопку CE, чтобы сбросить результаты предыдущих вычислений. После чего итерация повторяется. При нажатии кнопки Esc программа останавливается.
Продемонстрируем код программы которая у нас получилась:
Delphi/Pascal
Procedure StartOnClick ( ) ;
while ( getasynckeystate ( $ 1B ) = 0 ) do //цикл продолжается пока не нажмут Esc++
if five . MouseClick ( ‘l’ ) and nine . MouseClick ( ‘l’ ) then //если успешно нажали пять и 9 то
sleep ( 3000 ) ; //спим 3 секунды
if fiftynine . FindPicture then //если нашли 59, то прибавим к ним 3:
if plus . MouseClick ( ‘l’ ) and three . MouseClick ( ‘l’ ) then //если получилось нажать плюс 3, то жмем на равно
equal . MouseClick ( ‘l’ ) ;
sleep ( 5000 ) ; //спим 5 секунд
if not zero . FindPicture then //если на табло нет нуля
CE . MouseClick ( ‘l’ ) ; //то жмем CE
Application . ProcessMessages ; //принудительно обрабатывает
//сообщения пришедшие в окно за время работы, например
//сообщение о нажатии клавиши Esc. Если не вызывать то
//программа может «подвисать», плохо реагировать на нажатия Esc и т.п.
end ; //цикл продолжается пока не нажмут Esc —
ShowMessage ( ‘Программа остановлена!’ ) ;
Тут мы забежали немного вперед, написав сразу код, т.к. в NOMAD сначала необходимо создать шаблоны изображений которые мы будем искать. Так если посмотреть в код, то можно увидеть следующие записи: five,nine,fiftynine,plus,three,equal,zero,CE — что это? а это собственно и есть те шаблоны, в NOMAD с ними можно работать из кода как с объектами, т.е. пишем имя объекта в коде и вызываем его метод, например: FindPicture — найти изображение шаблона, MouseClick(‘l’) — найти изображение шаблона и кликнуть левой кнопкой мыши по нему. Для того чтобы подробно изучить возможности и функции NOMAD рекомендую обратиться к документации. А сейчас я в кратце опишу как нам создать недостающие шаблоны:
Во первых создадим базу данных, для этого в Launcher нажмем кнопку ADD, в открывшимся окне заполним в первом поле имя базы данных (например Калькулятор), и во втором поле укажем каталог где мы хотим хранить все что мы напрограммировали. Т.е. собственно исходник нашей программы, или иными словами базу данных. Далее жмем кнопку Save и в списке у нас должна появится запись. Выбираем ее и жмем кнопку Constructor.
Во вторых нужно создать и настроить это конвеер скриншотов, объект который отвечает за фотографирование окна в нашем случае окна калькулятора. Итак, открываем программу в режиме Constructor, в открывшемся окне справа мы должны увидеть такую картину:
На пункте выделенном на картинке голубым цветом жмем правой кнопкой мыши и выбираем пункт меню «добавить конвеер скриншотов». В появившемся окошке указываем его имя — «Calc». И нажимаем кнопку Input. После чего объект с таким именем должен появиться в дереве объектов в разделе ScreenShotPipe. Найдем его там и кликнем на нем левой кнопкой мыши. В левой части программы появится окошко следующего вида (свойства могут идти в другом порядке):
Я уже заполнил его так как оно должно выглядеть у вас. Фактически все уже указанно необходимо только в поле WindName написать слово Калькулятор. Все конвеер готов и мы можем приступать к созданию шаблонов, где я и расскажу зачем вообще мы делали этот конвеер.
В третьих запустим калькулятор и сделаем его снимок, для того чтобы сделать снимок необходимо нажать кнопку ScreenShot в левом верхнем углу Конструктора. После этого у нас появится окно TV со снимком экрана. Теперь нам необходимо нажать кнопку Cut и выделить в окне TV наш калькулятор, результатом этих действий должно быть окно TV с изображением калькулятора.
Нажимаем кнопку Borders ( примечание. с момента написания этой статьи в программе появился режим FixBorders (кнопка черный мониторчик с луной), рекомендую использовать именно его. Используется он точно также как Borders, но работает на динамических изображениях гораздо стабильнее ) и начинаем делать шаблоны. Объясню как это делается на примере шаблона для кнопки «+» — мы должны выбрать на изображении самый характерный его участок, который не повторяется в других местах. Собственно и выбираем сам символ +, нажимаем на кнопку Select, и выделяем этот знак в квадратик:
Кликаем правой кнопкой мыши внутри пунктирного квадратика и у нас появляется окно:
в поле имя которого мы пишем «plus» (так как этот объект у нас в коде был написан) и жмем Input. В разделе Templates дерева объектов у нас появился объект с таким именем. Нажмем на него и слева появится уже знакомое нам окошко:
Тут нам нужно поменять свойство ConnectedScreen в нем мы должны выбрать конвеер скриншотов который мы создавали вначале, т.к. по умолчанию тут выбран глобальный конвеер, который фотографирует весь рабочий стол целиком, а не только наш калькулятор. На этом минимальная настройка шаблона закончена и думаю нам этого будет достаточно. Более подробно об этом можно узнать в документации. Вам лишь осталось поступить аналогичным образом со всеми остальными объектами, которые мы должны добавить в шаблоны. После добавления всех шаблонов дерево объектов должно выглядеть следующим образом:
Очень важно, чтобы наименования в точности включая регистр ввода соответствовали тому, что вы видите на картинке. В примере шаблоны five и nine сделаны другим способом, в режиме ColMap, за подробностями того как это делается предлагаю обратиться к документации. На работу кода программы это не окажет особого влияния и вы можете сделать все шаблоны тем же образом как и шаблон кнопки +. А можете ничего не делать, и скачать готовый дистрибутив с примером
Для того чтобы создать шаблоны fiftynine и zero необходимо делать шаблон участка калькулятора выделенного на картинке:
По шаблонам все.
3) Еще нам необходимо создать графический интерфейс программы через который она будет общаться с пользователем. Для этого необходимо в Конструкторе программы войти в меню «Окна» и выбрать пункт «Дизайнер Формы»
Откроется окно с формой, на которой нужно дважды щелкнуть и из открывшегося окна добавить объект Button в обоих полях формы пишем Start. Жмем ОК и выходим из формы, а на главной форме у нас появилась кнопка Start, нажимаем на нее и появляется опять меню свойств, жмем на закладку Events и видим следующее:
В колонке Value на против события OnClick дважды щелкаем мышью, и в Value автоматически заполняется значение на картинке выше. А в центральном окне появляется текстовый редактор:
Вот этот текст мы и должны заменить кодом, который я привел в начале статьи. Все теперь программа готова. Для запуска необходимо сохранить программу нажав кнопку с изображением двух дискет, затем откомпилировать программу нажав кнопку с картинкой перекрещенных отвертки и ключа, а затем нажать кнопку Launch, или запустить ее из лаунчера. Из конструктора программа всегда запускается в отладочном режиме, поэтому будут показываться отладочные сообщения. Если мы все сделали верно то должны увидеть окно с кнопкой которое мы создали:
Запускаем калькулятор, делаем его видимым на рабочем столе и жмем кнопку старт. Когда надоест жмем кнопку Esc, и ждем сообщения о том что программа закончена.
Вот и все. Сложно? Делать это на обычном языке программирования сложнее в разы. Лично у меня написание этого бота заняло не более получаса, чего не могу сказать об этой статье.
Другие примеры ботов можно поискать на форуме http://nomadbot.com/forum/index.php например, тут
Как сделать (создать) бот программу(кликер)?: 19 комментариев
Александр :
Приветствую, отличная статья!
Все получилось, но есть несколько вопросов.
Как заставить мышку двигаться на много быстрее, а то
все очень медленно происходит?
Возможно ли с вами связаться лично?
adminbot :
1) Вы скачали обновление? В новых версиях мышка двигается быстро. В Launcher нажать кнопку Update.
2) Зарегистрироваться на форуме и отправить мне личное сообщение.
Дмитрий :
Как сделать так, чтобы бот кликал только при 100% распозновании
adminbot :
Свойство «к» в итеме шаблона должно быть = 1, тогда будет при 100%. На динамически меняющихся изображениях 100% достигнуть сложно.
Дмитрий :
Я пытался создать бота для сайта, но заметил странную вещь, на красивых тяжелых сайтах с движущимися элементами на скриншотах в режиме borders границы становятся толще, а если сначала сохранить этот же скриншот сайта в паинте, а потом заскринить в программе, то в borders все по другому, или если закрыть вкладку с сайтом и потом заскринить то тоже все нормально.
Еще хотелось бы узнать какой код нужно написать чтобы программа одновремено нажимала несколько кнопок, ну или по очереди нажимала и удерживала, а потом по очереди отпускала. Например вызывала диспетчер задач.
adminbot :
1) В режиме borders результат зависит от общей яркости изображения. Поэтому если она существенно меняется, то меняются и формы границ. Т.е. данный фильтр существенно снижает чувствительность к изменению цветов, но не исключает ее полностью.
2) функции KeyDown, KeyUp шаблона. или WinApi функции.
Источник: nomadbot.com
Десктопное приложение на Python: UI и сигналы
Считается, что Python не лучший выбор для десктопных приложений. Однако, когда в 2016 году я собирался переходить от разработки сайтов к программному обеспечению, Google подсказал мне, что на Python можно создавать сложные современные приложения. Например blender3d, который написан на Python.
Но люди, не по своей вине используют уродливые примеры графического интерфейса, которые выглядят слишком старыми, и не понравятся молодёжи. Я надеюсь изменить это мнение в своем туториале. Давайте начнём.
Как сделать на Python простую программу для напоминания
Эта статья предназначена в первую очередь для тех, кто пока еще мало что знает о программировании, но уже хочет попробовать что-то сделать с помощью любимца мира программирования — языка Python.
Алгоритм
Программа будет очень простой:
- Спросить пользователя, о чем он хочет сделать напоминание.
- Спросить, когда (через какое время, в минутах)
- Рассчитать время ожидания (минуты умножить на секунды)
- Ожидать указанное время
- Напомнить о том, что пользователь запросил на шаге 1
Хотя алгоритм прост, реализация каждого шага может сделать это приложение очень полезным. Например, на шагах 1 и 2 можно общаться с пользователем через разные каналы: клавиатуру, голосовые приложения или приложения для обмена сообщениями. Также можно изменить сам алгоритм, например, сделать его защищенным от выключения: если ваш компьютер выключается во время шага 4, он должен знать, о чем он должен напомнить. Но пока давайте разберемся с основными настройками.
Реализация
Шаг 0: Настройка параметров
Теперь нам нужно спросить пользователя и получить ответ. В идеале нам нужен будет вот такой код:
reminder = user.ask(«What shall I remind you about?»)
И где-то в программе нужно определить значения user (пользователь) и ask (спросить). Это может быть сообщение, отправленное через Telegram, или голосовая подсказка, или, может быть, текст, который выводит у себя на экране робот, подошедший со счастливым лицом к пользователю. Реализация может быть различной, и ее лучше определить в отдельном месте нашей программы.
Но так как сейчас нам нужна простая реализация, мы прибегнем к некоторым встроенным командам:
print(«What shall I remind you about?»)
print отправляет текстовое сообщение в вывод Python по умолчанию (в нашем случае это командная строка).
text = str(input())
Это означает: взять все, что написал пользователь, интерпретировать это как текст и поместить в память под именем text . Функция input() читает все, что вводит пользователь. Функция str() преобразует в текст все, что было введено. Знак равенства означает «положить одну вещь в память под таким именем».
Шаг 2: Запрос времени
Далее нам нужно время в минутах. Вот оно:
print(«In how many minutes?») local_time = float(input())
Вторая строка означает: взять то, что набрал пользователь, интерпретировать это как число и поместить в память под именем local_time .
Шаг 3. Подсчет времени ожидания
У нас есть количество минут, в течение которых наше приложение будет ждать, прежде чем напомнить нам. Но метод Python time.sleep() требует секунд, а не минут. Поэтому теперь нам нужно преобразовать минуты в секунды:
local_time = local_time * 60
Это означает: взять все, что находится в памяти под именем local_time , умножить это на 60 и поместить в память под тем же именем.
Шаг 4. Ожидание
Теперь нам понадобится модуль времени, который мы загрузили на 0 шаге:
time.sleep(local_time)
Это следует читать так: из модуля time взять метод sleep . В памяти найти фрагмент данных под названием local_time . Обработать эту часть данных с помощью sleep и предоставить нам возможность наблюдать за результатом. Что же произойдет? У нас есть количество секунд в local_time . Мы даем это значение на обработку в sleep , и программа “спит” в течение указанного количества секунд. Мы знаем, что она спит, потому что уже прочитали справочное руководство для модуля time.
Шаг 5. Напоминание
Помните, что текст нашего напоминания хранится в памяти под именем text ? Настало время его использовать:
print(text)
Это означает: взять все, что находится в памяти под именем text и вывести на экран. Подобно шагу 1, мы могли бы установить совершенно другую реализацию отправки сообщений. Например, могли бы создать процедуру, которая выводит наше сообщение на 3D-печать в пластике или зажигает некие светодиоды формирующие образ нашего текста. Но сейчас все, что нам нужно, это только этот простой механизм, который выводит наш текст на экран монитора.
Окончательный код
Вот тот окончательный код, который будет у нас работать:
import time print(«What shall I remind you about?») text = str(input()) print(«In how many minutes?») local_time = float(input()) local_time = local_time * 60 time.sleep(local_time) print(text)
Если вы введете его в свой блокнот Jupyter и запустите (Shift + Enter), то увидите свою программу в действии:
А если вы хотите еще больше попрактиковаться в Python, то можете попробовать бесплатный курс Practicum by Yandex.
Источник: pythonist.ru