Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Fugger on September 01, 2017, 11:34:23 PM
-
Долго думал как сделать чтобы при нажатии, например, пробела, записывались координаты мыши и нажимались через 2 секунды. Казалось бы, всё просто, но нет, мне нужно чтобы все нажатые координаты складывались в массив, или ещё куда, и каждая по очереди нажималась через 2 секунды. Добавление координат и нажатие должны происходить одновременно. Буду благодарен, если кто поможет.
-
Действительно это не сложно
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
-
Вот другой алгоритм и другое понимание задачи соответственно. Массив тут не нужен, да и второму потоку места не нашлось.
Каждое нажатие пробела на клавиатуре запоминается и ставится в очередь на "превращение" в левый клик мыши. Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек). После выполнения клика, его координаты удаляются из памяти, поэтому кликер не будет повторять клики дважды. Очередь обнуляется полностью, если небыло нажатий пробела в течение двух секунд. Задержки внутри цикла корректируются автоматически, но все равно большой точности учета времени добиться вряд ли получится. Не уверен, что второй поток даст бОльшую точность.
Результат работы скрипта см. в логе. Строку 24 , при надобности раскомментировать, строку 25 закомментировать.
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)).
$loss_time = $_ms - $t
$actual_waiting = $step - ($_ms - $t)
LOGWRITE ("Потери - ", $loss_time, "ms")
LOGWRITE ("Задержка после коррекции - ", $actual_waiting, "ms")
LOGWRITE ("")
В логе:
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. Жаль что само нажатие паузы может быть довольно продолжительным и портит картину.
-
Всё равно задержки между нажатиями нет. Не понимаю, в чём дело
Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек).
Именно так, но наоборот. У вас так же или я что-то не то сделал?
-
Если не работает мой скрипт, то возможно поможет перезагрузка компа, чтобы сбросить системный таймер. Скрипт его использует.
Такое бывает, если например ноутбук не выключают полностью, а отправляют в спящий режим.
-
Хорошо, сейчас попробую
-
Всё равно то же самое. Может быть дело в версии кликера? У меня последняя(4.12)
-
У меня сделано так как я написал - Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия того пробела, который ставит его в очередь.
Еще там в скрипте закомментирована строка №24. Чтобы были клики нужно убрать комментарий "//". А сейчас просто пишутся в лог координаты, это для тестов, чтоб не кликало зря. Нужно открыть лог и будет видна работа скрипта.
Версия у меня 4.12.001, вроде такая как лежит здесь - http://crapware.aidf.org/page/clickermann
-
У меня точно такая же. Странно. Строку я раскомментировал. У меня первый клик идёт с задержкой, а остальные - с той задержкой, какой я их кликал изначально
-
Похоже всё правильно. Если сделать три нажатия на пробел с интервалами в 0.5 секунды, то кликер через 2 секунды сделает 3 клика, между кликами будут задержки по 0.5 сек.
А как должно быть?
-
Должно быть, чтобы задержки между каждым нажатием были 2 секунды. Это и была моя изначальная цель
-
А в задании сказано по другому.
Тогда ещё проще.
-
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
-
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.
-
Понятно, теперь вроде, тогда две части надо делать.
1) Запись сценария - сохранение координат.
2) Воспроизведение - клики по сохраненным координатам, с частотой 2 секунды.
-
Во, как теперь понятно описал задачу. Почему сразу было так не сделать. Заставил человека писать код который теперь на помойку.
Ведь умеешь. Некоторые не умееют совсем и от них не добиться четкого описания даже после 3 страниц обсуждений.
Ну, ничего, он привыкнет и научится отвечать не сразу. Ещё несколько раз так напишет и надоест Вангой работать.
-
:) Нет проблем, мне было интересно написать этот скрипт. Главное, что получилось.
Но на сегодня, к сожалению, мой лимит времени исчерпан.
-
Большое спасибо за то что ты сделал.
-
И тебе спасибо за интересную задачу. :) Теперь вроде понятно что нужно сделать.
Вот с утречка накалякал скрипт. Он как бы из двух частей. При запуске он в режиме записи сценария - ждет нажатия пробелов над нужными координатами и записывает эти координаты в массив. При этом скрипт проверяет нажатия клавиш 1 и 2.
Клавиша 1 - запускает эмуляцию, которая проигрывает запись, без кликов, а только перемещает курсор над записанными координатами.
Клавиша 2 - запускает выполнение сценария (с наведением курсора и кликами).
По окончании выполнения этих режимов будет предложено выбрать следующее действие. Работа с шаблонами пока не реализована, если надо можно сделать. И соответственно клавиши можно поменять на более удобные. Клавиша пробел прокручивает страницу браузера. Задержу между кликами, наверно лучше сделать рандомной, т.к. сайты могут отслеживать действия посетителей и при подозрении на бота можно получить бан. Реалистичное перемещение курсора тоже можно сделать, тут на форуме есть где-то хорошее решение, можно найти. Наверно я сильно всё усложняю).
$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
"Пару раз" скрипт запустил, вроде работает, сильно не проверял.
-
Он же вроде писал, что кликать должно сразу начинать. Без запись-воспроизведение.
Просто два потока. В одном ждет нажатия пробела и добавляет в очередь координаты. Во втором если очередь не пуста берём координаты и следим за паузой между преведущим кликом.
Можно всё это и в одном потоке. Точность паузы иногда будет чуть меньше (дольше 2000 мс).
-
А мне казалось, что я понял задачу. ;D Но тогда как можно наводить курсор куда либо, в то время как кликер кликает куда-то в другое место?
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.
Получается только два этапа - запись и воспроизведение. А как ты говоришь, так это ему уже Oraven написал и я тоже, но по другому, как тогда понимал задачу. Тот мой первый скрипт как раз и делает так как ты говоришь. Жалко что он не подошел, тот сильный скрипт, и двухпоточному с ним не тягаться ни в скорости, ни в точности по времени. Да уж куда там с массивами... Может кто захочет доказать обратное и предложит другой сценарий?) А второй скрипт обычный такой, типа детский. Короче надо ждать когда придет Fugger и проверит. Я чем могу стараюсь помочь. :)
-
Всё отлично, спасибо что столько намудрил. Хотя как я уже говорил, мне бы лучше чтобы нажатие и записывание проходили одновременно, например сначала текущая позиция мыши заносилась в переменную, потом нажималось, а потом возвращалось обратно.
-
Ну, ничего, он привыкнет и научится отвечать не сразу. Ещё несколько раз так напишет и надоест Вангой работать.
Золотые слова! Да и Ванга из меня получается хреновая. :D Для меня "клик" и "нажатие" - разные вещи. Я не понимаю куда значит "обратно". И как можно раздвоить курсор, чтобы двигать мышью одновременно с Клинерманом. Хотел помочь, а похоже трачу напрасно и свое и чужое время. :-[
HELP! Кто понял задачу, напишите пожалуйста человеку скрипт, третий день уже тема не закрыта.
-
У людей выходные. Релаксация и отдых.
-
Вот похоже то что надо. Точность не проверял, да она и не нужна. Главное, что при выставленной задержке 2000ms чаще этого времени кликать не будет. Если клики будут "смазываться", т.е. целевое приложение не будет успевать их принимать, то помогут небольшие задержки и MOVE() перед кликом. Надеюсь, что теперь задачу я понял правильно. Не делал такого раньше - чтобы кликер дубасил по координатам и в то-же время не мешал другие дела мышкой делать. Хотя тут на форуме такое давно делали и даже чуть ли не фремворк собрали. :) Ладно, вроде скрипт рабочий, а я иду спать - ибо ночь темна и полна ужасов! :o
$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
-
Огромнейшее спасибо. Давно думал как это сделать, но я сейчас учу другой язык, никак не мог начать.
-
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.
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
-
Тебе тоже спасибо, буду смотреть чей больше подойдёт.
-
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.
Здесь, как только кликалка догонит человека с ружьём мышью, она начнёт кликать с первых координат.
-
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.
Здесь, как только кликалка догонит человека с ружьём мышью, она начнёт кликать с первых координат.
Угу. Чтобы это увидеть достаточно закомментировать стоку 16 - MOVE($x_tmp,$y_tmp).
Массивы в этой задаче ненужны. Очередь должна очищаться. А из массива вытащить верхние элементы, так, чтобы все остальные сдвинулись вверх, очень проблемно. "Проще" - это как раз со строкой.
И зачем второй поток? В нем приходится отслеживать событие, которое позволяет сделать клик. Зачем? В одном потоке просто ставим нажатия пробела в очередь, мгновенно и без всяких условий. А второй поток, требует еще как минимум, задержку для разгрузки процессора. От этого страдает точность задержки между кликами. Да и вообще, один поток обычно проще, чем два. :)