Войти
Войти
 

Регистрация

Уже есть аккаунт?
Полная версия Пикабу

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана.

в

Небольшое продолжение к предыдущему посту

https://m.pikabu.ru/story/avtomatizatsiya_rutinyi_s_autohotk...

За прошедший год мое владение скриптами немного улучшилось, в частности, теперь я могу научить скрипт распознавать изображение на экране, искать всякие кнопки, рисунки и т.д.


Давайте попробуем какую-нибудь незатейливую программу, например игрушку сапер.

Научим скрипт реагировать на нашу смерть.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Делаем скриншот, открываем Пэйнт, и выделяем небольшой кусочек желтой рожицы.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Обрезаем и сохраняем в файл smert.png. Можно сохранять и в bmp и в jpg, Autohotkey кушает их всех.

Получился вот такой небольшой файлик:

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Этот кусочек изображения и будет искать скрипт.

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

Запускаем этот скрипт:


^F1::

MouseGetPos, X, Y

Tooltip, %X% %Y%

Clipboard = %X%, %Y%

Sleep 1000

Tooltip

Return


При нажатии ctrl+F1 координаты курсора появятся на экране И скопируются в буфер обмена.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Наша задача: получить координаты вот этой области. А именно - координаты левого верхнего и правого нижнего углов. Подведите кончик курсора к ЛВ углу и нажмите Ctrl F1. Сохраните эти координаты. То же самое с ПН углом. (окно Сапера должно быть активным)

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Теперь создайте следующий скрипт:


F1::

Loop,

{

ImageSearch, xp, yp, 75, 61, 97, 83, *50 smert.png

Sleep 200

If xp > 0

Break

}

MsgBox, Muhaha!

Return


F10::ExitApp

F12::Suspend, Toggle


Если скрипт ничего не находит, то переменным xp, yp присваивается пустое значение, Null.

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

*50 отвечает за строгость поиска. *0 максимальная строгость, *255 минимальная.


F10 нужен для аварийного выхода из скрипта если вы вдруг создадите бесконечный скрипт, блокирующий ваши действия.

F12 для временного отключения/включения горячих клавиш.


Итак, расположите smert.png в одной папке со скриптом, запустите сапера, нажмите F1, и каждый 200 миллисекунд скрипт будет искать ваш файлик на экране.

Автоматизация рутины с AutoHotKey. Часть 2: Распознавание экрана. Автоматизация, AutoHotKey, Длиннопост

Готово!


Показано, конечно, на пример простой игрушки, но возможности применения поистине безграничны. Автоматизация офисных приложений, игр, промышленность, дизайнерские программы, и т.п. и т.д. на что хватит фантазии.


С уважением, netwizard.

  •  
  • 655
  •  
701 плюс 46 минусов

175 комментариев

Dialog56 
+24
 

Смотрю на всё это дело и вспоминаю себя лет эдак 4-5 назад :)
когда в diablo 3 ещё был аукцион, я запилил бота на "горячих клавишах". С 3D у него есть небольшие проблемы для распознования - но это не критично было. суть в том что бот сам за меня бегал на боса и выбивал мне дроп с голдой:)) буквально недавно решил вспомнить старые добрые и запилил на blueStacks ( эмулятор андроида ) автоматизацию игры пианино, не помню как она называется ( в крадце с верха экрана "падают" чёрные прямоугольники имитирующие ноты и на них надо нажимать до того момента пока они не скрылись под экраном, что то на подобие гитархиро) и только тогда я понял как ребята в топе рейтинга там набивают такие огромные количества очков - скорость "падения" нот приближалась к сверхпиксельной и сами ноты практически не видно - чтоб самому нажать и попасть по ним я вообще молчу :D

Fused 
+5
 

А сможете написать скрипт для tap titans что бы он сам кликал и сам прокачивал персов???

villerOrange 
+30
 
- ты доволен? Я пишу скрипт, чтобы завалить косаря!
- заткнись! Заткнись!
Раскрыть ветвь2  
+3
 

Да вроде ничего сложного. Сейчас посмотрим насколько сложный интерфейс у игры.

Раскрыть ветвь6  
0
 

Вот скрипт, который ищет сундуки. Начинает битву с боссом и сразу выходит из нее. Если найдет сундук, делает паузу 25 секунд, затем начинает процесс снова.

Раскрыть ветвь9  
0
 

На чем писали для diablo 3 ?

Dialog56 
0
 

AutoHotKey

a1da 
+5
 

Я правильно понял, что координаты берутся относительно экрана, а не окна программы и в случае если сдвинуть окно программы, то скрипт не сработает?

Wyon 
+6
 

Координаты по дефолту относительны окну программы

https://autohotkey.com/docs/commands/ImageSearch.htm

Kis4death 
+5
 
То есть если я поменяю размер окна, изменив уровень сложности, то скрипт отвалится.
Раскрыть ветвь4  
a1da 
0
 

понятно, значит относительно активному окну, спасибо.

+13
 
Следующий раз запили пост о скрипте который позволит пролайкать всю страницу в вк, включая записи на стене, фотки и видеозаписи.
+19
 

А потом, который дизлайкает все посты на страницах пикабушников

scph77008 
+9
 

W, D, W, D?

Раскрыть ветвь3  
-1
 
Просто хочу завоевать сердце одной прекрасной дамы, но все времени нет. Скрипт бы помог.
Раскрыть ветвь4  
0
 
Для этого лучше Selenium IDE использовать.
FlameHard 
0
 

У вконтакте есть АПИ, можно туда Postman'ом заслать запросы.

JusticeZZ 
+8
 

Это, конечно, прикольно, но для автоматизации есть вещи и посерьезнее. Например, RPA. Рассмотрим на примере софтины Blue Prism Automate, поскольку работаю я именно с ней.


С ее помощью можно автоматизировать что угодно, начиная от веб-приложений и заканчивая консольными приложениями мейнфреймов. Если автоматизируемое приложение слишком нестандартное, и встроенному application modeller не удается найти элеметны управления, то можно использовать surface automation, который будет попиксельно их искать как в посте ТС-а чекается статус игрока.


При этом все это можно реализовать, не написав ни одной строчки кода. В Blue Prism весь алгоритм работы робота составляется при помощи блок-схем, которые реализуют ряд простых функций типа манипуляций с элементами управления автоматизируемой программы и функций посложнее типа работы с электронной почтой, БД и т.д.


При необходимости можно реализовывать необходимый функционал при помощи небольших скриптов на C#, J# или VBA. Все это дает крайне мощные инструменты для автоматизации.

К примеру, при помощи встроенных библиотек и небольших самописных скриптов на C# можно автоматизировать MS Excel до такой степени, что человеку останется лишь только подсовывать ему новые данные для работы, а эксель сам будет себе шуршать отчеты и статистику

+6
 

а можете пост запилить? было бы интересно

0
 
К примеру, при помощи встроенных библиотек и небольших самописных скриптов на C# можно автоматизировать MS Excel до такой степени, что человеку останется лишь только подсовывать ему новые данные для работы, а эксель сам будет себе шуршать отчеты и статистику

Внезапно(!) в MS Excel есть встроеный VisualBasic + макросы которые делают все то же самое, но слегка дешевле. Ой, тоесть совсем дешево. Бесплатно.


А за те деньги, которые стоит лицензия продукта, о котором вы столько всего расписали - его макросы должны за пивом бегать пока работают.

JusticeZZ 
+1
 

Эта платформа уже имеет встроенные возможности по работе с MS Excel, которая внезапно(!) использует ту же самую либу по работе с экселем . По факту, в реалиях Blue Prism это набор реализованных небольших макросов-функций (типовые задачи вроде открытия документа, внесения туда данных и т.д.), которые "обернуты" для удобного использования внутри этой самой платформы.


Но суть не в том.


Разумеется, что если ваш кейс подразумевает только простые манипуляции небольшими объемами данных в экселе, то вам к черту не сдался этот софт и хватит за глаза одних лишь макросов.


Но если вам необходимо, к примеру, регулярно обрабатывать клиентские выгрузки объемом по нескольку десятков миллионов строк, валидировать данные, а затем разносить их по еще нескольким системам и генерить какие-либо отчеты на основе проделанной работы с минимальным вовлечением человека на основе уже существующей в вашей компании инфраструктуры (софта и прочего), то RPA - ваш выбор.


Вам не потребуется написание и последующая поддержка специфического софта для автоматизации подобной задачи, лишь описание алгоритма автоматизируемого бизнес-процесса (реализация зависит от конкретного вендора RPA-платформ). Зато у вас в сухом остатке увеличение скорости выполнения работы, минимизация ошибок, возможность уменьшения штата сотрудников или их высвобождение для выполнения каких-либо более приоритетных задач.


Это решения, ориентированные на крупные компании вроде процессинговых центров, банков и т.д., а не абстрактные ООО "Моя оборона" со штатом в три с половиной человека.

grimmASSa 
0
 

Где только эту софтину взять

JusticeZZ 
+1
 

Только купить, т.к. это enterprise решение, но и цены там соответствующие)

Раскрыть ветвь2  
+4
 

Я помню на autohotkey писал скрипт для фарма ресурсов в одной гриндилке на 5 персонажей, через распознавание цвета пикселей на мини-карте. 5 персонажей гуськом бежали на место добычи ресурсов, копали, умирали, оживали и бежали дальше. Жуткое было зрелище со стороны.

JKL88 
+3
 
Подписался. Кстати у тебя 1 год, 1 месяц 1 день и все такое. Когда-нибудь твои посты пригодятся мне, но не сегодня
+2
 

Спасибо!

+3
 

@moderator, нельзя ли перенести этот пост в Лигу Образования? Не могу сделать это при помощи редактирования.

DrugForDuck 
0
 

Можешь мне помочь с ImageSearch  и кодом в целом  ?

0
 

Попробую.

Раскрыть ветвь3  
0
 

а не проще такую фигню сделать с помощью того же Clickermann? там и поменьше строк будет для такой незатейливой задачи.

+2
 

Я лишь делюсь своим опытом. Я не ставлю задачу "отыскать наиболее простой для новичка путь и объяснить его".

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

+1
 

Здравствуй, уважаемый @netwizard !!!


спасибо огромное за посты с автоматизацией. Я ничего об этом не знал и всегда сетовал на свою некомпетентность, когда требовалось что-то такое сделать. Буду учиться. Начал вот с поиска изображения в активном окне. Заюзал твой скрипт, чуть изменив. Работает) волшебство)


F1::


Loop,


{


ImageSearch, xp, yp, 321, 869, 377, 928, *50 123.png


Sleep 3000


If xp > 0


Break


}


SoundPlay, *16


Return


F10::ExitApp


F12::Suspend, Toggle


Подскажи, как модернизировать таким образом, чтобы выполнялось постоянно, без перезапуска каждый раз кнопкой F1.

То есть, если изображение нашлось, то каждые 3 секунды было бы звуковое уведомление, до тех пор, пока изображение не исчезло, либо скрипт не поставили на паузу/закрыли


Работа с обновляемым окном браузера, такой функционал был бы наиболее удобен.

Не думаю, что это сложно, но синтаксиса не знаю совсем, и обратиться за помощью не к кому.

Спасибо заранее)

0
 

Команда Break - выход из цикла. Соответственно вместо него надо поставить желаемую команду, тогда цикл будет бесконечным, пока скрипт не обновят или не прервут кнопкой F10. Будет


{

ImageSearch, xp, yp, 321, 869, 377, 928, *50 123.png

If xp > 0

SoundPlay, *16

Sleep 3000

}

0
 

Спасибо, заработало) Чуть паузу ещё переделал

вместо Suspend - Pause, теперь идеально

ещё раз благодарю!

VikManz 
+1
 

Я на АНК писал ботовода для линейдж 2.
Отлично работает схема в 9 окон. Одно основное, остальные 8 свернуты. И по нажатиям клавиш - в свернутые окна команды отправлялись.
Также помогает банально автоматизировать монотонную работу и в некоторых случаях как костыль - коллега не умела переключать язык на компьютере (точнее умела, но делала это ооочень долго). И в ворде ей нужно было часто ставить апостроф (который находится на букве "Э" в английской раскладке). Теперь она просто запускает скрипт и по ctrl+э у нее апостроф ставиться. Ей так проще.

MrSnippy 
0
 

>И по нажатиям клавиш - в свернутые окна команды отправлялись.

А как этого добиться в AH?

+2
 

SetControlDelay, -1

ControlClick, x800 y400, Clicker Heroes


посылает клик в координаты 800-400 в окно с заголовком Clicker Heroes.

Окно может быть неактивно, но должно быть развернуто, по-моему.

SetControlDelay нужен чтоб команда не глючила.

https://autohotkey.com/docs/commands/ControlClick.htm



ControlSend ,,{Home}, Clicker Heroes

посылает клавишу Home в окно Clicker Heroes даже если оно свернуто или неактивно.

https://autohotkey.com/docs/commands/ControlSend.htm

Раскрыть ветвь2  
VikManz 
+1
 

Долго копался в этом - в итоге работает следующее (тут на 4 окна):


Ctrl+Alt+*цифра от 1 до 4* - открываем нужное окно и жмем комбинацию, окно запишется в переменную.


Отправка нажатий - controlSend, , {F1}, ahk_id %Wind1%

где %Wind1% - переменная окна под номером 1.


Сам скрипт::

;Переменные для удобства
Wind1 = 0
Wind2 = 0
Wind3 = 0
Wind4 = 0
;Ввод идентификаторов окна по Ctrl+Alt+№ окна
^!1::
WinGet, Wind1, ID, A
MsgBox, Окно № 1
return
^!2::
WinGet, Wind2, ID, A
MsgBox, Окно № 2
return
^!3::
WinGet, Wind3, ID, A
MsgBox, Окно № 3
return
^!4::
WinGet, Wind4, ID, A
MsgBox, Окно № 4
return
;Отправка команд
1:: ;Окнам F1 по нажатию 1
controlSend, , {F1}, ahk_id %Wind1% ;01
controlSend, , {F1}, ahk_id %Wind2% ;02
controlSend, , {F1}, ahk_id %Wind3% ;03
controlSend, , {F1}, ahk_id %Wind4% ;04
controlSend, , {F1}, ahk_id %Wind5% ;04
return
+1
 

Дружище, большое тебе спасибо за подобные посты и очень грамотные и качественные объяснения!

Может я туплю, и в то же время не могу найти информации по такому примеру:


Как создать второе условие?

Если находит то MsgBox, Muhaha!

Если не находит то, к примеру MsgBox, WellDone...

0
 

Допер !

в таком случае цикл не нужен.


F1::

Loop,

{

ImageSearch, xp, yp, 75, 61, 97, 83, *50 smert.png

Sleep 200

If xp > 0

Break

}

MsgBox, Muhaha!

Return

Else

MsgBox, WellDone...


F10::ExitApp

F12::Suspend, Toggle


Так ведь ?

+1
 

Return зря убрал. Это оператор, завершающий горячую клавишу.

F1::

;какой-то код

Return


F2::

;еще код

Return


F12::Suspend, Toggle нужно для временного отключения горячих клавиш, мало ли. Зря убрал.


Else
MsgBox, WellDone...
Return
F12::Suspend, Toggle

Если после горячей клавиши идет всего одна строка кода, то Return не нужен.

Раскрыть ветвь1  
+1
 
Попробуй на видяхе сравнивать картинки, будешь приятно удивлен приросту производительности, тогда и координаты не надо выбирать. Можно отслеживать не весь экран, а картинку активного окна.
alex.tsvetkov 
0
 
А как это делать на этом софте?
wiDagon 
+1
 
В свое время была отличная бесплатная программка под линукс. Называлась, только не смейтесь, "sikuli". Умела все это и даже больше. Кому интересно - Гугл в помощь.
polovinkin 
+2
 

я с помощью нее одно онлайн казхино обул баксов на 500)

0
 
Хорошая штука была.

А что с ней сейчас стало? Разработка заброшена?

0
 

Тоже пользовался ею. Помню как приходилось качать мегабайт 50, а еще устанавливать Java.

lra007 
0
 

Доброго времени суток, прошу у Вас совета.
Есть необходимость найти два одинаковых изображения и только после этого выругаться и остановить скрипт. Как это можно реализовать?
Примеры из поиска гугла так и не удалось подправить под нужды =(

lra007 
+1
 

Хотя вроде бы как наколхозил что то рабочее, вопрос снимается, прошу прощения за беспокойство.

0
 

@netwizard подскажи пожалуйста. Второй день не могу разобраться, написал скрипт для браузера с поиском кнопок. На странице нужно найти кнопку, нажать и перейти на следующую страницу, на второй странице нужно найти другую кнопку и нажать её и так далее. ImageSearch в первый раз срабатывает, на второй и третий отказывается что-либо делать. Его можно объявить только один раз?

Сделал как-то так:

^F1::


loop,

{

ImageSearch, x, y, 1732, 519, 1769, 606,*50 lupa.png

Sleep, 300


Send, {Control down}

MouseClick, left, x, y

Send, {Control up}

Sleep, 800

Send ^{Tab}

Sleep, 300

Send {End}

Sleep, 800


ImageSearch, findx, findy, 618, 979, 1237, 1020,*150 pogasit.png

Sleep, 300


MouseClick, left, findx, findy

Sleep, 3000

Send {End}

Sleep, 500


ImageSearch,finddx, finddy, 697, 984, 1206, 1018,*150 sohranit.png

Sleep, 300


MouseClick, left, finddx, finddy

Sleep, 3000

Send ^{vk57}

Sleep, 1000

Click, 767, 308

Sleep, 2000


}


return

0
 

Блок команд для каждой страницы нужно убирать в конструкции

If <условие>

{

<команды>

}


Иначе получается что скрипт заходит на первую страницу, выполняет команды, предназначенные для первой страницы И второй И третьей, затем начинает снова.


ImageSearch, x, y, 1732, 519, 1769, 606,*50 lupa.png


If x>0    ;если скрипт не нашел лупу, то иксу  присвоится пустое значение, условие не выполнится

              ;и блок команд не будет выполняться. То, что нужно

{

Sleep, 300

Send, {Control down}

MouseClick, left, x, y

Send, {Control up}

Sleep, 800

Send ^{Tab}

Sleep, 300

Send {End}

Sleep 800

}

--------------------------------------------

Далее. Проверял второй и третий imagesearch по отдельности?


F6::

ImageSearch,finddx, finddy, 697, 984, 1206, 1018,*150 sohranit.png

if finddx>0

MsgBox, OK

Return


при нажатии F6 выдает ОК?

0
 

Спасибо! Все заработало.

А правильно ли использовать Sleep'ы? Я напихал их, т.к. боюсь что страница не прогрузится и он мимо нажмет.

Раскрыть ветвь1  
228x1337 
0
 

Автор, помоги, пожалуйста. Как сделать поиск по двум картинкам?

Есть шкала заряда. Если заряд меньше трёх (2 или 1), выполняются действия мышью. Это всё в браузере.

0
 

ImageSearch, x, y, 100, 100, 200, 200, *20 zaryad1.png

If x>0

Click 300, 300


ImageSearch, x, y, 100, 100, 200, 200, *20 zaryad2.png

If x>0

Click 300, 300


Если скрипт видит картинку заряд1 или заряд2 в указанной области, то выполняет действия мышкой.

228x1337 
+2
 

Спасибо, всё получилось. Я видимо просто тупой))

PlorvenT 
0
 

Я так бота писал к браузерной игрушке, а потом какая-то обнова вышла и все мои стопяцот констант с координатами надо было переделывать.

GooEater 
0
 

О великий маг, есть ли способ заставить скрипт помнить некоторые данные?
Например при первом запуске и трём нажатиям пользователя на ключ-кнопку создавать текстовый файлик в папке скрипта, в котором будут хранится три переменных?
Не понимаю как в одной переменной хранить координаты курсора и во второй переменной хранить две координаты (начало и конец квадрата).
Всё это надо чтобы при первом запуске определить ключевые точки, по которым будет выполняться скрипт, а при последующих запусках чтобы эти данные считывались из файлика и заново определять ключевые точки не нужно было. Это возможно реализовать или есть более простой способ?

+3
 

1. https://autohotkey.com/docs/commands/FileAppend.htm

позволяет делать записи во внешний файл. Если указанного файла нет, создает файл с заданным именем в рабочей папке скрипта.

F1::FileAppend 123456, file.txt


Этот скрипт создал у меня на рабочем столе file.txt с текстом 123456 внутри.


2. Я бы хранил координаты в двух переменных. Если есть способ хранить их в одной, прошу поделиться.


3. Считывание данных из файла с помощью

https://autohotkey.com/docs/commands/FileRead.htm

GooEater 
0
 

Можно небольшой пример?
Писать в файл то я умею давно, а вот прочитать и выцепить переменную не удавалось ни разу, хотя этот раздел читал и вроде даже понял. Только как дело до самого скрипта доходит - всё..

Вот у меня записывалка файлика координат в столбик списком под номерами в оконном режиме и в полноэкранном. Управление: на нум1 делает запись, нум2 удаляет файлик с координатами, нум3 закрывает скрипт из системы.
Использую его для получения координат UI на компах друзей, просто так быстрее им пояснить куда и когда кликать.
Вот вобще шикарно было бы научиться хранить и читать данные, можно один раз сделать калибровку и в следующие использовать её. Это довольно критично, когда скрипт работает с 20+ кнопками в игре. Не будешь же для каждой делать по 2 движения каждый раз.

/*

При нажатии Num 1 записывает в текстовый файл координаты курсора в окне и на экране.


удаляет файл с координатами на Num 2.


закрывается на Num 3.

*/



BlockInput, Mouse ; Блокирует ввод мышью на время работы команд


#SingleInstance force ; Запрещает запускать больше 1 скрипта



Counter = 0 ; Счётчик 1


Text = ,



FileDelete Coords.txt



vk61:: ; Активатор для создания и заполнения файла


SoundBeep, 2000, 200 ; Оповещение звуком



CoordMode, Mouse, Window ; Привязывает координаты к окну


MouseGetPos, X, Y ; Получает координаты курсора


Counter := Counter+1 ; Увеличение счётчика


If Counter = 1


FileAppend, Координаты курсора в окне и на экране:`n%Counter%: %X%%Text% %Y%, Coords.txt


else


FileAppend, `n%Counter%: %X%%Text% %Y%, Coords.txt



CoordMode, Mouse, Screen ; Привязывает координаты к окну


MouseGetPos, X, Y ; Получает координаты курсора


FileAppend, %Counter%: %X%%Text% %Y%, Coords.txt


Return



vk62:: ; Активатор для удаления файла


SoundBeep, 500, 400 ; Оповещение звуком


FileDelete Coords.txt


Counter = 0 ; Обнуление счётчика 1


Return



vk63:: ; Активатор для закрытия скрипта


SoundBeep, 500, 1000 ; Оповещение звуком


ExitApp


Return

Раскрыть ветвь2  
0
 

а можно создать скрипт для автоматизации ловли рыбы в игре Torchlight ?

Смысл: надо нажать мышкой на круглую кнопку когда внешнее кольцо соединиться с внутренним

GooEater 
+1
 

Можно. На сколько помню когда соединяются круги - цвет меняется на более светлый. Сделайте запись видео с высокой частотой кадров и с кадра где круги соединены возьмите скриншот. Дальше как в посте.
Но легче запустить скрипт калибрующий цвет пикселя под курсором. Короче вот:
https://www.youtube.com/watch?v=bh1NRXMeFB0
https://pastebin.com/HDJqNCHb

Еще 75 комментариев