TechLife devBlog

Automatyzacja myszy i klawiatury

Linux, Software, Techblog 7 stycznia 2010 22:41

Jak wiadomo Linux znany jest z tego, że można tutaj zautomatyzować niemalże wszystko. Zazwyczaj robimy to za pomocą skryptów Basha, Perla czy innego Pythona. Są jednak przypadki, kiedy nie bardzo mamy dojście do API czy komend aby zautomatyzować jakiś proces. Bo jak zautomatyzować np. ruch myszy w środowisku graficznym czy zasymulować wciskanie klawiszy?

Drugą rzeczą, z której znany jest Linux jest to, że zawsze znajdzie się rozwiązanie ;-) Podobnie w tym przypadku rozwiązaniem naszym problemów jest pakiet xautomation (spaczkowany w większości dystrybucji). Dostarcza on bardzo pomocnej komendy jaką jest xte. Podstawowymi parametrami tej komendy są:

key k          Wciśnięcie klawisza k
keydown k      Przytrzymanie klawisza k
keyup k        Zwolnienie klawisza k
str string     Wpisanie ciągu znaków
mouseclick i   Wciśniecie lewego klawisza myszy
mousedown i    Wciśniecie lewego klawisza myszy
mouseup i      Zwolnienie lewego klawisza myszy
mousemove x y  Przemieszczenie kursora na pozycję (x,y)
mousermove x y Względne przemieszczenie kursora na pozycję (x,y)
sleep x        Odczekanie x sekund

Dzięki zastosowaniu tych komend możemy już zautomatyzować wyklikiwanie pewnych czynności, np. głupiej ankiety internetowej lub pajacyka. Swojego czasu używałem tego do łączenia się z ukrytą siecią Wifi, której Gnomowy Network Manager za nic nie umiał mi zapamiętać. Zamiast wyklikiwać codziennie szereg opcji i po raz setny wpisywać długie wygenerowane hasło klikałem tylko w skrypt, który robił wszystko za mnie.

Przykładowy skrypt powtarzający pewną czynność w nieskończoność może wglądać tak:

#!/bin/bash
while [ 1 ]
do
    sleep 1
    xte 'mouseclick 1'

    # otwórz Chrome w trybie porno
    xte 'keydown Control_L' 'keydown Shift_L' 'key n' 'keyup Shift_L' 'keyup Control_L'
    sleep 1

    # wybierz adres
    xte 'str http://...wybierz_polskiego_polityka_roku_2009...'
    xte 'key Return'

    # czekamy na wczytanie strony
    sleep 7

    #wybierz kandydata
    xte 'mousemove 44 490'
    xte 'mouseclick 1' 

    # głosuj
    xte 'mousemove 253 710'
    xte 'mouseclick 1' 
    sleep 1

    # zamknij Chrome
    xte 'keydown Alt_L' 'key F4' 'keyup Alt_L'
done

Dla ułatwienie sobie życia możemy skorzystać z komendy xmousepos, dzięki której nie będziemy musieli zgadywać pozycji kursora. Wystarczy ustawić kursor w odpowiednie miejsce a następnie uruchomić podaną komendę aby uzyskać pozycję kursora, np:

tomek@Arch:~$ xmousepos
1125 136 1125 110
^^ dwie pozycje, bo każdy kij ma dwa końce

W każdym razie miło wiedzieć, że mamy możliwość zautomatyzowania kolejnej czynności ;-)

I <3 Linux

Komentarze z jogger.pl

Zal 07 stycznia 2010 / 22:48

Warto wiedzieć. W przypadku interaktywnych programów tekstowych można natomiast skorzystać z Tcl oraz Expect w celu symulowania obecności użytkownika.

pbm 07 stycznia 2010 / 22:53

Nigdy bym nie wpadł na to, że to może być takie proste.. ;)

Livio 07 stycznia 2010 / 23:09

A niech no wyskoczy inne okienko ;D .

spinus 08 stycznia 2010 / 10:06

polecam użyć cnetworkmanagera (konsolowy klient) zamiast takich kombinacji.

trójkąt 08 stycznia 2010 / 11:17

@spinus: to było dawno, dawno temu. Od tego czasu używam Wicd, który łączy się z siecią na etapie startu systemu.

rad 08 stycznia 2010 / 12:29

Ciekawy program, kiedyś się z nim spotkałem. Ale do takiej automatyzacji na stronach www wykorzystał bym np. skrypt pythona z urllib/mechanize lub czymś podobnym ;)

copyme 10 stycznia 2010 / 01:16

Bardzo przydatne informacje, dzięki.

kodziek 09 lutego 2010 / 04:44

Polecam takze przyjzec sie pakietowi actkbd - pozwala definiowac nie tylko standardowe klawisze ale takze multimedialne. Dziala niezaleznie od x-servera dzieki czemu jestesmy w stanie korzystac z bindow np. w grze

mmmmm 11 lutego 2010 / 13:59

witam. a czy ktoś moglby polecic cos podobnego pod winzgroze?

Jacekd6 21 lutego 2010 / 18:20

Przepraszam ale Wojtek usunąl linki, czy móglbyś podać je tutaj lub na jacekd6@wp.pl z góry dzięki



Komentarze