Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана

Всем привет, продолжаем изучать автоматизацию на основе программируемого автокликера.

Часть №1, Интерфейс, простые действия.
Часть №2, Запись действий, циклы, переменные, условия.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Начнём с подпрограмм, что это и зачем они нужны.

Подпрограмма это список действий, который будет часто повторяться в вашей программе, но не обязательно подряд. Например, мы используем такие действия (пока напишем в псевдокоде):

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Но что если нужно открывать другие страницы, а может, между делом совершать совсем другие действия (публиковать пост, писать комментарии и т.д.) Тогда имеет смысл выделить наш участок кода в отдельную функцию.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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

Имя функции определяете вы сами, старайтесь задать такое, чтобы вам было понятно, что делает эта функция, например ставит лайки в вк - VKLikes, ищет в эксель нужную строку - ExcelFindString и т.д.


END_SUB - соответственно обозначает конец вашей подпрограммы(функции).


Теперь вы можете в любой момент вызвать вашу функцию таким образом - имяФункции()


Почему это удобно? Представим, что вам потребовалось ставить лайк не на каждый пост, а на каждый второй, теперь вам придется проходить по всей вашей программе, искать каждый момент где вы ставите лайк и менять там, добавлять ещё одну прокрутку, если же это у вас выведено в отдельную функцию, вам достаточно поменять это один раз в одном месте. Удобно? а то! Ну и отдельный плюс - сокращение вашего кода. Совсем недавно я изменил свой скрипт, изначально я писал его просто как список действий, без подпрограмм, это заняло у меня 2200 строк, после *рефакторинга скрипт стал занимать 700.


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


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

Вот участок моей реальной программы:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Да, ваш скрипт может целиком выглядеть как вызов различных функций, это нормально и даже очень хорошо. Я передаю в функцию TWPersonalPost переменную, которая имеет значение от 1 до 10, в зависимости от этого, функция открывает тот лист Excel с которого мне нужно скопировать информацию:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Тогда в названии вашей программы нужно указать переменную, например SUB(VKlikes, $name)

и внутри подпрограммы с помощью команд IF или SWITCH сделать различные действия в зависимости от значения переменной.


Анализ экрана

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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


для этого clickermann представляет нам множество функций, главной из которой является GETSCREEN.


GETSCREEN - делает снимок экрана и помещает его в буфер для анализа, буквально это print screen. Мы можем сделать как снимок всего экрана, так и снимок определенной области, зачем? Ну это немного ускоряет выполнение скрипта, ведь анализировать часть проще чем весь экран. Во вторых на всем экране могут быть похожие элементы или пиксели такого же цвета, которые помешают нам.  Для этого необходимо в скобочках указать координаты двух углов, верхнего правого и нижнего левого. Например так GETSCREEN(649, 473, 883, 631).

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Тогда в буфер сохранится выделенный красным криво-прямоугольником участок. Ну например если мы хотим нажать одну из этих зеленых кнопок, и мы знаем что они всегда находятся в этой области.


Хорошо, мы сохранили изображение, как его проанализировать?


IF_PIXEL_IN - ищет пиксель заданного цвета в снимке, и возвращает его координаты. Обязательно нужно указать координаты (если вы сделали снимок области, указываем такие же координаты, что и для GETSCREEN) и цвет искомого пикселя. В коде это выглядит так:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

$_return1 \ $_return2 - переменные созданные самой программой, в них лежат координаты (по Х и по Y) для первого найденного пикселя такого цвета в этом участке изображения. Мы можем проделать любые действия с ними, например нажать левой\правой кнопкой мыши, остановить\продолжить исполнение программы и так далее. Для этого нужно поставить эти действия между IF_PIXEL_IN и END_IF которое обозначает конец условия, также как в команде IF.


Откуда мы узнали какой цвет пикселя нам нужно искать? Для этого достаточно навести на нужное место и посмотреть в окно определения цвета clickermann.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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


Но нужно быть осторожным, многие сайты меняют цвета кнопок при наведении на них, так и здесь на пикабу, кнопка "картинка" не меняет цвет при наведении, а вот видео и текст меняют и при наведении на них мы увидим цвет:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Как видно, при наведении кнопка побледнела, в отличии от "картинка", кстати @SupportTech, а не баг ли это?))

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

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

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост


Ну разве что последний способ не очень подходит, после чего открываем картинку и уже на ней наводим на кнопку и смотрим её цвет:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

наверху у него всегда цвет пикселя

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Теперь мы можем создать проверку, например мы работаем в Excel и браузере, соответственно в браузере сверху нет цвета пикселя Excel, тогда если мы находим такой пиксель - выводим оповещение:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

SOUND("имя_файла.wav") - воспроизводит звуковой файл в ваши динамики, давая вам знать о проблеме или например успешном окончании программы. Только .wav файлы. Файл должен находиться в папке с программой clickerman.


Теперь программа позовёт вас, если что-то пойдёт не так и будет ждать. Как вариант можно в действиях указать нажатие левой кнопкой мыши по значку Excel, для его раскрытия и потом ещё одну такую же проверку, в 90% случаев именно из-за лишнего закрытия-открытия окна что-то идёт не так.


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

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Тогда следует использовать анализ экрана по совпадению картинки, а поможет нам функция

IF_PICTURE_IN - ищет образец картинки в сохраненном участке изображения. Только файлы bmp формата, пример:

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Чтобы повысить вероятность нахождения, можно указать % точности совпадения. Например так:

IF_PICTURE_IN (20,20, 300, 300, "somefile.bmp", 0, 90) тогда, 90% совпадения будет достаточно для запуска действий внутри IF.


Как получить картинку формата .bmp?

Есть два способа, самый точный это командой SCREENSHOTEX - сохраняет участок экрана как отдельный файл в папке с программой.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

и второй способ, включаем режим лупы

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Теперь смотрим на окно лупы в clickermann и наводим на нужное место, нажимаем ALT + G

и скриншот указанный на экране лупы будет сохранен в папке программы внутри папки screens.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

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


Мы рассмотрели две основные функции для анализа экрана, по пикселю и по изображению. Вы можете ознакомиться с остальными функциями в справке программы, возможно найдете функцию которая больше подходит вам для исполнения вашего скрипта, но эти две на 95% покрывают все потребности.

Автоматизация однотипных действий, ч.3 .  Подпрограммы и анализ экрана Автоматизация, Автокликер, Анализ, Длиннопост

Программы и Браузеры

595 постов5.1K подписчиков

Правила сообщества

-Ставьте наши теги, если Ваш пост о программе, приложении или браузере(в том числе о расширениях, дополнениях в нему), его недоработке, баге, обновлении. Это может быть пост - обзор или отзыв.

-При возникновении споров относитесь с уважением друг к другу, а так же приводите аргументы.

Разрешено всё, что не запрещено правилами Пикабу.

6
Автор поста оценил этот комментарий
Не знаю, как применить написание таких скриптов в моей работе, но огромный плюс за ценную инфу и хорошее изложение!
3
Автор поста оценил этот комментарий
1) Совсем необязательно держать все файлы сценариев, картинок, звуков в папке со скриптом - поддерживаются относительные пути (при этом корневой каталог - папка с основным скриптом). Пример - "screens\pict.bmp", где screens - папка с картинками. Для ухода на уровень вверх команда "..\путь к файлу". Но, опять же, интерпретатор кликермана всё содержимое подключаемых файлов пихает в основной скрипт, и поэтому пути в подключаемых файлах должны идти так, как будто они находятся в папке со скриптом.
2) Неочевидная особенность функции GETSCREEN - в графическом буфере анализа обновляется только область, которая указана в функции, всё остальное либо остаётся без изменений (если до этого момента её вызывали), либо заливается черным цветом (при первом вызове). Проверить это можно, выполнив следующий скрипт:
GETSCREEN
SCREENSHOT
WAIT(10) // за время задержки перетаскиваем что-либо в область (0, 0,400,400)
GETSCREEN(0, 0,400,400)
SCREENSHOT
HALT
Затем глянуть скриншоты - тот квадрат, который был указан, обновился, а остальная часть осталась без изменений.
3) Надо было бы это в первом посте написать - каждая функция в кликермане пишется с новой строки, в одну строку несколько штук вписать не удастся.
4) Ну и при выносе части скрипта в отдельные файлы надо следить, чтобы не было одинаковых переменных, так как #include "miss.cms", к примеру, пихает всё в основной файл, и если таких модулей много, то могут быть конфликты
раскрыть ветку
2
Автор поста оценил этот комментарий

А подскажите, какие функции нужны что бы сделать так:

Кликер работает, доходит до поля где нужно вручную ввести текст с бумажки, ждёт ввода, после ввода продолжает дальше.

Это можно как-то на горячую клавишу вывести? Например, ввели текст, нажали "энтер" и он пошёл дальше.

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

раскрыть ветку
2
Автор поста оценил этот комментарий

где можно увидеть наглядные примеры с использованием этого софта? Программы и тд. Группа  в вк чет мертвая совсем у них

раскрыть ветку
2
Автор поста оценил этот комментарий

Это очень круто


В пятницу познала дзен с битриксом, всего-то 200 правил для купонов с 1 купоном создать.


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


Сейчас увидела ваш пост и думаю - осилить и сделать, чтобы он вообще сам брал «на строчку ниже»...


Да будет завтра битва! ;)