Jak rejestrować i odtwarzać aktywność myszy na automatorze w tle?

3

Chcę utworzyć w aplikacji Automator „aplikację” do rejestrowania działań myszy. Kiedy jest uruchomione, chcę, aby wykonywał akcje w tle, tak jak dzieje się to, gdy makro jest uruchamiane w programie Excel, zamiast po prostu odtwarzać je jak film. czy to możliwe?

Rathan
źródło
Co tak naprawdę próbujesz zrobić?
user3439894
próba otwarcia preferencji elementu paska menu, aby usunąć w nim wpisy.
Rathan
Który element paska menu?
user3439894
Copyclip 2> Preferencje> zaawansowane> wyczyść wszystkie klipy
Rathan
Zobacz aktualizację Uwaga: do mojej odpowiedzi.
user3439894,

Odpowiedzi:

2

Aktualizacja Uwaga:

Moja pierwotna odpowiedź, pokazana poniżej, została napisana przy użyciu ogólnego przykładu, a nie rzeczywistego celu, ponieważ nie została jeszcze ujawniona. Raz został ujawniony w komentarzu, Pobrałem CopyClip 2 i napisał AppleScript kod za pomocą interfejsu użytkownika skryptów , aby otworzyć zaawansowane Preferencje okienko , kliknij Usuń wszystkie klipy przycisk , późniejsze Delete All przycisk , zamknij ten Preferencje okno i zamknąć Interfejs użytkownika pokazujący klipy. Działa, jednak jest to Skrypt UIi widzisz to tak, jakby robiono to ręcznie, ale dzieje się to znacznie szybciej i bez widocznych ruchów myszy na ekranie. (Niezupełnie rozwiązanie w tle ).

Jednak powiedziano mi, że CopyClip 2 jest bardzo niestabilny i zawieszał się co drugi lub kilka razy, kiedy uruchamiałem skrypt , i dlaczego nie publikuję kodu, chyba że naprawdę chcesz go zobaczyć. Więc nie polecam metody skryptowania interfejsu użytkownika . Zauważ, że wyrażona niestabilność była po prostu połączona z użyciem AppleScript w aplikacji, a nie jej ogólnym użyciem. (Właściwie nie użyłem go inaczej niż do odpowiedzi na pytanie).

Szukając teraz rozwiązania w tle , zbadałem, jak CopyClip 2 przechowuje klipy, i znalazłem, gdzie był magazyn danych klipów iw jakiej formie. Nic dziwnego, że jest przechowywany w bazie danych SQLite . Dzięki tym informacjom widzę dwie różne opcje:

Pierwszy polega na manipulowaniu danymi przechowywanymi w bazie danych SQLite . Problem polega na tym, że nie zajmuję się programowaniem w języku SQL , więc musiałbyś sam skorzystać z tej opcji.

Druga opcja jest raczej metodą quasi-brute-force, ale działa dobrze i nie spowodowała awarii aplikacji. Polega ona na programowym wyjściu z CopyClip 2 , usunięciu bazy danych klipów i ponownym uruchomieniu CopyClip 2 .

Każda z tych opcji byłaby uważana za metodę tła , szczególnie w porównaniu do korzystania ze skryptów interfejsu użytkownika .

Poniższy przykładowy kod skryptu BASH jest tym, czego użyłem dla drugiej wspomnianej opcji. Można go uruchomić na wiele różnych sposobów.

#!/bin/bash

if [ -n "$(pgrep "CopyClip 2")" ]; then
    pkill "CopyClip 2"
    sleep 1.5
    for i in $HOME/Library/Containers/com.fiplab.copyclip2/Data/Library/Application\ Support/CopyClip/*; do
        rm "$i" 2>/dev/null
    done
    open -a "CopyClip 2"
fi

Po raz pierwszy przetestowane pół kilkanaście razy w Terminalu jako wykonywalnego BASH skryptu przed użyłem kodu w Run Shell Script działania w Automator aplikacji i przetestowane kolejne pół kilkanaście razy. W przypadku moich 2 centów jest to sposób, w jaki starałbym się wykonać opcję programowania SQL , nawet gdybym znał SQL .

Zapisany jako aplikacja Automator , np. Usuń wszystkie klipy CopyClip , użyłem Spotlight, aby go znaleźć i wykonać, tj .:

CommandSpacedelEnter

Aplikacja może być także umieszczony w stacji dokującej dla szybkiego kliknięcia myszy , aby usunąć wszystkie pliki zbyt.

Nawiasem mówiąc, mam również opcję Ukryj okno podczas uruchamiania ustawione na WŁ. Na karcie Ogólne w Preferencjach dla CopyClip 2 , aby wyglądało jak tło w tle . W ten sposób, chyba że patrzysz bezpośrednio na ikonę paska menu dla CopyClip 2 , tak naprawdę nie zauważysz, że został zamknięty i ponownie otwarty.

Należy również pamiętać, że baza danych klipów jest zwykle tworzona przy pierwszym uruchomieniu i tylko zmiany są zapisywane lub usuwane przez CopyClip 2 . Sprawdziłem bazę danych klipów za pomocą SQLiteBrowser, kiedy ją utworzono po raz pierwszy i po usunięciu wszystkich klipów, a jej struktura zasadniczo nie różni się od tej po pierwszym utworzeniu 1 , więc wielokrotne usuwanie bazy danych klipów naprawdę nie stanowi problemu do osiągnięcia celu.
( 1 Chociaż technicznie istnieją pewne różnice, usunięte dane nie zostały jeszcze usunięte z bazy danych za pomocą komendy VACUUM, jednak ta opcja jest wyjątkowo bezpieczna i nie powinna stanowić problemu przy wielokrotnym użyciu).



Oryginalna odpowiedź:

Korzystanie z nagrywania przycisk w Automator , masz nagrany kilka kliknięć myszką na pasku menu i to produkowane Watch Me Wykonaj działanie w obiegu . Następnie uruchom przepływ pracy Automatora zawierający akcję Obejrzyj mnie , aby użyć słów, gra się jak film.

Więc pytasz, czy to może działać w tle bardziej jak makro Excela, a potem grać jak film?

Ogólnie rzecz biorąc, krótka odpowiedź brzmi: tak i nie ... tak bardziej przypomina makro (w pewnym sensie), ale nie nie w tle.

To powiedziawszy, należy jednak pamiętać, że w zależności od docelowej aplikacji i tego, co należy zrobić, może istnieć możliwość zakodowania czegoś do wykonania w tle, ale bez znajomości wyraźnej specyfiki wykracza to poza zakres tej ogólnie mówiąc krótkiej odpowiedzi.

Dłuższa odpowiedź jest, aby przekształcić Watch Me Do działań w odpowiednim AppleScript kodu . Ponieważ jednak korzysta ze skryptów interfejsu użytkownika, nie może działać w tle, ale może działać znacznie wydajniej i szybciej niż odtwarzana akcja Watch Me Do, a na ekranie nie widać ruchów myszy wizualnej. Oznacza to, że po uruchomieniu kodu AppleScript , niezależnie od tego, który sposób wybierzesz, musisz pozwolić skryptowi na nieprzerwane przetwarzanie kodu , co stanowi jedną z wad skryptów interfejsu użytkownika .

Uważam jednak, że będzie to bardziej pożądane niż granie w film i widzenie myszy poruszającej się po ekranie.

Jako przykład, zapis moich działań podczas korzystania z zegara na pasku menu w tym przykładzie, mam zamiar kliknąć na zegar pozycję menu , a następnie kliknij na otwarcia Data & Czas Preferencje ... element menu , a następnie kliknij w Zamknij przycisk na Date & Time Preferencje okienko z preferencji systemowych , który jest otwarty w wyniku poprzednich dwóch kliknięć .

W Automator , wybiorę trzy Imprezy w Watch Me Do działania , a następnie naciśnij przycisk CommandC, aby skopiować te zdarzenia do schowka.

Teraz otwórz Script Editor oraz w nowym dokumencie , naciśnij przycisk CommandV , aby wkleić skopiowane wydarzenia ze schowka.

Spowoduje to wygenerowanie kodu AppleScript pokazanego na samym końcu tej odpowiedzi, który jest tam umieszczony, ponieważ niewiele z niego zostanie faktycznie wykorzystanych, ale będzie zawierał kluczowe fragmenty kodu , więc nie trzeba ręcznie wpisywać całego gotowego kodu i jest tu zawarte tylko dla kompletności tego przykładowego przypadku.

W wklejonym kodzie znajdują się trzy polecenia reprezentujące rzeczywiste zdarzenia kliknięcia , a ponieważ używa ono skryptów interfejsu użytkownika , są one wykonywane przez zdarzenia systemowe .

Tak więc w innym nowym dokumencie , w edytorze skryptów , dodaję tell application "System Events" blok , np .:

tell application "System Events"

end tell

W tym bloku informacyjnym skopiowałem odpowiednią część trzech zdarzeń kliknięcia z kodu wklejonego w innym dokumencie, jednocześnie usuwając niepotrzebny kod i ukośniki odwrotne dla tego przypadku użycia, np .:

tell application "System Events"
    click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell

Ponieważ jest to Skrypt UI , należy dodać odpowiednie delay polecenia , np .:

tell application "System Events"
    click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    delay 0.5
    click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    delay 2.5
    click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell

Teraz, gdy mógłbym uruchomić powyższy kod (a nawet pierwotnie wklejony kod ) i powinien on działać poprawnie w tej chwili, problem polega na tym menu bar item 7, że obecnie zegar w moim systemie może się zmienić. Tak samo w niektórych przypadkach można również menu item nzmienić, choć nie w tym przypadku. Jednak wiedząc o tym, przepiszmy kod, aby nie był zakodowany na stałe na numer pozycji paska menu lub numer pozycji menu :

tell application "System Events"
    -- click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
    delay 0.5
    -- click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
        of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
    delay 2.5
    -- click UI element 1 of window "Date & Time" of application process "System Preferences"
    -- click button 1 of window 1 of application process "System Preferences"
    quit application "System Preferences"
end tell

W kodzie powyżej, oryginalne trzy wiersze kodu zostały wykomentowane, czyli --dodano przed każdym wierszu. Również oryginalny trzeci wiersz ma pod komentarzem dodatkowy wiersz, ale został dodany, aby pokazać, jak uogólnić oryginalny trzeci wiersz. Jednakże, ponieważ jego celem w tym przypadku było zamknąć Preferencje systemowe , po prostu powiedz jej rzucić zamiast.

Ostateczna przykładowa wersja kodu do obsługi trzech zdarzeń, które miały miejsce w przykładowej akcji Watch Me Do w Automatorze :

try
    tell application "System Events"
        click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
        delay 0.5
        click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
            of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
        delay 2.5
        quit application "System Preferences"
    end tell
end try

Teraz porównując ostatnią przykładową wersję powyższego kodu z oryginalnym kodem pokazanym poniżej, widać różnicę i to, co jest konieczne do wyczyszczenia oryginalnego kodu , nie kodując na stałe numeru pozycji paska menu ani numeru pozycji menu , dzięki czemu jest bardziej inteligentny następnie przy użyciu Watch Me do działań w Automator .


Uwaga: przykład AppleScript kod powyżej jest tak, że i sans otoczenie go w try oświadczeniu , nie zawiera żadnej innej obsługi błędów , jakie mogą być właściwe / potrzebne / chciał, spoczywa na użytkownika, aby dodać dowolną odpowiednią obsługi błędów dla każdego przykładu kod przedstawiony i / lub kod napisany przez siebie. Obejmuje to ustawienie wartości z delay komendy odpowiednio do czasu na jedynek własnego systemu.

Dodatkowo, nie wszystkie pozycje menu są tak łatwe do napisania w skrypcie, jak w tym przykładzie, a w niektórych przypadkach może nie działać dobrze nawet przy użyciu tej metody, to po prostu zależy i jest jednym z powodów, dla których starałem się uzyskać od ciebie bardziej wyraźne i konkretne informacje w moje komentarze. Oznacza to, że mogłem dać ci wyraźny i konkretny kod dla twojej natychmiastowej potrzeby, zamiast pisać odpowiedź na przykładzie. Chociaż mam nadzieję, że ten przykład przyda się także innym.


Oryginalny AppleScript kod generowany podczas imprezy zostały skopiowane i wklejone z Watch Me Wykonaj działania w Automator w tym przypadku przykład zastosowania:

-- Click the “clock” menu bar item.
delay 0.249747
set timeoutSeconds to 0.500000
set uiScript to "click menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )

-- Open Date & Time Preferences…
delay 0.186764
set timeoutSeconds to 0.500000
set uiScript to "click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )

-- Click the “<fill in title>” button.
delay 0.509640
set timeoutSeconds to 0.500000
set uiScript to "click UI Element 1 of window \"Date & Time\" of application process \"System Preferences\""
my doWithTimeout( uiScript, timeoutSeconds )

on doWithTimeout(uiScript, timeoutSeconds)
    set endDate to (current date) + timeoutSeconds
    repeat
        try
            run script "tell application \"System Events\"
" & uiScript & "
end tell"
            exit repeat
        on error errorMessage
            if ((current date) > endDate) then
                error "Can not " & uiScript
            end if
        end try
    end repeat
end doWithTimeout
użytkownik3439894
źródło