Author Topic: Складывание координат в массив и их нажатие  (Read 7525 times)

0 Members and 2 Guests are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Во, как теперь понятно описал задачу. Почему сразу было так не сделать. Заставил человека писать код который теперь на помойку.
Ведь умеешь. Некоторые не умееют совсем и от них не добиться четкого описания даже после 3 страниц обсуждений.

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


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
 :) Нет проблем, мне было интересно написать этот скрипт. Главное, что получилось.
      Но на сегодня, к сожалению, мой лимит времени исчерпан.

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Большое спасибо за то что ты сделал.

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
И тебе спасибо за интересную задачу. :) Теперь вроде понятно что нужно сделать.
Вот с утречка накалякал скрипт. Он как бы из двух частей. При запуске он в режиме записи сценария - ждет нажатия пробелов над нужными координатами и записывает эти координаты в массив. При этом скрипт проверяет нажатия клавиш 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

"Пару раз" скрипт запустил, вроде работает, сильно не проверял.
« Last Edit: September 03, 2017, 10:58:14 AM by tmp~1 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Он же вроде писал, что кликать должно сразу начинать. Без запись-воспроизведение.
Просто два потока. В одном ждет нажатия пробела и добавляет в очередь координаты. Во втором если очередь не пуста берём координаты и следим за паузой между преведущим кликом.
Можно всё это и в одном потоке. Точность паузы иногда будет чуть меньше (дольше 2000 мс).


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
А мне казалось, что я понял задачу. ;D Но тогда как можно наводить курсор куда либо, в то время как кликер кликает куда-то в другое место?
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.

Получается только два этапа - запись и воспроизведение. А как ты говоришь, так это ему уже Oraven написал и я тоже, но по другому, как тогда понимал задачу. Тот мой первый скрипт как раз и делает так как ты говоришь. Жалко что он не подошел, тот сильный скрипт, и двухпоточному с ним не тягаться ни в скорости, ни в точности по времени. Да уж куда там с массивами... Может кто захочет доказать обратное и предложит другой сценарий?) А второй скрипт обычный такой, типа детский. Короче надо ждать когда придет Fugger и проверит. Я чем могу стараюсь помочь. :)
« Last Edit: September 03, 2017, 01:12:19 PM by tmp~1 »

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Всё отлично, спасибо что столько намудрил. Хотя как я уже говорил, мне бы лучше чтобы нажатие и записывание проходили одновременно, например сначала текущая позиция мыши заносилась в переменную, потом нажималось, а потом возвращалось обратно.
« Last Edit: September 03, 2017, 07:16:09 PM by Fugger »

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Ну, ничего, он привыкнет и научится отвечать не сразу. Ещё несколько раз так напишет и надоест Вангой работать.
Золотые слова! Да и Ванга из меня получается хреновая. :D Для меня "клик" и "нажатие" - разные вещи. Я не понимаю куда значит "обратно". И как можно раздвоить курсор, чтобы двигать мышью одновременно с Клинерманом. Хотел помочь, а похоже трачу напрасно и свое и чужое время. :-[
HELP! Кто понял задачу, напишите пожалуйста человеку скрипт, третий день уже тема не закрыта.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
У людей выходные. Релаксация и отдых.


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Вот похоже то что надо. Точность не проверял, да она и не нужна. Главное, что при выставленной задержке 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

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Огромнейшее спасибо. Давно думал как это сделать, но я сейчас учу другой язык, никак не мог начать.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

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

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Тебе тоже спасибо, буду смотреть чей больше подойдёт.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

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


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Я ж уже написал простой скрипт. Там правда все клики шли через две секунды но это не сложно поправить.

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

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