+8

Hướng dẫn tự động hóa tác vụ trên Linux với Xdotool

1. Mở đầu

Nếu bạn là người yêu thích sự tiện lợi, ghét phải làm các tác vụ đơn giản nhưng phải thực hiện nhiều lần như start project mỗi khi mở máy thì xdotool chính là công cụ dành cho bạn. Hãy cùng khám phá xdotool và xem ví dụ thực hành với mình nhé!

2. Xdotool là gì?

xdotool là một tiện ích dòng lệnh mạnh mẽ cho phép bạn mô phỏng các hành động của người dùng. Từ việc gõ phím, di chuyển chuột, đến việc quản lý cửa sổ, xdotool có thể làm tất cả. Hãy tưởng tượng, bạn chỉ cần 1 click và để xdotool làm tất cả công việc cho bạn!

3. Cài đặt

Bạn có thể cài xdotool theo distribution của bạn:

Debian and Ubuntu: apt-get install xdotool
Fedora: dnf install xdotool
FreeBSD: pkg install xdotool
macOS: brew install xdotool or sudo port install xdotool
OpenSUSE: zypper install xdotool

4. Một số lệnh cơ bản của xdotool

4.1 Typing

Ví dụ: Thay vì gõ từng chữ, bạn chỉ cần nhập lệnh này và xdotool sẽ gõ giúp bạn.
xdotool type 'Hello world!'

4.2 Gửi tổ hợp phím

Cần gửi tổ hợp phím Ctrl+C để sao chép? Hãy thử lệnh:
xdotool key ctrl+c

Danh sách key code trong xdotoo

  • Return
  • Print
  • Tab
  • Space
  • BackSpace
  • Up, Down, Left, Right (Arrow keys)
  • Home, End, Page_Up, Page_Down
  • Insert, Delete
  • F1 to F12
  • a to z, A to Z
  • 0 to 9
  • Escape
  • Shift_L, Shift_R
  • Control_L, Control_R
  • Alt_L, Alt_R
  • Super_L, Super_R (Windows keys)

4.3 Di chuyển chuột

Bạn muốn chuột của mình tự di chuyển mà không cần đụng vào nó? xdotool giúp bạn với lệnh:

#500 và 300 là tọa đọ X và Y trên màn hình.
xdotool mousemove 500 300

# trả về vị trí X, Y của chuột hiện tại 
# ouput: x:1765 y:170 screen:0 window:88080400
xdotool getmouselocation

Ví dụ: để click vào góc trên bên trái của màn hình và di chuyển chuột đến vị trí ban đầu trước khi bạn di chuyển nó:
xdotool mousemove 0 0 click 1 mousemove restore

4.4 Giả lập click chuột

Lệnh này giả lập một cú nhấp chuột, nghĩa là một lần mousedown, sau đó là một lần mouseup với độ trễ ngắn giữa hai lần (hiện tại là 12 mili giây)

click [options]

options: 1 là click bằng chuột trái, 2 là chuột giữa, 3 là chuột phải, 4 cuộn lên, 5 cuộn xuống trang.

Flag

--repeat REPEAT
số lần click. Mặc định là 1. Muốn double-click, dùng --repeat 2

--delay MILLISECONDS
khoảng thời gian dừng tính bằng mili giây giữa các lần click. Option này không hoạt động nếu --repeat = 1

//click 4 lần, delay 100 mili giây giữa các lần click
xdotool click 1 --repeat 4 --delay 100 

4.5 Kéo và thả Chuột

Để bôi đen hoặc kéo và thả chuột (ví dụ như di chuyển một tệp tin), bạn có thể sử dụng:

xdotool mousedown 1
xdotool mousemove 200 200
xdotool mouseup 1

mousedown: Tương tự như nhấp chuột, ngoại trừ việc chỉ gửi sự kiện mouse down
mouseup: Tương tự như nhấp chuột, ngoại trừ việc chỉ gửi sự kiện mouse up

5. Thực hành

Oke, lý thuyết tạm như vậy đã, bây giờ mình sẽ cùng bạn làm ví dụ thực hành nhé.

Tự động mở trang web yêu thích
Mình sẽ tạo 1 script đơn giản để tự động mở trình duyệt Firefox, gõ link bài viết và tự scroll xuống như một user bình thường.

Phân tích ví dụ trên 1 chút, ở đấy mình có 3 step nhỏ:

  1. mở trình duyệt Firefox.
  2. gõ link bài viết.
  3. scroll xuống.

Ở step 1, cần tìm command mở được Firefox:
Command mở app rất đơn giản chỉ cần chạy [ten_package] &

Trong Ubuntu để lấy ra tất cả danh sách packages đã cài dùng: apt list --installed.
Mình muốn tìm tên package của Firefox thì chạy apt list --installed | grep firefox

image.png

Như ảnh bên trên thì firefox chính là tên package. Nên mình chỉ cần chạy firefox & sẽ tự mở được trình duyệt Firefox rồi. Vậy là step 1 đã xong, còn step 2 và 3 mình có giải thích bên trên rồi nên mình không nhắc lại nữa. Chúng ta cùng nhau, thực hành luôn nhé.

Đầu tiên mình tạo file script bằng lệnh touch view_script.sh
Cấp quyền thực thi cho file sudo chmod +x ./view_script.sh
Nội dung file như sau:

#!/bin/bash

#open Firefox browser and background the process
firefox &!

# wait for 1 second
sleep 1

xdotool type --delay 100 'https://viblo.asia/p/2oKLnGKQVQO' 
xdotool key Return

# wait for 5 seconds
sleep 5

# Scroll down
xdotool key Page_Down
sleep 1
xdotool key Page_Down
sleep 1
xdotool key Page_Down

Run file và xem thành quả thôi ./view_script.sh

(UPDATE 22/9/2024) Thử nâng cao hơn chút nhé:
Mục đính chính của việc tạo các file script auto là "Lười" lặp đi lặp lại các hành động không mang nhiều ý nghĩa. Nên mình tạo nhiều file script để phục vụ các mục đính khác nhau. Nhưng để chạy file thì phải mở Terminal -> nhớ và gõ lại đường dẫn file đó, điều đó cũng khá mất thời gian. Nên mình muốn chỉ chạy 1 file script trong file đó mình có thể chọn file script nào mà mình muốn chạy. Oke bắt đầu làm thôi.

Bước 1:

#auto_start.sh
#!/bin/bash

echo "Which script would you like to run?"
echo "1) auto_start_project.sh"
echo "2) auto_start_worker.sh"
echo "3) auto_start_personal.sh"
echo "4) Reboot"
echo "5) Power OFF"
# Đọc input từ user nhập
read -p "Enter the number of your choice: " choice

case $choice in
  1)
    ~/Code/personal/script_auto/auto_start_project.sh
    ;;
  2)
    ~/Code/personal/script_auto/auto_start_worker.sh
    ;;
  3)
    ~/Code/personal/script_auto/auto_start_personal.sh
    ;;
  4)
    systemctl reboot -i
    ;;
  5)
    systemctl poweroff
    ;;
  *)
    echo "Invalid choice. Please enter a number between 1 and 5."
    ;;
esac

Bên trên là file auto_start.sh, mục đích để mình có thể chọn script mình muốn chạy bằng cách nhập (1, 2 ...) .

Có một lưu ý nhỏ là đối với command reboot và poweroff bên trên chỉ chạy được khi bạn tắt hết ứng dụng đang mở. Còn muốn bạn muốn reboot và poweroff ngay lập tức thì có thể thêm flag -i (ignore inhibitors), tuy nhiên điều này là KHÔNG KHUYẾN KHÍCH vì có thể xảy ra lỗi không mong muốn khi bạn cố tình restart/ poweroff máy mà chưa đóng hết ứng dụng đang mở.

Bước 2:
Dù hơi cồng kềnh, nhưng bạn cần tạo thêm 1 file script nữa để gọi đến file auto_start.sh bên trên nó có thể chọn đọc được input user nhập ở terminal.

#call_auto_script.sh
#!/bin/bash

terminator&!
sleep 1

xdotool type "/home/<PATH>/script_auto/auto_start.sh"
xdotool key Return

Oke, đến đây cơ bản là xong rồi, bạn muốn thêm script mới thì thêm ở file auto_start.sh còn khi chạy chỉ cần chạy duy nhất file call_auto_script.sh là được rồi.

Tuy nhiên để chạy file call_auto_script.shmình vẫn cần mở Terminal lên và gõ đường dẫn của file call_auto_script.sh. Nó vẫn khá mất thời gian, liệu có các nào nhanh hơn không???
Có chứ, như mình thì dùng libinput-gestures để đọc cử chỉ trong touchpad. Mình chỉ cần dùng 4 ngón tay vuốt sang trái trong touchpad là nó sẽ gọi file call_auto_script.sh. Để khi nào có thời gian mình sẽ viết bài giới thiệu về nó, còn bây giờ bạn có thể đơn giản là thêm phím tắt để chạy file script.

Như mình dùng Ubuntu thì sẽ mở Setting -> Keyboard Shortcut -> kéo xuống dưới cùng nhấn vào "+" để thêm Custom Shortcut. Sau đó, nhập tên Shortcut, Command: là đường dẫn đến file call_auto_script.sh, Shortcut như ảnh bên dưới là được. Nếu có khó khăn gì thì bạn comment xuống bên dưới để mình giải đáp nhé.

Kết quả khi chạy: image.png

Full script code: https://github.com/quantroy19/script_auto

6. Kết Luận

xdotool là một công cụ cho phép bạn tự động hóa hầu hết mọi thao tác mà bạn có thể thực hiện bằng bàn phím và chuột. Với các lệnh mà chúng ta đã khám phá, bạn có thể dễ dàng tự động hóa các tác vụ hàng ngày, giúp tiết kiệm thời gian và tăng hiệu suất công việc. Hãy thử nghiệm và khám phá thêm nhiều tính năng khác của xdotool, và đừng quên chia sẻ những phát hiện thú vị của bạn với mọi người nhé!

7. Tài liệu tham khảo

https://github.com/jordansissel/xdotool


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí