Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Fugger on September 01, 2017, 11:34:23 PM

Title: Складывание координат в массив и их нажатие
Post by: Fugger on September 01, 2017, 11:34:23 PM
Долго думал как сделать чтобы при нажатии, например, пробела, записывались координаты мыши и нажимались через 2 секунды. Казалось бы, всё просто, но нет, мне нужно чтобы все нажатые координаты складывались в массив, или ещё куда, и каждая по очереди нажималась через 2 секунды. Добавление координат и нажатие должны происходить одновременно. Буду благодарен, если кто поможет.
Title: Re: Складывание координат в массив и их нажатие
Post by: Oraven on September 02, 2017, 07:41:56 AM
Действительно это не сложно

Code: (clickermann) [Select]
IF(ISKEYDOWN(#SPACE)=1)
   WHILE(ISKEYDOWN(#SPACE)=1)
      WAITMS(5)
   END_CYC
   ARRPUSH($aCor, $_xmouse)
   ARRPUSH($aCor, $_ymouse)
ELSE
   WAITMS(20)
END_IF

THREAD(t, 1)
   FOR($a=0,$a<ARRSIZE($aCor),2)
      LCLICK($aCor[$a],$aCor[$a+1])
      WAITMS(50)
   END_CYC
   WAIT(2)
END_THREAD
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 02, 2017, 07:34:25 PM
Вот другой алгоритм и другое понимание задачи соответственно. Массив тут не нужен, да и второму потоку места не нашлось.
Каждое нажатие пробела на клавиатуре запоминается и ставится в очередь на "превращение" в левый клик мыши. Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек). После выполнения клика, его координаты удаляются из памяти, поэтому кликер не будет повторять клики дважды. Очередь обнуляется полностью, если небыло нажатий пробела в течение двух секунд. Задержки внутри цикла корректируются автоматически, но все равно большой точности учета времени добиться вряд ли получится. Не уверен, что второй поток даст бОльшую точность.
Результат работы скрипта см. в логе.  Строку 24 , при надобности раскомментировать, строку 25 закомментировать.

Code: (clickermann) [Select]
LOGCLEAR
$delay = 2000 // через сколько миллисекунд кликер превратит нажатие пробела в левый клик
$step = 5 // как часто кликер будет проверять, что нажат пробел (в миллисекундах)
//--------------------------------
$str = ""
FOR($n = 0, $n < $delay / $step)
   $str = STRCONCAT($str, ",;")
END_CYC
//--------------------------------
WHILE(1)
   $t = $_ms
   IF(ISKEYDOWN(#SPACE) = 1)
      WHILE(ISKEYDOWN(#SPACE) = 1)
         WAITMS(1)
      END_CYC
      $str = STRCONCAT($str, $_xmouse, ",", $_ymouse, ";")
   ELSE
      $str = STRCONCAT($str, ",;")
   END_IF
   //--------------------------------
   $x = STRCUT2($str, 1, STRPOS($str, ",") - 1)
   IF($x ! "")
      $y = STRCUT2($str, STRPOS($str, ",") + 1, STRPOS($str, ";") - 1)
      //    LCLICK($x,$y)
      LOGWRITE (STRCONCAT($x, ",", $y))
   END_IF
   //--------------------------------
   $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str))
   WAITMS($step - ($_ms - $t)) // коррекция времени (вычитаем из задержки "step" время, затраченное на выполнение действий в цикле)
END_CYC



UPD: От нефиг-далать решил проверить насколько будет сбиваться время между пробелом и кликом при длительной работе скрипта.
Включил в свой скрипт вывод в лог, после строки 28 - $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str)).
Code: (clickermann) [Select]
   $loss_time = $_ms - $t 
   $actual_waiting = $step - ($_ms - $t)
   LOGWRITE ("Потери - ", $loss_time, "ms")
   LOGWRITE ("Задержка после коррекции - ", $actual_waiting, "ms")
   LOGWRITE ("")
   
В логе:
Quote
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms

Пауза в цикле четко удерживается равной заданному значению $step=5. Получается, что разбежка во времени, между нажатием пробела и левым кликом, для любой пары координат - в пределах 1 миллисекунды. Погрешность тут-же учитывается коррекцией времени и компенсируется для следующей итерации. Нормально так, учитывая что миллисекунда - атомарная единица возвращаемая системной переменной $_ms. Жаль что само нажатие паузы может быть довольно продолжительным и портит картину.
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 02, 2017, 11:39:32 PM
Всё равно задержки между нажатиями нет. Не понимаю, в чём дело
Quote
Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек).
Именно так, но наоборот. У вас так же или я что-то не то сделал?
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 02, 2017, 11:51:32 PM
Если не работает мой скрипт, то возможно поможет перезагрузка компа, чтобы сбросить системный таймер. Скрипт его использует.
Такое бывает, если например ноутбук не выключают полностью, а отправляют в спящий режим.
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 02, 2017, 11:53:51 PM
Хорошо, сейчас попробую
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 12:01:43 AM
Всё равно то же самое. Может быть дело в версии кликера? У меня последняя(4.12)
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:04:30 AM
У меня сделано так как я написал - Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия того пробела, который ставит его в очередь.

Еще там в скрипте закомментирована строка №24. Чтобы были клики нужно убрать комментарий "//". А сейчас просто пишутся в лог координаты, это для тестов, чтоб не кликало зря. Нужно открыть лог и будет видна работа скрипта.

Версия у меня 4.12.001, вроде такая как лежит здесь - http://crapware.aidf.org/page/clickermann
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 12:17:56 AM
У меня точно такая же. Странно. Строку я раскомментировал. У меня первый клик идёт с задержкой, а остальные - с той задержкой, какой я их кликал изначально
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:24:25 AM
Похоже всё правильно. Если сделать три нажатия на пробел с интервалами в 0.5 секунды, то кликер через 2 секунды сделает 3 клика, между кликами будут задержки по 0.5 сек.
А как должно быть?
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 12:31:22 AM
Должно быть, чтобы задержки между каждым нажатием были 2 секунды. Это и была моя изначальная цель
Title: Re: Складывание координат в массив и их нажатие
Post by: Vint on September 03, 2017, 12:38:32 AM
А в задании сказано по другому.
Тогда ещё проще.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:38:49 AM
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 12:43:03 AM
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:49:56 AM
Понятно, теперь вроде, тогда две части надо делать.
1) Запись сценария - сохранение координат.
2) Воспроизведение - клики по сохраненным координатам, с частотой 2 секунды.
Title: Re: Складывание координат в массив и их нажатие
Post by: Vint on September 03, 2017, 12:52:07 AM
Во, как теперь понятно описал задачу. Почему сразу было так не сделать. Заставил человека писать код который теперь на помойку.
Ведь умеешь. Некоторые не умееют совсем и от них не добиться четкого описания даже после 3 страниц обсуждений.

Ну, ничего, он привыкнет и научится отвечать не сразу. Ещё несколько раз так напишет и надоест Вангой работать.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:57:41 AM
 :) Нет проблем, мне было интересно написать этот скрипт. Главное, что получилось.
      Но на сегодня, к сожалению, мой лимит времени исчерпан.
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 01:42:48 AM
Большое спасибо за то что ты сделал.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 10:02:53 AM
И тебе спасибо за интересную задачу. :) Теперь вроде понятно что нужно сделать.
Вот с утречка накалякал скрипт. Он как бы из двух частей. При запуске он в режиме записи сценария - ждет нажатия пробелов над нужными координатами и записывает эти координаты в массив. При этом скрипт проверяет нажатия клавиш 1 и 2.
Клавиша 1 - запускает эмуляцию, которая проигрывает запись, без кликов, а только перемещает курсор над записанными координатами.
Клавиша 2 - запускает выполнение сценария (с наведением курсора и кликами).
По окончании выполнения этих режимов будет предложено выбрать следующее действие. Работа с шаблонами пока не реализована, если надо можно сделать. И соответственно клавиши можно поменять на более удобные. Клавиша пробел прокручивает страницу браузера. Задержу между кликами, наверно лучше сделать рандомной, т.к. сайты могут отслеживать действия посетителей и при подозрении на бота можно получить бан. Реалистичное перемещение курсора тоже можно сделать, тут на форуме есть где-то хорошее решение, можно найти. Наверно я сильно всё усложняю).

Code: (clickermann) [Select]

$delay = 2000 // задержка между кликами в режимах "Выполнение сценария" и "Режим эмуляции" (ms)

//--------------------------------
LOGCLEAR
LOGWRITE ("Запись сценария")
start:
WHILE($mode = 0)
   IF(ISKEYDOWN(#SPACE) = 1)
      WHILE(ISKEYDOWN(#SPACE) = 1)
         WAITMS(30)
      END_CYC
      ARRPUSH($arr, $_xmouse)
      ARRPUSH($arr, $_ymouse)
   END_IF
   IF(ISKEYDOWN(#1) = 1) // Режим эмуляции
      $mode = 1
   END_IF
   IF(ISKEYDOWN(#2) = 1) // Выполнение сценария
      $mode = 2
   END_IF
   WAITMS(30)
END_CYC
//--------------------------------
WHILE( (ISKEYDOWN(#1) = 1) | (ISKEYDOWN(#2) = 1) )
   WAITMS(30)
END_CYC
//--------------------------------
$arrsize = ARRSIZE($arr)
execution:
IF($arrsize ! 0)
   SWITCH($mode)
   CASE(1)
      LOGWRITE ("Режим эмуляции")
      FOR($n = 0, $n < $arrsize, 2)
         MOVE($arr[$n],$arr[$n + 1])
         WAITMS($delay)
      END_CYC
      $message = "       Режим эмуляции завершён                                                            Выберите действие"
   CASE(2)
      LOGWRITE ("Выполнение сценария")
      FOR($n = 0, $n < $arrsize, 2)
         MOVE($arr[$n],$arr[$n + 1])
         WAITMS(10)
         LCLICK($arr[$n],$arr[$n + 1])
         WAITMS($delay - 10)
      END_CYC
      $message = "     Выполнение сценария завершено                                                         Выберите действие"
   END_SWITCH
ELSE
   $message = "         Сценарий не загружен                                                             Выберите действие"
   $mode = 3
END_IF
//--------------------------------
message:
LOGWRITE ("")
IF($mode = 3)
   $res = RADIOBOX($message, "Записать новый сценарий", "Загрузить шаблон", "Выход (закрыть программу)")
   IF($res = 1)
      $mode = 0
      GOTO(start)
   END_IF
   IF($res = 2)
      $dialog = DIALOGBOX("Данный функционал в разработке.", 0, 3)
      GOTO(message)
   END_IF
   IF($res = 3)
      HALT(1)
   END_IF
ELSE
   $res = RADIOBOX($message, "Режим эмуляции", "Выполнить сценарий", "Записать новый сценарий", "Сохранить запись как шаблон", "Загрузить шаблон", "Выход из программы")
   IF($res = 1)
      $mode = 1
      GOTO(execution)
   END_IF
   IF($res = 2)
      $mode = 2
      GOTO(execution)
   END_IF
   IF($res = 3)
      $mode = 0
      GOTO(start)
   END_IF
   IF($res = 4)
      $dialog = DIALOGBOX("Данный функционал в разработке.", 0, 3)
      GOTO(message)
   END_IF
   IF($res = 5)
      $dialog = DIALOGBOX("Данный функционал в разработке.", 0, 3)
      GOTO(message)
   END_IF
   IF($res = 6)
      HALT(1)
   END_IF
END_IF
HALT

"Пару раз" скрипт запустил, вроде работает, сильно не проверял.
Title: Re: Складывание координат в массив и их нажатие
Post by: Vint on September 03, 2017, 12:29:14 PM
Он же вроде писал, что кликать должно сразу начинать. Без запись-воспроизведение.
Просто два потока. В одном ждет нажатия пробела и добавляет в очередь координаты. Во втором если очередь не пуста берём координаты и следим за паузой между преведущим кликом.
Можно всё это и в одном потоке. Точность паузы иногда будет чуть меньше (дольше 2000 мс).
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 12:58:48 PM
А мне казалось, что я понял задачу. ;D Но тогда как можно наводить курсор куда либо, в то время как кликер кликает куда-то в другое место?
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.

Получается только два этапа - запись и воспроизведение. А как ты говоришь, так это ему уже Oraven написал и я тоже, но по другому, как тогда понимал задачу. Тот мой первый скрипт как раз и делает так как ты говоришь. Жалко что он не подошел, тот сильный скрипт, и двухпоточному с ним не тягаться ни в скорости, ни в точности по времени. Да уж куда там с массивами... Может кто захочет доказать обратное и предложит другой сценарий?) А второй скрипт обычный такой, типа детский. Короче надо ждать когда придет Fugger и проверит. Я чем могу стараюсь помочь. :)
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 03, 2017, 07:13:10 PM
Всё отлично, спасибо что столько намудрил. Хотя как я уже говорил, мне бы лучше чтобы нажатие и записывание проходили одновременно, например сначала текущая позиция мыши заносилась в переменную, потом нажималось, а потом возвращалось обратно.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 03, 2017, 08:00:22 PM
Ну, ничего, он привыкнет и научится отвечать не сразу. Ещё несколько раз так напишет и надоест Вангой работать.
Золотые слова! Да и Ванга из меня получается хреновая. :D Для меня "клик" и "нажатие" - разные вещи. Я не понимаю куда значит "обратно". И как можно раздвоить курсор, чтобы двигать мышью одновременно с Клинерманом. Хотел помочь, а похоже трачу напрасно и свое и чужое время. :-[
HELP! Кто понял задачу, напишите пожалуйста человеку скрипт, третий день уже тема не закрыта.
Title: Re: Складывание координат в массив и их нажатие
Post by: Vint on September 03, 2017, 09:38:15 PM
У людей выходные. Релаксация и отдых.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 04, 2017, 12:16:30 AM
Вот похоже то что надо. Точность не проверял, да она и не нужна. Главное, что при выставленной задержке 2000ms чаще этого времени кликать не будет. Если клики будут "смазываться", т.е. целевое приложение не будет успевать их принимать, то помогут небольшие задержки и MOVE() перед кликом. Надеюсь, что теперь задачу я понял правильно. Не делал такого раньше - чтобы кликер дубасил по координатам и в то-же время не мешал другие дела мышкой делать. Хотя тут на форуме такое давно делали и даже чуть ли не фремворк собрали.  :)  Ладно, вроде скрипт рабочий, а я иду спать - ибо ночь темна и полна ужасов!  :o

Code: (clickermann) [Select]
$delay = 2000 // через сколько миллисекунд кликер превратит нажатие пробела в левый клик
$step = 5 // как часто кликер будет проверять, что нажат пробел (в миллисекундах)
//--------------------------------
$str = ""
WHILE(1)
   $t = $_ms
   IF(ISKEYDOWN(#SPACE) = 1)
      WHILE(ISKEYDOWN(#SPACE) = 1)
         WAITMS(1)
      END_CYC
      IF(STRLEN($str) = 0)
         $lock_time = $_ms + $delay
      END_IF
      $str = STRCONCAT($str, $_xmouse, ",", $_ymouse, ";")
   END_IF
   //--------------------------------
   $x = STRCUT2($str, 1, STRPOS($str, ",") - 1)
   IF(($x ! "") & ($lock_time < $_ms))
      $y = STRCUT2($str, STRPOS($str, ",") + 1, STRPOS($str, ";") - 1)
      $x_tmp = $_xmouse
      $y_tmp = $_ymouse
      LCLICK($x,$y)
      MOVE($x_tmp,$y_tmp)
      $lock_time = $_ms + $delay
      $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str))
   END_IF
   WAITMS($step - ($_ms - $t)) // коррекция времени (вычитаем из задержки "step" время, затраченное на выполнение действий в цикле)
END_CYC
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 04, 2017, 07:20:18 AM
Огромнейшее спасибо. Давно думал как это сделать, но я сейчас учу другой язык, никак не мог начать.
Title: Re: Складывание координат в массив и их нажатие
Post by: Oraven on September 04, 2017, 08:30:16 AM
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

Code: (clickermann) [Select]
IF(ISKEYDOWN(#SPACE)=1) // запись координат после нажатия Пробела
   WHILE(ISKEYDOWN(#SPACE)=1)
      WAITMS(5)
   END_CYC
   ARRPUSH($aCor, $_xmouse)
   ARRPUSH($aCor, $_ymouse)
ELSE
   WAITMS(20)
END_IF

THREAD(t, 1)
   FOR($a=0,$a<ARRSIZE($aCor),2)
      $x_tmp = $_xmouse
      $y_tmp = $_ymouse
      LCLICK($aCor[$a],$aCor[$a+1]) // Клики по записанным координатам
      MOVE($x_tmp,$y_tmp)
      WAIT(2)
   END_CYC
   WAITMS(10)
END_THREAD
Title: Re: Складывание координат в массив и их нажатие
Post by: Fugger on September 04, 2017, 02:43:54 PM
Тебе тоже спасибо, буду смотреть чей больше подойдёт.
Title: Re: Складывание координат в массив и их нажатие
Post by: Vint on September 04, 2017, 03:13:36 PM
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

Здесь, как только кликалка догонит человека с ружьём мышью, она начнёт кликать с первых координат.
Title: Re: Складывание координат в массив и их нажатие
Post by: tmp~1 on September 04, 2017, 05:20:29 PM
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

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

Угу. Чтобы это увидеть достаточно закомментировать стоку 16 - MOVE($x_tmp,$y_tmp).
Массивы в этой задаче ненужны. Очередь должна очищаться. А из массива вытащить верхние элементы, так, чтобы все остальные сдвинулись вверх, очень проблемно. "Проще" - это как раз со строкой.
И зачем второй поток? В нем приходится отслеживать событие, которое позволяет сделать клик. Зачем? В одном потоке просто ставим нажатия пробела в очередь, мгновенно и без всяких условий. А второй поток, требует еще как минимум, задержку для разгрузки процессора. От этого страдает точность задержки между кликами. Да и вообще, один поток обычно проще, чем два. :)