# GIỚI THIỆU CHUNG


# 🔥GPM Automate là gì?

#### 🔥 GPM Automate là gì? Nói nôm na cho dễ hiểu

Bạn cứ tưởng tượng GPM Automate là công cụ giúp máy tính tự động làm thay bạn mọi việc trên trình duyệt GPM Login. Thay vì bạn phải ngồi cày tay, click chuột, gõ phím, cuộn trang để làm MMO, Crypto Airdrop, Nuôi tài khoản, Dropshipping... thì bạn chỉ cần ra lệnh cho máy tự chạy hàng loạt trên hàng trăm profile cùng lúc.

Bộ phần mềm này được chia làm 2 phần độc lập, tùy thuộc vào nhu cầu của bạn để chọn phần phù hợp:

**🛠️ GPM Automate Editor – Dành cho người muốn TỰ VIẾT tool**

* Tác dụng: Là nơi để bạn tự sáng tạo, thiết kế và kéo thả các hành động để tạo ra một kịch bản (script) tự động theo ý mình.
* Đầu ra: Nếu dùng bản miễn phí, bạn sẽ xuất ra một thư mục nguồn (Source Folder) để tự dùng. Nếu dùng bản trả phí, bạn sẽ đóng gói kịch bản thành một file mã hóa duy nhất là `.gpmlaunch` để mang đi bán kiếm tiền hoặc chia sẻ mà không lo bị lộ code.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-df3b6f898ca4ffde8901674fcad24ceb57629ce8%2Fimage%20(99).png?alt=media" alt=""><figcaption></figcaption></figure>

**🚀 GPM Automate Runtime – Dành cho người CHỈ MUỐN CHẠY tool (Miễn phí)**

* Tác dụng: Trình chạy này không có chức năng sửa code. Nó chỉ có một nhiệm vụ duy nhất là nạp kịch bản vào, bật lên để nó tự động vận hành trên các profile GPM Login.
* Đối tượng: Nếu bạn mua script/file `.gpmlaunch` từ người khác hoặc mua trên chợ ứng dụng [app.gpmautomate.com](https://app.gpmautomate.com), bạn chỉ cần dùng duy nhất phần Runtime này để mở file lên chạy là xong, không cần quan tâm đến phần Editor.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-3c1d1ba1560a67d4561a4c0500df0b0deae08fdb%2Fimage%20(101).png?alt=media" alt=""><figcaption></figcaption></figure>


# 📥Hướng dẫn tải và cài đặt

Để bắt đầu sử dụng GPM Automate, bạn có thể dễ dàng tải về tại trang chủ của GPM Automate tại đây.

{% embed url="<https://gpmautomate.com/>" %}

Sau khi tải về bạn chạy file cài đặt `.exe`, sau đó bấm Next qua các bước cài đặt là có thể sử dụng phần mềm.

🎥 Xem hướng dẫn cài đặt chi tiết tại đây: [Here](https://www.youtube.com/watch?v=apZWPRFXFlw).

📌 Lưu ý quan trọng:

Hãy đảm bảo máy tính của bạn đã cài đặt và mở sẵn GPM Login vì kịch bản của Automate sẽ trực tiếp điều khiển các profile trên trình duyệt này.

Bạn chỉ cần click đúp chuột thẳng vào file `.gpmlaunch`. Lúc này, trình thực thi GPM Automate Runtime sẽ tự động mở ra và chạy ngay kịch bản mà không yêu cầu bạn phải thao tác cấu hình gì thêm.


# 🚀Hướng dẫn mở script


# 1. File .gpmlaunch là gì?

* Là file chạy kịch bản: Bạn cứ hiểu đơn giản file `.gpmlaunch` giống như một "file phần mềm" đã được đóng gói từ công cụ GPM Automate Editor. Khi ai đó nói "chạy script" hay "chạy tool" thì chính là mở cái file này lên.
* Lấy file này ở đâu: Nếu bạn là dân chuyên tự viết script, bạn có thể tự build ra file này để dùng. Còn nếu là người dùng thông thường, bạn có thể lên chợ ứng dụng [`app.gpmautomate.com`](https://app.gpmautomate.com) để mua, hoặc mua trực tiếp từ các bên dịch vụ gửi file cho bạn.
* Bảo mật tuyệt đối: File này đã được khóa và mã hóa mã nguồn bên trong. Người mua chỉ có quyền bấm chạy chứ không thể xem hay sửa được code, giúp người viết script không bị lộ "bài" hay bị copy chất xám khi bán ra thị trường.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-83a058de99d24cca14f70a346e10179cacb675c6%2Fimage%20(232).png?alt=media" alt=""><figcaption></figcaption></figure>


# 2. Yêu cầu hệ thống để mở file

* Cần cài đặt sẵn phần mềm GPM Automate (hoàn toàn MIỄN PHÍ) trên máy tính chạy hệ điều hành Windows. Hướng dẫn tải và cài đặt xem ở [mục này](/gioi-thieu-chung/huong-dan-tai-va-cai-dat).
* GPM Automate sẽ tự động đăng ký đuôi file hệ thống để nhận diện định dạng `.gpmlaunch`.


# 3. Cách mở và chạy file .gpmlaunch

* Cách mở nhanh nhất: bạn chỉ cần nhấp đúp chuột (double click) trực tiếp vào file `.gpmlaunch` là xong. hệ thống sẽ tự động gọi phần mềm GPM Automate Runtime lên để mở kịch bản.
* Cách quản lý tập trung: bạn cũng có thể mở phần mềm GPM Automate Runtime lên trước, sau đó bấm vào nút `+ Add Application` rồi chọn `Executable file .gpmlaunch` để tìm đến file cần chạy.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-44dbeab604e94fbddb7e499c7f66edcd23208f0e%2Fimage%20(245).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-b1d38db2418376557e86a73238bd90d3307d88ca%2Fimage%20(233).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🎛️Hướng dẫn thiết lập cấu hình để chạy script


# 1. Window & screen (Kích thước & Màn hình hiển thị)

* Window Size: Nhập kích thước chiều rộng (X) và chiều cao (Y) cho cửa sổ trình duyệt khi tool chạy (ví dụ trong hình đang để là `800 x 600`).
* Scale: Tỷ lệ thu phóng hiển thị của trình duyệt (thường để mặc định là `100%`).
* Nếu bạn muốn chạy được nhiều profile (nhiều cửa sổ) cùng lúc, bạn có thể tăng giảm 2 thông số Window Size và Scale cho phù hợp với độ phân giải màn hình và cấu hình máy tính của bạn. **Hiểu nôm na là, nếu Window Size để càng nhỏ, Scale để càng thấp (bé hơn 100%), màn hình độ phân giải càng cao (2K, 4K), máy tính của bạn khoẻ (CPU Xeon, RAM 64GB,...) thì bạn càng chạy được nhiều luồng cùng lúc.**
* Screen: Chọn màn hình mà bạn muốn các cửa sổ trình duyệt hiển thị ra khi tool chạy (phù hợp cho bác nào cắm nhiều màn hình rời).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-7527d5d015685cfe7d52bb32a9785fe8a3d9e524%2Fimage%20(234).png?alt=media" alt=""><figcaption></figcaption></figure>


# 2. Giải thích các thông số cấu hình dữ liệu Excel (Use input Excel)

Khi bạn tích chọn Use input Excel, hệ thống sẽ hiện ra các thông số chi tiết sau để quản lý cách đọc/ghi dữ liệu:

* 📂 Excel file: Bấm vào nút `Browse...` để chọn file dữ liệu đầu vào từ máy tính của bạn. Hệ thống hỗ trợ các định dạng file thông dụng như `.xlsx`, `.xls` hoặc `.csv`.
* 📄 Sheet Id: Chọn số thứ tự của trang tính (Sheet) trong file Excel mà bạn muốn tool đọc dữ liệu. Ô này bắt đầu tính từ số `0` (tương ứng với Sheet đầu tiên bên trái trong file Excel của bạn).
* 🔄 Map mode (Chế độ đọc dòng): Phần này quyết định cách các profile trình duyệt sẽ lấy dữ liệu từ Excel:
  * Each profile reads all rows: Mỗi một profile trình duyệt khi bật lên sẽ đọc và chạy lần lượt tất cả các dòng dữ liệu có trong file Excel.
  * Each profile reads one row: Mỗi profile trình duyệt chỉ lấy đúng một dòng dữ liệu duy nhất để xử lý (phù hợp khi xếp mỗi dòng là thông tin của một tài khoản riêng biệt).
* 🆔 Map according to the profile name in column A: Nếu tích chọn ô này, tool sẽ tự động đối chiếu: Tên của profile GPM Login đang chạy trùng với chữ ở dòng nào trong Cột A của file Excel thì nó sẽ nhảy thẳng vào dòng đó để lấy dữ liệu.
* ✅ Write 'OK' status to the Excel file upon completion: Tự động ghi chữ 'OK' vào file Excel sau khi kịch bản chạy xong. Tính năng này giúp bạn dễ dàng theo dõi xem dòng nào, tài khoản nào đã được tool xử lý thành công.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-08cf6a9663187b29107b85951f400e7bb3796ef2%2Fimage%20(235).png?alt=media" alt=""><figcaption></figcaption></figure>


# 3. Input from application (Các thông số cấu hình do người viết tool để lộ ra ngoài)

Đây là phần cực kỳ tiện lợi khi dùng file `.gpmlaunch`. Người viết kịch bản (script) khi khóa file đã cố ý để lộ ra một vài ô trống để bạn tự điền hoặc tùy chỉnh theo nhu cầu thực tế của mình (giống như giao diện bạn đang thấy trong hình dưới).

* Lưu ý khi chạy tool: Mỗi một file `.gpmlaunch` của các tác giả khác nhau sẽ hiện các ô nhập dữ liệu khác nhau ở mục này (ví dụ: ô điền thời gian chờ, ô chọn file lưu kết quả, hoặc ô điền số thứ tự tính năng...). Vì vậy, khi mở script lên, bạn nhớ để ý xem ở đây có các mục nào cần điền thì điền vào theo đúng hướng dẫn của người bán tool nhé.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4079956506edf0e4a888923486ba0b7c93959855%2Fimage%20(237).png?alt=media" alt=""><figcaption></figcaption></figure>


# 4. Session Configuration (Cấu hình phiên chạy)

Mục này dùng để thiết lập cách kịch bản vận hành, xử lý luồng và đối phó với các tình huống lỗi khi chạy hàng loạt. Cụ thể các thông số như sau:

* 🔢 Number of Threads (Số luồng chạy song song): Điền số lượng profile trình duyệt bạn muốn phần mềm bật lên và chạy cùng một lúc (ví dụ trong hình là `10` luồng). Tùy vào cấu hình máy mạnh hay yếu để bạn chỉnh số này cho phù hợp.
* ⏱️ Thread delay (s) (Thời gian chờ mở luồng): Khoảng thời gian cách nhau (tính bằng giây) giữa việc mở luồng này với luồng tiếp theo. Nên để tầm 3-5 giây để tránh việc máy tính bật quá nhiều trình duyệt cùng một lúc gây giật lag.
* 🛡️ Skip proxy check before opening profile: Tích chọn nếu muốn bỏ qua bước kiểm tra kết nối mạng của Proxy trước khi mở profile GPM Login (hệ thống không khuyến khích chọn vì nếu Proxy chết, trình duyệt vẫn mở lên nhưng không có mạng).
* ❌ Do not close profile on error: Khi tool chạy gặp lỗi ở một bước nào đó, trình duyệt sẽ giữ nguyên trạng thái lỗi đó và không tự động tắt đi. Tính năng này rất tiện cho việc kiểm tra, soi lỗi (debug) xem script bị kẹt ở đâu.
* 🧠 Performance limit at 90%: Giới hạn hiệu năng của phần mềm ở mức tối đa 90%. Bật cái này lên giúp máy tính không bị quá tải CPU/RAM khi cắm nhiều luồng liên tục.
* 👁️ Hide window when done and active when process resume: Tự động ẩn cửa sổ trình duyệt đi sau khi đã hoàn thành công việc và hiện lại khi quá trình tiếp tục chạy.
* 🖱️ Use virtual mouse: Tích chọn để sử dụng chuột ảo của hệ thống (như hình đang bật). Việc này giúp giả lập các thao tác rê chuột, click chuột mượt mà và giống người thật hơn, hạn chế tối đa việc bị các trang web quét bot.
* 🔄 Restart on error. Number of tries: Nếu tích chọn, khi tool chạy bị lỗi giữa chừng, hệ thống sẽ tự động tắt profile đó đi và bật lại để chạy lại từ đầu. Bạn có thể tự điền số lần muốn thử lại tối đa ở ô bên cạnh.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-eeea4be6afc074875f4a1569f3bd687b993eb980%2Fimage%20(238).png?alt=media" alt=""><figcaption></figcaption></figure>


# 5. Schedule (Hẹn giờ chạy kịch bản)

Tính năng này cực kỳ hữu ích cho những ai muốn cắm tool chạy tự động 24/7 mà không cần phải canh để bấm bằng tay.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/C8Kf-d9_-sw).

Để sử dụng, bạn tích chọn vào ô Use scheduling feature (như trong hình dưới).

> ⚠️ Lưu ý quan trọng: Bạn phải luôn giữ cho phần mềm GPM Automate Runtime bật thì lịch hẹn giờ mới có tác dụng. Nếu tắt phần mềm đi, lịch hẹn giờ sẽ không chạy.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-10d382aa297d134116b43b2e6f814f15e0480400%2Fimage%20(241).png?alt=media" alt=""><figcaption></figcaption></figure>

Để tạo và quản lý các khung giờ chạy, bạn bấm vào nút `⚙️ Manage schedules`. Hệ thống sẽ cho phép bạn thiết lập 2 kiểu hẹn giờ chính tùy theo nhu cầu:

**🔄 Kiểu 1: Repeat after (Chạy lặp lại sau một khoảng thời gian)**

* Cách hoạt động: Tool sẽ tự động chạy lại kịch bản sau mỗi khoảng thời gian (Giờ - Phút - Giây) mà bạn thiết lập.
* Ví dụ thực tế: Như trong hình, lịch tên là `15s` được cài đặt ở mục Second là `15`. Nghĩa là cứ sau mỗi 15 giây, tool sẽ tự động kích hoạt chạy lại kịch bản một lần.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-1f51c7ff27828fcf451d67fbf56c695aca36746c%2Fimage%20(243).png?alt=media" alt=""><figcaption></figcaption></figure>

**📍 Kiểu 2: Time points (Chạy vào các mốc giờ cố định)**

* Cách hoạt động: Tool sẽ canh đúng đến các mốc giờ cụ thể mà bạn cài đặt trong ngày để tự động bật lên chạy. Bạn có thể bấm nút `+ Add` để thêm nhiều mốc giờ khác nhau.
* Ví dụ thực tế: Như trong hình, lịch tên là `20h00` được cài đặt mốc thời gian là `20 : 0 : 0`. Nghĩa là cứ đúng 20 giờ 00 phút hàng ngày, tool sẽ tự động mở lên chạy.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-e491cf0ce728f8362f87eb924a4be2162755f3b7%2Fimage%20(239).png?alt=media" alt=""><figcaption></figcaption></figure>


# 6. Profile (Chọn profile trình duyệt để chạy tool)

Sau khi thiết lập xong cấu hình và lịch trình ở bước trước, bạn bấm `Continue` để chuyển sang bước 3 là chọn các profile trình duyệt muốn áp dụng kịch bản (giao diện như hình dưới). Các thao tác tại đây bao gồm:

**🤖 1. Chọn công nghệ điều khiển và ứng dụng trình duyệt**

Nhìn vào thanh menu phía trên danh sách profile (như hình dưới), bạn cần thiết lập:

* Công nghệ cốt lõi: Lựa chọn giữa Puppeteer enhanced engine hoặc Selenium tùy thuộc vào loại công nghệ mà kịch bản của bạn muốn để điều khiển trình duyệt.
* Ứng dụng trình duyệt: Chọn loại trình duyệt bạn đang dùng để quản lý tài khoản, ví dụ như GPM Login Global, GPM Login bản cũ, hoặc GoLogin...
* Cấu hình kết nối: Bấm trực tiếp vào nút 🔌 API ngay bên cạnh để thiết lập cổng (Port) và đường dẫn kết nối đến phần mềm antidetect browser của bạn.

**📁 2. Tìm kiếm và lọc nhóm profile**

* Chọn nhóm (Group): Ô ngoài cùng bên trái (đang hiển thị chữ `All`) giúp bạn lọc nhanh danh sách theo từng nhóm profile riêng biệt cho dễ quản lý.
* Tìm kiếm nhanh: Gõ tên tài khoản vào ô `Search profile name...` để tìm đúng profile cần chạy mà không phải cuộn chuột tìm kiếm thủ công.

**🖱️ 3. Cách chọn nhanh nhiều profile cùng lúc**

Để chọn các profile muốn chạy, bạn có thể áp dụng các mẹo thao tác cực nhanh sau:

* Chọn thủ công: Bấm chuột trực tiếp vào từng dòng profile.
* Quét chuột: Nhấn giữ chuột trái và kéo rê qua các dòng để bôi đen chọn hàng loạt profile nằm liền nhau.
* Dùng phím Shift: Bấm chọn profile đầu tiên, nhấn giữ phím `Shift` rồi bấm chọn profile cuối cùng để lấy toàn bộ danh sách ở giữa.
* Dùng phím Ctrl: Nhấn giữ phím `Ctrl` rồi bấm chuột vào các profile nằm rời rạc nhau để chọn riêng lẻ.
* Chọn tất cả (Ctrl + A): Bấm vào vùng danh sách rồi nhấn tổ hợp phím `Ctrl + A` để chọn toàn bộ profile đang hiển thị.

> 💡 Mẹo tự động lọc: Nếu ở bước cài đặt Excel (mục số 2) bạn đã tích chọn tính năng *Map according to the profile name in column A*, hệ thống sẽ tự động lọc và chỉ giữ lại những profile nào có tên trùng khớp chính xác với dữ liệu ở Cột A trong file Excel của bạn.

Sau khi chọn xong các profile, nút ▶️ Start ở góc dưới cùng bên phải sẽ sáng lên. Bạn chỉ cần bấm vào đó để tool chính thức vận hành tự động.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5c16802a6a33b19d59ed01abe7ca590659d8ff2a%2Fimage%20(244).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🛠️Hướng dẫn Test action (Kiểm thử)

Việc kiểm thử (Test) là bước quan trọng giúp bạn kiểm soát luồng chạy của kịch bản, cho phép chạy thử từng bước hoặc từng khối lệnh để đảm bảo mọi thứ vận hành đúng ý đồ trước khi chạy thực tế.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/zrX3ldxvEDE).

### 🎯 Tại sao cần Test action?

* Kiểm soát lỗi: Phát hiện và xử lý vấn đề ngay khi thực hiện hành động, thay vì phải chạy toàn bộ kịch bản từ đầu.
* Tinh chỉnh linh hoạt: Bạn có thể cô lập một hành động đơn lẻ hoặc một khối lệnh (Block) để kiểm tra, giúp rút ngắn thời gian debug.
* Quy trình làm tới đâu, test tới đó: GPM Automate hỗ trợ cơ chế kiểm thử trực tiếp trên các profile của GPM Login, giúp bạn quan sát kết quả ngay lập tức trên trình duyệt.

> Lưu ý: Tính năng Test hiện tại chỉ hỗ trợ các profile trong GPM Login.

### ⚙️ Quy trình thực hiện Test

Để bắt đầu quá trình kiểm thử, bạn thực hiện theo các bước sau:

#### 1️⃣ Bước 1: Cấu hình profile trong GPM Login

* Mở GPM Login.
* Tìm đến profile bạn muốn dùng để test.
* Nhấn vào dấu 3 chấm ở cạnh tên profile.
* Chọn Chạy với remote port để lấy thông số cổng điều khiển.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FeJGlbudOwkdIgAPkpGDQ%2Fimage.png?alt=media&amp;token=0c5f6e4b-c208-4013-bef1-990940da9ff4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2F3sbfQByjnwlA1zObJwvb%2Fimage.png?alt=media&amp;token=4ad37359-1a90-48e0-888d-87645d9095af" alt=""><figcaption></figcaption></figure>

#### 2️⃣ Bước 2: Thiết lập trong GPM Automate

* Tại giao diện GPM Automate, chọn lệnh (Action) hoặc khối lệnh (Block) mà bạn muốn thực hiện kiểm thử.
* Trên thanh công cụ phía trên, nhấn vào nút Test.
* Một hộp thoại cấu hình Test sẽ hiện ra.
* Nhập Port (cổng) đã lấy được từ GPM Login ở Bước 1 vào ô tương ứng.
* Nhấn Start để bắt đầu.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FUyUVUTT12OrUurjXQMpg%2Fimage.png?alt=media&amp;token=40f4018d-9454-4197-a0cf-c5f02d9ac3de" alt=""><figcaption></figcaption></figure>

#### 3️⃣ Bước 3: Quan sát kết quả

* Sau khi nhấn Start, hệ thống sẽ thực thi lệnh trên profile đã chọn.
* Bạn theo dõi kết quả hiển thị ngay tại cửa sổ trình duyệt và nhật ký (Log) của GPM Automate để điều chỉnh kịch bản nếu cần thiết.


# 🔄Hướng dẫn kiểm tra và cập nhật Automate

Cập nhật phần mềm GPM Automate và cập nhật script trên App Store là 2 việc tách biệt, không tự động kéo theo nhau.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://www.youtube.com/watch?v=THl8V2nO8ew).

* 🖥️ Cập nhật GPM Automate: vá lỗi, thêm action mới cho chính phần mềm.
* 📦 Cập nhật script trên App Store: tác giả sửa logic/tính năng/fix lỗi cho riêng file `.gpmlaunch` đó.

> Muốn cập nhật script: vào <https://app.gpmautomate.com/profile/apps> → mục App đã mua → nhấn Tải app đúng theo tên app cần cập nhật → mở lại file mới vừa tải về.


# 🗑️Hướng dẫn fix lỗi cập nhật

Trong trường hợp GPM Automate hoạt động không ổn định hoặc gặp lỗi trong quá trình cập nhật, bạn có thể cần gỡ phần mềm ra và cài đặt lại bản mới để hệ thống hoạt động trơn tru hơn.

### Các Bước Gỡ Cài Đặt

1️⃣ Bước 1: Đóng hoàn toàn tất cả các cửa sổ Editor và Runtime của GPM Automate đang mở trên máy.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FV8K9Dei0vVuBQBBWRieF%2Fimage.png?alt=media&amp;token=d2006707-aa18-4d76-81e2-74d842f2f7e2" alt=""><figcaption></figcaption></figure>

2️⃣ Bước 2: Nhấn phím Start (biểu tượng Windows) trên màn hình, gõ tìm kiếm từ khóa Control Panel và mở ứng dụng lên.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FGDZPtaB2bSMYAuI5rhp7%2Fimage.png?alt=media&amp;token=34dbba1f-0b10-4226-a1b3-bbb83ec10374" alt=""><figcaption></figcaption></figure>

3️⃣ Bước 3: Trong cửa sổ Control Panel, tìm và chọn mục Uninstall a program (Gỡ cài đặt chương trình).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FOTeBAuCdnHF5G9oynimN%2Fimage.png?alt=media&amp;token=d736962d-b0b3-4996-8451-e4bf5d27fd2e" alt=""><figcaption></figcaption></figure>

4️⃣ Bước 4: Tìm đến phần mềm GPM Automate trong danh sách, nhấn chọn và bấm Uninstall để tiến hành gỡ bỏ hoàn toàn.

*Mẹo nhỏ: Sau khi gỡ cài đặt thành công, bạn có thể tải lại bộ cài đặt mới nhất từ trang chủ của GPM Softwares và tiến hành cài đặt lại như bình thường.*

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fceu352MwK2pZVg0TN3Bn%2Fimage.png?alt=media&amp;token=b8b39d36-cd73-464c-8c6b-7caba553aec9" alt=""><figcaption></figcaption></figure>


# 🛠️Hướng dẫn Tính năng Gen AI Workflow (Tạo kịch bản bằng AI)

Tính năng Gen AI Workflow cho phép bạn khởi tạo kịch bản automation hoàn chỉnh chỉ bằng mô tả ngôn ngữ tự nhiên. Hiểu nôm na là AI tự lướt web giúp mình — AI được cấu hình sẵn trong GPM Automate sẽ tự động đọc nội dung, phân tích yêu cầu, kết hợp với Agent lướt web thực tế để phân tích full cấu trúc trang và lấy XPath chuẩn xác như người thao tác thật trước khi tự động sinh các action đẩy vào workflow.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/gsLU5H95fl8).

> Lưu ý: Tính năng Gen AI Workflow hiện tại hỗ trợ phân tích trực tiếp trên các profile trong GPM Login khi chạy ở chế độ Live.

### ⚙️ Quy trình thực hiện Gen AI Workflow

Để bắt đầu quá trình khởi tạo kịch bản tự động bằng AI, bạn thực hiện theo các bước sau:

#### 1️⃣ Bước 1: Cấu hình profile trong GPM Login

* Mở GPM Login.
* Tìm đến profile bạn muốn dùng để test.
* Nhấn vào dấu 3 chấm ở cạnh tên profile.
* Chọn Chạy với remote port để lấy thông số cổng điều khiển.

> Giải thích: Việc mở remote port giống như tạo một "cây cầu nối" cho phép AI và GPM Automate trực tiếp điều khiển, truy cập vào profile trình duyệt đang mở để lướt web và đọc cấu trúc trang real-time.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2FeJGlbudOwkdIgAPkpGDQ%2Fimage.png?alt=media&amp;token=0c5f6e4b-c208-4013-bef1-990940da9ff4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2F3sbfQByjnwlA1zObJwvb%2Fimage.png?alt=media&amp;token=4ad37359-1a90-48e0-888d-87645d9095af" alt=""><figcaption></figcaption></figure>

#### 2️⃣ Bước 2: Thiết lập trong GPM Automate

* Trên thanh công cụ của GPM Automate, chọn **Generate with AI**.
* Cửa sổ cấu hình Gen AI sẽ hiện lên với các thông số:
  * **Remote debug port:** Dán Port (cổng) đã lấy từ GPM Login ở Bước 1 vào ô này để kết nối với profile.
  * **Chế độ (Mode):**
    * **Static:** Tự gen theo kịch bản, AI tự giả tưởng ra XPath mà không có Agent lướt web.
    * **Live:** Agent trực tiếp lướt web đọc full cấu trúc trang và lấy XPath chuẩn xác như người thật.
  * **AI Provider:** Chọn nhà cung cấp AI (**ChatGPT/OpenAI**, **Claude**, **Gemini**, **DeepSeek** hoặc **Custom AI** đã tự cấu hình trong phần Cài đặt của GPM Automate), sau đó chọn **Model** phù hợp.
  * **Workflow Description:** Nhập câu lệnh/mô tả kịch bản tự nhiên mà bạn muốn khởi tạo.
  * **Apply Mode:**
    * **Replace current workflow:** Thay thế toàn bộ kịch bản hiện tại.
    * **Append to main block:** Chèn tiếp các action mới vào cuối kịch bản chính.
* Nhấn **Start session**, trình duyệt sẽ tự động mở và chạy thực thi quá trình phân tích kịch bản.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-225af70ea4c9b4af964eebc3d920596c71739008%2Fgen%20ai.jpg?alt=media" alt=""><figcaption></figcaption></figure>

#### 3️⃣ Bước 3: Quan sát kết quả

* Sau khi trình duyệt tự chạy và hệ thống hoàn tất quá trình Generate, nhấn **Apply** để đẩy các action vừa tạo vào workflow.
* Bạn theo dõi các khối lệnh được chèn vào giao diện GPM Automate và tiến hành kiểm thử kịch bản để tinh chỉnh nếu cần thiết.


# 📦Một số biến mặc định

Một số biến mặc định được dùng trong Automate

### Các biến hệ thống mặc định (System Variables)

Trong quá trình xây dựng kịch bản, GPM Automate tự động cung cấp sẵn một số biến hệ thống. Bạn có thể gọi các biến này ở bất kỳ hành động nào để lấy thông tin của Profile hoặc dữ liệu Excel đang xử lý mà không cần phải tự khởi tạo.

#### 1. Nhóm biến thông tin Profile

Các biến này giúp kịch bản nhận diện và xử lý dữ liệu theo từng Profile Browser đang vận hành:

* 🆔 `$profileId`: Trả về ID định danh duy nhất của profile đang mở.
* 🏷️ `$profileName`: Trả về tên hiển thị của profile đang mở.
* 🌐 `$profileProxy`: Trả về thông tin Proxy (IP) mà profile đang mở đang sử dụng.

#### 2. Nhóm biến vòng lặp

* 🔄 `$loopIndex`: Trả về chỉ số (thứ tự đếm) hiện tại của vòng lặp For. Biến này tự động tăng lên sau mỗi lượt lặp.

#### 3. Nhóm biến quản lý dữ liệu Excel (`$inputExcel`)

Khi kịch bản của bạn cấu hình sử dụng một file Excel đầu vào để đọc/ghi dữ liệu, hệ thống sẽ tự động kích hoạt các biến sau:

* 📂 `$inputExcel`: Đại diện cho chính file Excel đầu vào đang được liên kết trong kịch bản.
* 📍 `$inputExcelFileLocation`: Trả về đường dẫn (File Path) chính xác của file Excel đầu vào trên máy tính.
* 📊 `$inputExcelTotalRows`: Trả về tổng số dòng đang có dữ liệu bên trong file Excel đầu vào.
* 🔢 `$inputExcelCurrentRow`: Trả về số thứ tự của dòng hiện tại đang được truy xuất và xử lý trong quá trình đọc file Excel.

> 💡 Quy tắc chung về Biến: Trong GPM Automate, tất cả các biến (bao gồm biến hệ thống có sẵn và biến do bạn tự đặt tên khi làm kịch bản) đều bắt đầu bằng ký tự `$`


# 🧱Các block


# Normal block

Khối lệnh tuần tự (Normal block)

Đây là khối lệnh cơ bản nhất để chứa các hành động. Bạn cứ đưa các hành động vào trong này, hệ thống sẽ tự động chạy lần lượt từ trên xuống dưới, làm xong việc này mới chuyển sang việc tiếp theo.

* Tác dụng: Dùng để nhóm các hành động có cùng mục đích lại cho gọn, kịch bản sẽ nhìn thoáng và dễ quản lý hơn nhiều.

💡 Mẹo: Khi kịch bản quá dài, bạn nên chia nhỏ ra thành các khối riêng (ví dụ: khối Đăng nhập, khối Tương tác, khối Đổi mật khẩu...) để sau này cần sửa lỗi hay chỉnh sửa gì cho từng phần cũng rất nhanh và không bị rối.


# For

For là khối lệnh dùng để lặp đi lặp lại một nhóm hành động với số lần được xác định trước. Vòng lặp này sử dụng một biến đếm mặc định là $loopIndex để theo dõi tiến trình lặp.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/4O4dPC-CNHM).

#### Các tham số cấu hình trong vòng lặp For:

* 🟢 Start: Giá trị bắt đầu của biến lặp `$loopIndex`.
* 🔴 End: Giá trị kết thúc. Vòng lặp sẽ dừng lại khi `$loopIndex` đạt đến giá trị `End - 1`.
* ⚡ Increase by: Bước nhảy (giá trị tăng thêm) của `$loopIndex` sau mỗi lượt lặp hoàn thành.

#### Ví dụ thực tế: Kết hợp vòng lặp For để đọc toàn bộ dữ liệu file Excel

Giả sử bạn có một file Excel tên là `test.xlsx` và bạn cần cấu hình kịch bản để đọc toàn bộ dữ liệu tại cột B của file này. Bạn có thể kết hợp vòng lặp For với biến hệ thống `$inputExcelTotalRows` như sau:

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/kbh7muMDGtI).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-316a30d10998c5e707a6b99682e46261e6afeffe%2Fimage%20(102).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-9a20b8295d7aaa80342ae0291e3ae03318165302%2Fimage%20(103).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-c07b81a18e7038bcf31d9e44367767ffb0675fe8%2Fimage%20(104).png?alt=media" alt=""><figcaption></figcaption></figure>


# While

While là khối lệnh dùng để lặp đi lặp lại một nhóm hành động liên tục cho đến khi một điều kiện (Condition) được thỏa mãn thì mới dừng lại.

Khác với vòng lặp For (lặp với số lần cố định), vòng lặp While thường được sử dụng khi bạn chưa biết trước kịch bản sẽ phải lặp lại bao nhiêu lần, mà phụ thuộc hoàn toàn vào trạng thái thực tế lúc chạy.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/4O4dPC-CNHM).

#### Cách thức hoạt động:

* Trước khi bắt đầu mỗi lượt lặp, hệ thống sẽ kiểm tra điều kiện (Condition) mà bạn cấu hình.
* Nếu điều kiện chưa thỏa mãn, các hành động bên trong khối While sẽ tiếp tục được thực thi.
* Ngay khi điều kiện thỏa mãn, hệ thống sẽ dừng vòng lặp lại và chuyển sang các hành động tiếp theo bên dưới khối While.

#### Ví dụ thực tế: Chờ lấy mã OTP Mail/Telegram

Giả sử bạn làm kịch bản đăng ký tài khoản và cần chờ hệ thống gửi mã OTP về Email. Vì thời gian Mail về có thể nhanh hoặc chậm, bạn không thể biết trước phải chờ bao lâu:

* Bạn đặt hành động Read mail code vào trong khối While.
* Điều kiện dừng của vòng lặp: Khi biến `$otpCode` nhận được giá trị (không còn rỗng).
* Hệ thống sẽ liên tục kiểm tra và đọc hòm thư. Ngay khi lấy được mã OTP thành công, điều kiện thỏa mãn, vòng lặp dừng lại để kịch bản chạy tiếp bước điền mã.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-0053acfc883a1a11f3e3b7e1a1cacaf44380ee5b%2Fimage%20(105).png?alt=media" alt=""><figcaption></figcaption></figure>

> ⚠️ Lưu ý quan trọng: Khi sử dụng vòng lặp While, bạn cần đảm bảo các hành động bên trong khối lệnh sẽ làm thay đổi trạng thái của điều kiện dừng. Nếu điều kiện cấu hình sai hoặc Mail không bao giờ về, kịch bản sẽ rơi vào trạng thái lặp vô hạn (treo kịch bản).
>
> Để tối ưu, bạn nên kết hợp thêm một biến đếm số lần kiểm tra. Nếu quá 10 lần mà không có Mail, hãy dùng hành động Exit loop để thoát vòng lặp, hoặc hành động Stop để dừng hẳn chương trình và chuyển sang profile tiếp theo.


# If, Else if và Else

Đây là nhóm khối lệnh dùng để rẽ nhánh kịch bản dựa trên các điều kiện thực tế lúc chạy. Thay vì chạy một mạch từ trên xuống dưới, hệ thống sẽ kiểm tra xem điều kiện bạn đặt ra là Đúng hay Sai để quyết định hướng đi tiếp theo cho kịch bản. Nói cách khác, nhóm khối lệnh này đóng vai trò như bộ não quyết định, giúp kịch bản tự động xử lý linh hoạt mọi tình huống biến động trên trình duyệt.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/ZFS_82u23Cs).

#### 1. Khối lệnh điều kiện (If)

If là khối lệnh kiểm tra một điều kiện xác định đầu tiên. Nếu điều kiện đó Đúng, hệ thống sẽ thực hiện toàn bộ các hành động được đặt bên trong khối If này. Nếu Sai, hệ thống sẽ bỏ qua và kiểm tra tiếp xuống dưới.

#### 2. Khối lệnh điều kiện bổ sung (Else if)

Else if luôn luôn đi sau khối If (hoặc đi sau một Else if khác). Khối này được kích hoạt khi các điều kiện phía trên nó đều bị Sai. Hệ thống sẽ tiến hành kiểm tra điều kiện của riêng nó, nếu Đúng thì chạy các hành động bên trong, nếu Sai thì lại bỏ qua.

> Bạn có thể thêm nhiều khối Else if liên tiếp nhau để kiểm tra nhiều trường hợp khác nhau của kịch bản.

#### 3. Khối lệnh phủ định (Else)

Else là khối lệnh bọc lót cuối cùng trong chuỗi điều kiện và không cần cấu hình bất kỳ điều kiện nào cả. Khi tất cả các khối If và Else if phía trên đều Sai (không có trường hợp nào thỏa mãn), hệ thống sẽ tự động nhảy vào và thực thi các hành động nằm bên trong khối Else.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-07bd4a262759f6d6a357d5eb1349837f8cb5d93c%2Fimage%20(106).png?alt=media" alt=""><figcaption></figcaption></figure>

#### Ví dụ thực tế: Kiểm tra trạng thái đăng nhập của tài khoản

Khi bạn mở một trang web lên (ví dụ: Facebook, X...), trạng thái của tài khoản trên profile có thể khác nhau. Bạn có thể dùng chuỗi If - Else if - Else để xử lý mượt mà mọi tình huống:

* Nếu (If): Thấy nút "Tạo bài viết" (Chứng tỏ tài khoản đã đăng nhập sẵn).
  * *Hành động*: Tiến hành điền nội dung và đăng bài luôn.
* Ngược lại nếu (Else if): Thấy ô nhập "Tên đăng nhập / Mật khẩu" (Tài khoản đã bị đăng xuất).
  * *Hành động*: Gọi dữ liệu từ biến để điền tài khoản, mật khẩu và bấm Đăng nhập.
* Ngược lại tất cả (Else): Không thấy nút Đăng bài mà cũng không thấy ô Đăng nhập (Có thể tài khoản đã bị checkpoint hoặc lỗi mạng).
  * *Hành động*: Dùng lệnh Stop để dừng chương trình hoặc chụp ảnh màn hình (Screenshot) để kiểm tra sau.


# Hướng dẫn viết Điều kiện

Khi sử dụng các khối điều hướng như If, Else if, hoặc While, bạn cần thiết lập một biểu thức điều kiện để hệ thống kiểm tra lúc chạy. Biểu thức này sẽ trả về kết quả Đúng (true) hoặc Sai (false).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/L-w9dT8B2DM).

> ⚠️ Quy tắc cốt lõi về Chuỗi (String): Đối với kiểu dữ liệu là chữ/chuỗi, bạn bắt buộc phải bọc trong dấu ngoặc kép `""` (Ví dụ: `$name = "admin"`). Đối với số thì điền trực tiếp.

#### 1. Các toán tử so sánh Số học (Chỉ áp dụng cho Số)

* `>` : Lớn hơn. (Ví dụ: `$count > 5`)
* `<` : Nhỏ hơn. (Ví dụ: `$loopIndex < 10`)
* `>=` : Lớn hơn hoặc bằng.
* `<=` : Nhỏ hơn hoặc bằng.

#### 2. Các toán tử so sánh Logic (Áp dụng cho cả Số và Chuỗi)

* `=` : Bằng nhau.
  * *Ví dụ*: `3 = 3` ➡️ `true`
  * *Ví dụ*: `"hello" = "hola"` ➡️ `false`
* `!=` : Khác nhau (Phủ định của phép bằng).
  * *Ví dụ*: `3 != 4` ➡️ `true`
  * *Ví dụ*: `"hello" != "hello"` ➡️ `false`

#### 3. Các toán tử xử lý Chuỗi (String)

* `contains` : Kiểm tra xem chuỗi phía trước có chứa chuỗi phía sau hay không.
  * *Ví dụ*: `"ABCD" contains "AB"` ➡️ `true`
  * *Ví dụ*: `"AB" contains "ABCD"` ➡️ `false`
* `!contains` : Kiểm tra xem chuỗi phía trước có KHÔNG chứa chuỗi phía sau hay không.
  * *Ví dụ*: `!"ABCD" contains "AB"` ➡️ `false`
  * *Ví dụ*: `!"AB" contains "ABCD"` ➡️ `true`
* `contains "B"` (Khi đứng một mình trước B): Kiểm tra xem biến hoặc chuỗi cần xét có phải là chuỗi rỗng hay không.
  * *Kết quả*: Trả về `true` nếu rỗng, và `false` nếu có chứa dữ liệu.

#### 4. Hàm kiểm tra phần tử trên giao diện (Element)

Hàm này giúp kịch bản nhận diện sự xuất hiện của các nút bấm, ô nhập liệu... trên trang web thông qua đường dẫn XPath:

* `hasElement(XPATH)` : Điều kiện đúng khi phần tử có tồn tại trên trang.
* `!hasElement(XPATH)` : Điều kiện đúng khi phần tử không tồn tại trên trang (Phủ định của `hasElement`).

#### 5. Cách kết hợp nhiều điều kiện phức tạp

Bạn có thể kết hợp nhiều điều kiện lại với nhau trong một hàng bằng cách sử dụng các ký hiệu logic và dấu ngoặc đơn `()` để gom nhóm:

* `&&` : Phép VÀ (Tất cả các điều kiện phải đồng thời đúng).
* `||` : Phép HOẶC (Chỉ cần một trong các điều kiện đúng là được).

Ví dụ thực tế khi viết điều kiện:

* *Trường hợp 1*: Kiểm tra số lượt lặp lớn hơn 5 và tên tài khoản có chứa chữ "abc":

  ```
  $count > 5 && $name contains "abc"
  ```
* *Trường hợp 2*: Kiểm tra nếu không xuất hiện nút Login (đã đăng nhập) HOẶC biến báo lỗi đang hiển thị chữ "true":

  ```
  !hasElement(//div[@id='x']) || $error = "true"
  ```


# 📊Variables


# Set variable

Đây là hành động dùng để tạo mới hoặc thay đổi giá trị của một biến (thùng chứa dữ liệu) trong kịch bản. Ngoài ra, hành động này còn cho phép bạn tạo các ô nhập liệu ngay tại giao diện chính, giúp người dùng tự điền thông tin trước khi bắt đầu chạy tool.

* Cho phép nhập liệu (Allow user input from the interface): Bạn tích chọn mục này để tạo các ô trống ở màn hình chính, cho phép người dùng nhập trực tiếp giá trị vào kịch bản trước khi bấm chạy.
* Bắt buộc nhập (Input required): Khi chọn mục này, hệ thống sẽ yêu cầu người dùng phải điền đủ dữ liệu hoặc chọn file thì mới cho bấm nút chạy. Nếu để trống, tool sẽ báo lỗi ngay để tránh tình trạng chạy nhầm do quên nhập thông tin.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-130c2652cf602529a79538c92b8bfe0398191be7%2Fimage%20(107).png?alt=media" alt=""><figcaption></figcaption></figure>

Hệ thống hỗ trợ 4 kiểu dữ liệu nhập vào (Input Type) trên giao diện bao gồm:

#### 1. Kiểu nhập Chữ (Text)

Dùng khi bạn muốn người dùng tự nhập một giá trị chuỗi, văn bản hoặc số từ bàn phím.

* Ví dụ thực tế: Bạn đặt tên biến là `$textContent`. Khi người dùng nhập nội dung `"hello world"` vào ô nhập liệu trên giao diện, giá trị của biến `$textContent` lúc này sẽ là `"hello world"` (`$textContent = "hello world"`).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4783e545fce2cce4d6234ceefdd7660b23c2185b%2Fimage%20(112).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-bbebe89d7c5e8a036b47dd183d2102fa0280979b%2Fimage%20(111).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 2. Kiểu chọn Tệp tin (File)

Dùng khi kịch bản cần xử lý một file cụ thể trong máy tính của người chạy (như file hình ảnh, file dữ liệu, file cấu hình...). Trên giao diện UI sẽ xuất hiện nút hình thư mục để người dùng bấm vào và duyệt tìm file.

* Ví dụ thực tế: Người dùng bấm chọn file có tên `bruh.png` nằm trong ổ D. Giá trị của biến `$filePath` nhận được sẽ là đường dẫn tuyệt đối của file đó: `"D:\materials\bruh.png"` (`$filePath = "D:\materials\bruh.png"`). Bạn có thể lấy ngay biến `$filePath` này để truyền vào hành động File upload ở các bước sau.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-a84c5e76d7f3372c746b4f76ac356c216f368cef%2Fimage%20(113).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-265ec789c60ada64a861f7daf2619904709488d8%2Fimage%20(114).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 3. Kiểu tích chọn (Checkbox)

Checkbox là thành phần giao diện cho phép người dùng bật hoặc tắt một tùy chọn nhị phân (có/không, bật/tắt, đồng ý/không đồng ý).

* Đặc điểm: Khi được tích chọn, biến sẽ nhận giá trị là `True`. Khi bỏ tích chọn, biến sẽ nhận giá trị là `False`.
* Ví dụ thực tế: Bạn tạo một mục có nhãn *"Chọn để đặt hàng / Check to place an order"* gắn với biến `$checkBox`. Nếu người dùng tích chọn vào ô này, biến `$checkBox` sẽ có giá trị là `True` (`$checkBox = True`). Bạn có thể dùng khối lệnh If để kiểm tra: nếu `$checkBox = True` thì mới thực hiện các bước thanh toán.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-810446a14ecee9ffddff6b73b7648111aad19b09%2Fimage%20(115).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 4. Kiểu danh sách chọn (Combo Box)

Combo Box (tương tự như Dropdown) là thành phần giao diện hiển thị một danh sách các lựa chọn có sẵn, cho phép người dùng chọn ra một giá trị duy nhất tại một thời điểm. Tính năng này giúp hạn chế tối đa việc nhập sai chính tả hoặc sai định dạng dữ liệu.

* Đặc điểm: Giúp giữ dữ liệu đồng nhất khi cần chọn các thông tin cố định như Quốc gia, Ngành hàng, Loại sản phẩm, Trạng thái hoạt động...
* Ví dụ thực tế: Bạn cấu hình danh sách gồm nhiều quốc gia gắn với biến `$country`. Khi người dùng mở kịch bản và chọn `"United States"` từ danh sách thả xuống, biến `$country` trong Automate sẽ ngay lập tức nhận giá trị là `"United States"` (`$country = "United States"`).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-530e576ba157108ca6d2f065a3023e035f952a5e%2Fimage%20(116).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-0794bfdcb7a18c5fa334183c29de77bc851e245f%2Fimage%20(117).png?alt=media" alt=""><figcaption></figcaption></figure>


# Increase variable

Increase variable dùng để cộng thêm một giá trị số (được xác định ở mục Increase by) vào một biến.

Tại ô Output variable (Biến đầu ra), bạn có thể điền trùng tên biến cũ để cộng dồn giá trị, hoặc điền một tên biến khác hoàn toàn để lưu kết quả sang biến mới mà không làm thay đổi biến cũ.

* Increase by: Số lượng muốn cộng thêm (Ví dụ: `1`, `2`, `5`...).
* Ví dụ: Bạn có biến `$row = 5`.

  * Nếu điền *Output variable* là `$row` và *Increase by* là `1` ➡️ Biến `$row` sẽ tăng lên thành `6` (cộng dồn).
  * Nếu điền *Output variable* là `$nextRow` và *Increase by* là `1` ➡️ Biến `$row` vẫn giữ nguyên là `5`, còn biến mới `$nextRow` sẽ có giá trị là `6`.

  🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-7d085aaf47dc93deeea39aa33a60fe040b325ba1%2Fimage%20(118).png?alt=media" alt=""><figcaption></figcaption></figure>


# Decrease variable

Decrease variable dùng để trừ đi một giá trị số (được xác định ở mục Decrease by) từ một biến.

Tại ô Output variable (Biến đầu ra), bạn có thể điền trùng tên biến cũ để trừ dồn giá trị, hoặc điền một tên biến khác hoàn toàn để lưu kết quả sang biến mới mà không làm thay đổi biến cũ.

* Decrease by: Số lượng muốn trừ đi (Ví dụ: `1`, `2`, `5`...).
* Ví dụ: Bạn có biến `$countdown = 10`.

  * Nếu điền *Output variable* là `$countdown` và *Decrease by* là `1` ➡️ Biến `$countdown` sẽ giảm xuống còn `9` (trừ dồn).
  * Nếu điền *Output variable* là `$previousRow` và *Decrease by* là `1` ➡️ Biến `$countdown` vẫn giữ nguyên là `10`, còn biến mới `$previousRow` sẽ có giá trị là `9`.

  🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-6cf48c473786725996bdd436132b6a3e9bdefc34%2Fimage%20(119).png?alt=media" alt=""><figcaption></figcaption></figure>


# Count

Count là hành động dùng để đếm số lượng phần tử của một mảng một chiều (hoặc một danh sách dữ liệu) và trả về một giá trị số. Hành động này rất hữu ích khi bạn cần kiểm tra kích thước dữ liệu trước khi xử lý hoặc thiết lập giới hạn cho vòng lặp.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

Các trường hợp ứng dụng thực tế phổ biến bao gồm:

#### 1. Đếm số dòng của một file văn bản (Text)

Khi bạn cần biết một file text (chứa danh sách tài khoản, proxy, bài viết...) có tổng cộng bao nhiêu dòng:

* Cách làm: Sử dụng hành động File read all lines để đọc toàn bộ các dòng trong file thành một danh sách biến, sau đó dùng hành động Count để đếm danh sách đó. Giá trị trả về chính là tổng số dòng của file.

#### Ví dụ thực tế: Đếm số lượng link Facebook trong file `D:\2.txt`

Giả sử bạn có một file lưu trữ danh sách link profile Facebook tại đường dẫn `D:\2.txt` với nội dung gồm 9 dòng như sau:

```
https://www.facebook.com/nguyenvana
https://www.facebook.com/leminhc
...
https://www.facebook.com/demo.account99
```

Để đếm tổng số dòng và truy xuất từng link trong file này, kịch bản sẽ cấu hình qua 2 bước:

* Bước 1: Dùng hành động File read all lines để đọc file `D:\2.txt`. Kết quả trả về sẽ được lưu vào một mảng (danh sách) tên là `$content`. Lúc này hệ thống tự hiểu:
  * `$content[0]` = `"https://www.facebook.com/nguyenvana"` (Dòng 1)
  * `$content[1]` = `"https://www.facebook.com/leminhc"` (Dòng 2)
  * ...
  * `$content[8]` = `"https://www.facebook.com/demo.account99"` (Dòng 9)
* Bước 2: Dùng hành động Count truyền vào mảng `$content` vừa đọc, và đặt tên biến đầu ra (Output variable) là `$lineCount`.

Sau khi chạy xong, biến `$lineCount` sẽ nhận giá trị là `9`. Bạn có thể lấy ngay biến `$lineCount` này để làm tham số End cho vòng lặp For nhằm tự động mở lần lượt từng profile Facebook lên tương tác.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-550298e1338215a8b94cd8b0ec2f7ddfb34ea363%2Fimage%20(120).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-422c1e458db30dd58f9e55558dd718cc91360c48%2Fimage%20(122).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-b21fafd54b33fdcf7ecef01e6f205d9f572221f4%2Fimage%20(123).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-08f7adfa432ea8c49e04cdfd8de68dc75f2c7a51%2Fimage%20(124).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-eafc88509f16f0ba820088497262b307b8456808%2Fimage%20(136).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 2. Đếm số lượng tệp tin trong một thư mục (Folder)

Khi bạn cần kiểm tra số lượng ảnh, video hoặc tài liệu đang có trong một thư mục trên máy tính:

* Cách làm: Sử dụng hành động Folder get file list để lấy ra danh sách tất cả các file, sau đó dùng hành động Count để biết chính xác trong thư mục đó đang chứa bao nhiêu tệp tin.

#### Ví dụ thực tế: Đếm số lượng ảnh bất động sản trong thư mục `D:\bds\cat bi\`

Giả sử bạn có một thư mục chứa ảnh chụp nhà đất tại đường dẫn `D:\bds\cat bi\` gồm có 3 file ảnh được đặt tên ngắn gọn như sau:

* `1.jpg`
* `2.jpg`
* `3.jpg`

Để đếm xem có bao nhiêu file ảnh phục vụ cho việc tự động đăng bài, kịch bản sẽ cấu hình qua 2 bước:

* Bước 1: Dùng hành động Folder get file list trỏ vào đường dẫn thư mục `D:\bds\cat bi\`. Hệ thống sẽ quét qua thư mục và trả về một mảng chứa đường dẫn của toàn bộ các file, lưu vào biến đặt tên là `$fileList`. Lúc này dữ liệu mảng sẽ tự động được gán là:
  * `$fileList[0]` = `"D:\bds\cat bi\1.jpg"`
  * `$fileList[1]` = `"D:\bds\cat bi\2.jpg"`
  * `$fileList[2]` = `"D:\bds\cat bi\3.jpg"`
* Bước 2: Dùng hành động Count truyền vào mảng `$fileList` vừa lấy được, và đặt tên biến đầu ra (Output variable) là `$totalFiles`.

Sau khi chạy xong, biến `$totalFiles` sẽ nhận giá trị là `3`. Bạn có thể dùng kết quả này để chạy các khối lệnh điều kiện (ví dụ: Nếu thư mục có trên 0 file thì mới thực hiện hành động tải ảnh lên Facebook/Website).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-1c4305a58574b55bdc16e8c1f5718828ea9e22df%2Fimage%20(126).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-9d0ca1d47508e695ef6637f195f1db6516038f58%2Fimage%20(127).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-cd357f69fcc5514ef9571f49c77ed2c60e7c8247%2Fimage%20(128).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-398fce97cc9cfef0481978ff8fab9572e11c0e3f%2Fimage%20(129).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-ade78253d45af7747d7a03ee106d6037076f66ba%2Fimage%20(135).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 3. Đếm số phần tử sau khi tách chuỗi (Split text)

Khi bạn có một chuỗi văn bản dài chứa nhiều thông tin được ngăn cách bởi các ký tự đặc biệt và muốn biết sau khi tách ra sẽ được bao nhiêu phần tử:

* Cách làm: Sau khi dùng hành động Split text để tách chuỗi này dựa trên ký tự `|`, bạn cho hành động Count xử lý danh sách vừa tách. Kết quả trả về của biến đếm lúc này sẽ là `6`.

#### Ví dụ thực tế: Đếm số phần tử của chuỗi sau khi dùng Split text

Giả sử bạn có một file cấu hình hoặc một dòng dữ liệu chứa thông tin tài khoản được định dạng theo cấu trúc ngăn cách bởi dấu gạch đứng `|` như sau:

```
thanhnguyen|Pass1234|2FAXYZ|103.83.77.15:9898
```

Để đếm xem chuỗi này có bao nhiêu thông tin thành phần nhằm phục vụ cho việc kiểm tra tính hợp lệ của tài khoản, kịch bản sẽ cấu hình qua 2 bước:

* Bước 2: Dùng hành động Split text để tách chuỗi trên dựa vào ký tự phân tách là `|`. Kết quả trả về sẽ được lưu vào một mảng tên là `$accountData`. Lúc này hệ thống sẽ tự động phân tách dữ liệu thành:
  * `$accountData[0]` = `"thanhnguyen"` (Tài khoản)
  * `$accountData[1]` = `"Pass1234"` (Mật khẩu)
  * `$accountData[2]` = `"2FAXYZ"` (Mã mã hóa 2FA)
  * `$accountData[3]` = `"103.83.77.15:9898"` (Proxy)
* Bước 2: Dùng hành động Count truyền vào mảng `$accountData` vừa tách, và đặt tên biến đầu ra (Output variable) là `$infoCount`.

Sau khi chạy xong, biến `$infoCount` sẽ nhận giá trị là `4`. Bạn có thể dùng kết quả này kết hợp với khối lệnh If để kiểm tra (ví dụ: Nếu `$infoCount = 4` tức là tài khoản đủ thông tin cấu trúc thì mới tiến hành chạy tiếp kịch bản đăng nhập, ngược lại thì bỏ qua để tránh lỗi).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4fc7ba0c98bc5743f728a7c18cb2bf71aaefb747%2Fimage%20(131).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-74a233e1d8ec3fc7708eb2aa89ec1f35e7958c33%2Fimage%20(132).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-e1d48211030f2f2e4e79ac27b25309fe776abfb5%2Fimage%20(133).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-57d238f1fc869a3771c7a5a825ff3a4fc01c4f18%2Fimage%20(134).png?alt=media" alt=""><figcaption></figcaption></figure>


# ⚙️Workflow


# Exit loop

Exit loop là hành động dùng để cưỡng ép thoát ra khỏi vòng lặp hiện tại (For hoặc While) ngay lập tức, bất chấp việc vòng lặp đó đã chạy hết số lần quy định hay chưa. Sau khi thoát ra, hệ thống sẽ tiếp tục thực thi các hành động nằm ngay dưới khối lặp đó.

Hành động này thường được đặt bên trong khối lệnh điều kiện If để xử lý các tình huống bất thường hoặc khi đã tìm thấy kết quả cần thiết trước thời hạn.

#### Ví dụ thực tế: Dừng kiểm tra khi đã tìm thấy tài khoản hợp lệ

Giả sử bạn dùng vòng lặp For để quét qua một danh sách 100 tài khoản trong file Excel nhằm tìm ra một tài khoản có trạng thái là `"Live"` để dùng. Nếu dòng số 5 đã là tài khoản "Live", bạn không cần phải tốn thời gian chạy tiếp 95 dòng còn lại.

* Cách cấu hình:
  * Bên trong khối For, bạn dùng lệnh If để kiểm tra: `Nếu trạng thái = "Live"`.
  * Trong khối If đó, bạn xử lý lấy tài khoản xong rồi gọi hành động Exit loop.
* Kết quả: Hệ thống chạy đến dòng số 5, thấy điều kiện đúng, lập tức nhảy ra khỏi vòng lặp For và chạy tiếp các hành động phía dưới để làm việc.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-f0b4ffccf25fd2c69b3f3795249b2751c82648ef%2Fimage%20(137).png?alt=media" alt=""><figcaption></figcaption></figure>


# Next loop

Next loop là hành động dùng để dừng ngay lập tức các hành động phía sau nó trong lượt lặp hiện tại, bỏ qua phần code còn lại của khối lặp (For hoặc While) để nhảy ngay sang lượt lặp tiếp theo.

Khác với Exit loop (thoát hẳn, dừng luôn vòng lặp), Next loop chỉ bỏ qua lượt đang chạy và vẫn tiếp tục thực hiện các lượt lặp kế tiếp cho đến khi hết danh sách. Hành động này thường được đặt bên trong khối lệnh If để lọc bỏ các dữ liệu lỗi hoặc không phù hợp.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-b1e54d3fea83914609882d49af916308d03db9c0%2Fimage%20(139).png?alt=media" alt=""><figcaption></figcaption></figure>


# Stop

Stop là hành động dùng để dừng ngay lập tức kịch bản đang chạy tại vị trí đó.

> 📌 Lưu ý về phạm vi: Hành động này chỉ có tác dụng kết thúc luồng (thread) đang chạy của chính profile hiện tại, không ảnh hưởng đến các luồng hoặc các profile khác đang chạy song song trong cùng một đợt vận hành.

Hành động này thường được kết hợp bên trong khối lệnh điều kiện If để xử lý các lỗi nghiêm trọng, lỗi không thể tiếp tục kịch bản, hoặc khi luồng đã hoàn thành xong nhiệm vụ chính.

#### Ví dụ thực tế: Dừng luồng khi tài khoản bị Checkpoint

Giả sử bạn làm kịch bản nuôi tài khoản. Khi mở trình duyệt lên, nếu phát hiện tài khoản đã bị khóa (Checkpoint) thì việc thực hiện các hành động tiếp theo như lướt bài viết, thả tim, nhắn tin... là hoàn toàn vô nghĩa và tốn tài nguyên máy.

* Cách cấu hình:
  * Dùng khối lệnh If kiểm tra sự xuất hiện của thông báo lỗi: `Nếu xuất hiện chữ "Tài khoản bị khóa"`.
  * Nằm bên trong khối If này, bạn gọi hành động Stop.
* Kết quả: Khi hệ thống quét thấy tài khoản bị khóa, nó sẽ gặp lệnh Stop và đóng luồng của profile đó lại ngay lập tức. Các profile ở các luồng khác vẫn tiếp tục chạy bình thường mà không bị ảnh hưởng.


# Throw

Throw là hành động dùng để chủ động bắn ra một thông báo lỗi (Exception) do bạn tự định nghĩa và dừng ngay lập tức luồng kịch bản hiện tại.

Sự khác biệt cốt lõi giữa Throw và Stop nằm ở trạng thái báo cáo sau khi dừng luồng:

* Stop: Tắt luồng và hệ thống vẫn ghi nhận trạng thái chạy hoàn thành (Completed - hiển thị màu xanh).
* Throw: Tắt luồng và hệ thống sẽ đánh dấu trạng thái gặp lỗi (Error - bôi đỏ) kèm theo nội dung lỗi cụ thể lên nhật ký hệ thống (Log).

#### Ví dụ thực tế: Ném lỗi khi hết số dư tài khoản quảng cáo

Giả sử bạn làm kịch bản tự động lên chiến dịch quảng cáo. Trước khi thiết lập, kịch bản cần vào trang quản lý để kiểm tra ngân sách. Nếu số dư bằng 0, kịch bản không thể chạy tiếp:

* Cách cấu hình:
  * Dùng khối lệnh If kiểm tra: `Nếu số dư = 0`.
  * Nằm bên trong khối If, bạn gọi hành động Throw và điền nội dung thông báo lỗi là: `"Lỗi: Tài khoản hết tiền, không thể lên camp!"`.
* Kết quả: Khi chạy đến đây, luồng của profile này sẽ lập tức đóng lại. Trên bảng quản lý tiến độ của GPM Automate, dòng profile đó sẽ được chuyển sang trạng thái Error (Bôi đỏ) kèm dòng chữ thông báo lỗi. Bạn chỉ cần nhìn lướt qua danh sách là lọc ra ngay những tài khoản nào đang bị lỗi để xử lý mà không bị lẫn lộn với những luồng chạy thành công (Completed).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-9de95c89fbc59dc4cd28dada4d797825306b8976%2Fimage%20(140).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4e0a209029f97ac07d177ea7f9723e40b3c42d68%2Fimage%20(141).png?alt=media" alt=""><figcaption></figcaption></figure>


# Delay

Dừng chờ trong 1 khoảng thời gian.

Delay là hành động dùng để tạm dừng kịch bản trong một khoảng thời gian trước khi thực hiện hành động tiếp theo. Trong cấu hình GPM Automate, thời gian được tính bằng mili giây (ms), trong đó 1s = 1000 ms.

Hành động này hỗ trợ cơ chế dừng ngẫu nhiên (Random Delay) giúp mô phỏng chính xác thao tác như người dùng thật, giảm thiểu tối đa tần suất bị hệ thống/nền tảng quét hành vi tự động (Anti-bot).

#### Tham số cấu hình:

* Min (ms): Thời gian dừng chờ tối thiểu.
* Max (ms): Thời gian dừng chờ tối đa.

#### Ví dụ thực tế:

Nếu bạn cấu hình Min là `2000` và Max là `4000`. Khi kịch bản chạy đến hành động này, hệ thống sẽ tự động tính toán và tạm dừng luồng trong một khoảng thời gian ngẫu nhiên nằm giữa từ 2000ms đến 4000ms (ví dụ: lượt này dừng `2843 ms`, lượt sau có thể dừng `3120 ms`).


# 🔤Text & number


# Random text

Random text là hành động dùng để tự động tạo ra một chuỗi ký tự ngẫu nhiên (bao gồm chữ cái và chữ số) với độ dài tùy chọn, sau đó lưu vào một biến đầu ra (Output variable).

Hành động này thường được sử dụng để tạo mật khẩu mới khi đăng ký tài khoản, tạo mã số định danh, hoặc tạo các nội dung văn bản không trùng lặp để tránh bị hệ thống quét spam.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* Text Length: Độ dài (số lượng ký tự) của chuỗi văn bản ngẫu nhiên mà bạn muốn tạo ra.

#### Ví dụ thực tế: Tạo mật khẩu ngẫu nhiên để đăng ký tài khoản tự động

Giả sử bạn đang viết một kịch bản tự động đăng ký tài khoản hàng loạt trên một website và cần điền một mật khẩu ngẫu nhiên cho mỗi tài khoản để đảm bảo tính bảo mật:

* Cách cấu hình: Bạn gọi hành động Random text, thiết lập ô Text Length là `12` (để tạo chuỗi dài 12 ký tự), và đặt ô *Output variable* là `$randomPassword`.
* Kết quả: Khi chạy đến bước này, hệ thống sẽ tự động sinh ra một chuỗi ngẫu nhiên (ví dụ: `"a7K39pXq2wLm"`) và lưu vào biến `$randomPassword`. Ở các bước tiếp theo, bạn chỉ cần gọi hành động Key press truyền biến `$randomPassword` này vào ô nhập mật khẩu trên trình duyệt để hoàn tất việc đăng ký.


# Split text

Split text dùng để chia nhỏ một chuỗi văn bản lớn thành một mảng (danh sách) gồm nhiều phần tử con dựa trên một ký tự phân tách (Delimiter) được chỉ định (ví dụ: dấu `|`, dấu phẩy `,`, dấu hai chấm `:`...).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

> 🔗 Xem ví dụ chi tiết về cách kết hợp hành động này với bộ đếm tại mục [3. Đếm số phần tử sau khi tách chuỗi (Split text)](/huong-dan-cac-action/variables/count#vi-du-thuc-te-dem-so-phan-tu-cua-chuoi-sau-khi-dung-split-text) *(chèn link nội bộ GitBook vào đây)*.


# Read json

Read json dùng để trích xuất giá trị từ một đoạn văn bản định dạng JSON dựa trên cấu trúc đường dẫn được chỉ định.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* JSON Text: Chuỗi văn bản JSON đầu vào cần đọc (hoặc biến chứa chuỗi JSON).
* Nodes: Đường dẫn (JSON Path) dẫn đến key chứa dữ liệu cần lấy.

#### Ví dụ thực tế: Lấy số điện thoại từ danh sách dữ liệu

Giả sử bạn có một chuỗi JSON chứa danh sách thông tin khách hàng như sau:

JSON

```
{
  "status": "success",
  "data": [
    {
      "name": "Nguyen Van A",
      "phone": "0987654321"
    },
    {
      "name": "Le Minh C",
      "phone": "0123456789"
    }
  ]
}
```

Để trích xuất số điện thoại của người đầu tiên trong danh sách, bạn cấu hình hành động Read json:

* JSON Text: Điền chuỗi JSON trên (hoặc truyền biến chứa chuỗi).
* Nodes: Điền là `data.[0].phone` *(trong đó `data` đi vào mảng dữ liệu, `[0]` là vị trí người đầu tiên, và `phone` là thuộc tính cần lấy)*.
* Output variable: Điền tên biến cần lưu kết quả (Ví dụ: `$phoneNumber`).

Kết quả: Biến `$phoneNumber` sẽ nhận giá trị là `"0987654321"`.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-376b39eb6accd6707759a2e8946432097bb3886f%2Fimage%20(142).png?alt=media" alt=""><figcaption></figcaption></figure>


# Regex

Regex (Regular Expression) giống như một chiếc kính lúp giúp bạn soi tìm chính xác một đoạn text ẩn nấp trong một văn bản lớn, hoặc như một chiếc lưới lọc giúp bạn giữ lại đúng định dạng dữ liệu mình cần (như số điện thoại, email, mã OTP) và gạt bỏ đi những phần chữ thừa thãi xung quanh.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* Text: Văn bản thô đầu vào cần lọc dữ liệu (hoặc biến chứa đoạn văn bản).
* Regex: Đoạn mã/cú pháp bộ lọc dùng để định hình cấu trúc chuỗi cần lấy.
* Output variable: Tên biến lưu kết quả sau khi lọc thành công.

#### Ví dụ thực tế: Trích xuất mã OTP từ nội dung Email

Khi bạn dùng hành động đọc thư điện tử, hệ thống sẽ trả về toàn bộ nội dung text của Email dài loằng ngoằng. Nhiệm vụ của bạn là phải nhặt ra đúng mã OTP gồm 6 chữ số nằm trong đó.

Giả sử đoạn Text đầu vào nhận được là:

> "Mã xác minh GPM Automate của bạn là 834912. Vui lòng không chia sẻ mã này cho bất kỳ ai, mã có hiệu lực trong 5 phút."

Để lọc lấy 6 số OTP, bạn cấu hình hành động Regex như sau:

* Text: Truyền vào đoạn văn bản trên (hoặc biến chứa nội dung email).
* Regex: Điền là `\d{6}` *(đây là cú pháp regex đại diện cho 6 ký tự số liên tiếp)*.
* Output variable: Điền tên biến cần lưu (Ví dụ: `$otpCode`).

Kết quả: Chiếc "lưới lọc" Regex sẽ quét qua văn bản, bỏ qua toàn bộ phần chữ tiếng Việt và giữ lại chính xác chuỗi `834912` để gán vào biến `$otpCode`.

> 💡 Mẹo nhỏ: Cú pháp Regex trông có vẻ loằng ngoằng và khó nhớ? Đừng lo, bạn không cần phải tự học thuộc lòng làm gì cho đau đầu. Hãy mở các công cụ AI (như ChatGPT, DeepSeek, Gemini...) và hỏi trực tiếp bằng ngôn ngữ tự nhiên, ví dụ: *"Viết cho tao đoạn regex để lọc lấy 6 số liên tiếp"* hoặc *"Viết regex lấy chuỗi nằm giữa chữ 'Mã của bạn là:' và dấu chấm"*. AI sẽ sinh ra đoạn mã chính xác để bạn chỉ việc copy-paste vào ô cấu hình của GPM Automate.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-c763c097828659674be327a366e3cd0e2f1d5d77%2Fimage%20(143).png?alt=media" alt=""><figcaption></figcaption></figure>


# Random number

Random number là hành động dùng để tạo ra một số nguyên ngẫu nhiên nằm trong khoảng từ giá trị tối thiểu đến giá trị tối đa được thiết lập, sau đó lưu kết quả vào một biến đầu ra.

Hành động này thường được dùng để tạo dữ liệu giả lập (tuổi, số lượng bè bạn muốn kết bạn), chọn ngẫu nhiên một dòng dữ liệu, hoặc tạo thời gian chờ ngẫu nhiên linh hoạt theo logic riêng của bạn.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* Min: Giá trị số nhỏ nhất có thể nhận được.
* Max: Giá trị số lớn nhất có thể nhận được.
* Output variable: Tên biến lưu số ngẫu nhiên vừa tạo.

#### Ví dụ thực tế: Chọn ngẫu nhiên số lượng bài viết để tương tác

Khi nuôi tài khoản mạng xã hội, để tránh việc tài khoản nào cũng lướt đúng số lượng bài viết giống nhau gây nghi ngờ cho hệ thống, bạn nên cho mỗi tài khoản tương tác với một số lượng bài viết ngẫu nhiên.

* Cách cấu hình: Bạn gọi hành động Random number, thiết lập Min là `3`, Max là `7`, và ô *Output variable* đặt là `$randomPosts`.
* Kết quả: Khi luồng chạy đến bước này, hệ thống sẽ bốc ngẫu nhiên một con số trong khoảng từ 3 đến 7 (Ví dụ: Profile 1 bốc trúng số `4`, Profile 2 bốc trúng số `6`). Bạn chỉ cần truyền biến `$randomPosts` này vào ô End của vòng lặp For phía sau, mỗi tài khoản sẽ tự động lướt và tương tác đúng theo số lượt riêng biệt mà nó bốc được.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-154c9ebad281331060c0e69560b334857e2ea264%2Fimage%20(144).png?alt=media" alt=""><figcaption></figcaption></figure>


# Math execute

Math execute là hành động dùng để thực hiện các phép tính toán học cơ bản (như cộng `+`, trừ `-`, nhân `*`, chia `/`) hoặc các biểu thức số học phức tạp từ các biến số có sẵn, sau đó lưu kết quả vào một biến đầu ra.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* Expression (Biểu thức): Nội dung phép tính toán học cần thực hiện. Bạn có thể kết hợp giữa các con số cụ thể và các biến số có sẵn (Ví dụ: `(5 + 3) * 2` hoặc `$price * $quantity`).
* Output variable: Tên biến để lưu lại kết quả sau khi tính toán xong.

#### Ví dụ thực tế 1: Tính tổng số tiền đơn hàng (Nhân và Cộng)

Giả sử bạn đang làm kịch bản tự động mua hàng hoặc cào dữ liệu đơn hàng. Bạn có biến số lượng sản phẩm là `$quantity = 3`, biến đơn giá là `$price = 150000`, và phí vận chuyển cố định là `30000`.

* Cách cấu hình:
  * Expression: Điền biểu thức `($price * $quantity) + 30000`
  * Output variable: Điền tên biến lưu kết quả là `$totalAmount`.
* Kết quả: Hệ thống sẽ tính ra giá trị là `480000` và gán vào biến `$totalAmount`.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-8d10ef41e62964d93a36d01cde40e528a4e1c9be%2Fimage%20(145).png?alt=media" alt=""><figcaption></figcaption></figure>


# 2FA code

2FA code là hành động dùng để tự động tạo ra mã xác thực 2 lớp dạng 6 số biến động theo thời gian (giống như ứng dụng Google Authenticator hay Authy trên điện thoại) từ một mã bảo mật gốc được cung cấp.

Hành động này cực kỳ quan trọng trong các kịch bản MMO, giúp tự động vượt qua bước xác minh bảo mật khi đăng nhập vào các tài khoản Facebook, Google, X (Twitter), Discord, Coinlist... mà không cần phải mở điện thoại lên nhập thủ công.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/nlEQsaxawt4).

#### Tham số cấu hình:

* Secret key: Mã bảo mật gốc (Chuỗi ký tự dạng chữ và số dài, thường được cấp khi bạn bật tính năng bảo mật 2 lớp trên các website).
* Output variable: Tên biến lưu mã xác thực 6 số được sinh ra.

#### Ví dụ thực tế: Tự động điền mã 2FA khi đăng nhập Facebook

Giả sử bạn có dữ liệu một tài khoản Facebook lưu trong Excel, trong đó cột mã bảo mật hai lớp (Secret key) của tài khoản này là: `JBSWY3DPEHPK3PXP`.

Khi trình duyệt điều hướng đến trang đăng nhập Facebook, sau khi điền User/Pass, Facebook sẽ yêu cầu nhập mã xác thực 6 số để vào tài khoản. Bạn cấu hình kịch bản xử lý tự động như sau:

* Cách cấu hình:
  * Gọi hành động 2FA code.
  * Secret key: Điền chuỗi `JBSWY3DPEHPK3PXP` (hoặc truyền biến chứa chuỗi này từ file Excel đọc ra).
  * Output variable: Đặt tên biến là `$twoFACode`.
* Kết quả: Hệ thống sẽ dựa vào thuật toán mã hóa thời gian để tính toán ngay lập tức mã 6 số hiện tại (ví dụ: `482915`) và lưu vào biến `$twoFACode`. Ngay sau hành động này, bạn gọi tiếp lệnh Key press truyền biến `$twoFACode` vào ô nhập mã trên Facebook là có thể đăng nhập thành công.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-e9aafcb0efdd825f1d71270a5a4981e3eacebba9%2Fimage%20(146).png?alt=media" alt=""><figcaption></figcaption></figure>


# 📁File & Folder


# File exists

Hành động này giúp tool kiểm tra xem một file đã có sẵn trên máy tính hay chưa. Kết quả trả về rất đơn giản: True (nếu thấy file) hoặc False (nếu không thấy).

* Tác dụng: Dùng kết hợp với khối lệnh `If` để xử lý thông minh hơn, tránh trường hợp tool bị lỗi hay dừng đột ngột khi bạn yêu cầu nó mở một file mà thực tế không tồn tại.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file cần kiểm tra trên máy tính (Ví dụ: `D:\data\accounts.txt`).
* Output variable: Tên biến lưu kết quả kiểm tra (`True` hoặc `False`).

#### Ví dụ thực tế: Kiểm tra file cấu hình trước khi chạy kịch bản

Giả sử bạn viết một kịch bản tự động điền thông tin và yêu cầu kịch bản phải đọc dữ liệu từ file `D:\GPM\config.json`. Nếu người dùng quên chưa tạo file này hoặc điền sai đường dẫn, kịch bản chạy đến lệnh đọc file sẽ bị lỗi hệ thống ngay.

Để xử lý an toàn, bạn cấu hình kịch bản như sau:

* Bước 1: Gọi hành động File exists, điền đường dẫn `D:\GPM\config.json` và đặt tên biến đầu ra là `$isFileReady`.
* Bước 2: Dùng khối lệnh If để kiểm tra: `Nếu $isFileReady = False`.
* Bước 3: Nằm bên trong khối If này, bạn gọi hành động Throw với nội dung: `"Lỗi: Bạn chưa tạo file config.json tại ổ D, vui lòng kiểm tra lại!"`.

Kết quả: Kịch bản sẽ tự động kiểm tra trước. Nếu file chưa tồn tại, nó sẽ dừng luồng một cách chủ động và bắn ra cảnh báo màu đỏ trực quan cho bạn biết, thay vì cố chạy tiếp để rồi bị crash kịch bản.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4693a8938e77d89e696d180171fc1fb69ab0238b%2Fimage%20(147).png?alt=media" alt=""><figcaption></figcaption></figure>


# Copy file

Copy file là hành động dùng để sao chép một tệp tin từ vị trí này sang một vị trí khác trên ổ cứng máy tính. Hành động này sẽ tạo ra một bản sao hoàn toàn mới tại nơi đến và vẫn giữ nguyên tệp tin gốc ở vị trí ban đầu.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Source File: Đường dẫn tuyệt đối của file nguồn cần copy (Ví dụ: `D:\data\template.xlsx`).
* Destination File: Đường dẫn tuyệt đối của file đích nơi sao chép đến (Ví dụ: `D:\backup\report_2026.xlsx`).

#### Ví dụ thực tế: Tự động nhân bản file Excel mẫu trước khi ghi dữ liệu

Khi làm kịch bản cào dữ liệu (Data Crawler) hoặc điền báo cáo, bạn thường có một file Excel mẫu (`template.xlsx`) đã được định dạng sẵn các cột tiêu đề. Bạn không muốn kịch bản ghi đè trực tiếp dữ liệu mới làm hỏng mất file mẫu này. Giải pháp là mỗi lần chạy kịch bản, hệ thống sẽ tự động nhân bản ra một file mới để sử dụng:

* Cách cấu hình:
  * Source File: Điền đường dẫn file mẫu: `D:\GPM\template.xlsx`
  * Destination File: Điền đường dẫn file mới sẽ dùng để ghi dữ liệu: `D:\GPM\data_output.xlsx`
* Kết quả: Hệ thống sẽ lấy file `template.xlsx`, tạo ra một bản sao chính xác và đặt tên là `data_output.xlsx` tại thư mục chỉ định. Các hành động phía sau của kịch bản (như *Write excel file*) sẽ chỉ tương tác và ghi dữ liệu vào file `data_output.xlsx` này, giúp file mẫu của bạn luôn được an toàn và sạch sẽ cho các lần chạy tiếp theo.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-b22735315cad6e6187c7fda1ce407cbeb40db920%2Fimage%20(148).png?alt=media" alt=""><figcaption></figcaption></figure>


# Move/rename file

Move / rename file là hành động đa năng dùng để di chuyển một tệp tin từ vị trí này sang vị trí khác, hoặc đổi tên của tệp tin đó ngay tại vị trí hiện tại trên ổ cứng máy tính.

Khác với sao chép (Copy file), hành động này sẽ cắt hẳn dữ liệu sang vị trí mới (nếu di chuyển) hoặc thay thế hoàn toàn tên cũ (nếu đổi tên).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Source File: Đường dẫn tuyệt đối của file nguồn cần di chuyển hoặc cần đổi tên (Ví dụ: `D:\data\old_name.txt`).
* Destination File: Đường dẫn tuyệt đối của file đích nơi chuyển đến, hoặc đường dẫn chứa tên file mới sau khi đổi (Ví dụ: `E:\backup\old_name.txt` hoặc `D:\data\new_name.txt`).

#### Ví dụ thực tế: Đổi tên file (Rename)

Bạn vừa tải một file ảnh về và muốn đổi tên nó thành tên có ý nghĩa trước khi tải lên mạng xã hội để tránh trùng lặp.

* Source File: `D:\downloads\image.jpg`
* Destination File: `D:\downloads\avatar_profile_1.jpg` (giữ nguyên thư mục, thay đổi tên file ở cuối).
* Kết quả: File `image.jpg` sẽ biến mất và được đổi tên thành `avatar_profile_1.jpg`.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-8e9ff428257531006d4079480a506dcbf42fe644%2Fimage%20(150).png?alt=media" alt=""><figcaption></figcaption></figure>


# Delete file

Xoá file theo đường dẫn File Path.

Delete file là hành động dùng để xóa bỏ hoàn toàn một tệp tin ra khỏi ổ cứng máy tính theo đường dẫn được chỉ định.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

> ⚠️ Lưu ý quan trọng: Tệp tin bị xóa bằng hành động này sẽ biến mất vĩnh viễn và không nằm trong Thùng rác (Recycle Bin) của Windows. Do đó, bạn cần chắc chắn về đường dẫn trước khi thực thi để tránh xóa nhầm dữ liệu quan trọng.

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file cần xóa trên máy tính (Ví dụ: `D:\data\temp_cookie.txt`).

#### Ví dụ thực tế: Tự động dọn dẹp file tạm sau khi kết thúc kịch bản

Khi chạy các kịch bản như tải video từ trên mạng về để đăng reup sang kênh khác, hoặc xuất dữ liệu tạm thời ra file text để xử lý chuỗi. Sau khi đã hoàn thành xong công việc (video đã upload xong, dữ liệu đã được đồng bộ lên Google Sheet), bạn cần xóa các file trung gian này đi để tránh đầy bộ nhớ máy tính.

* Cách cấu hình:
  * Ở cuối kịch bản, bạn gọi hành động Delete file.
  * File Path: Điền đường dẫn của file tạm đã dùng, ví dụ: `D:\render\temp_video.mp4`.
* Kết quả: Hệ thống sẽ xóa sạch file `temp_video.mp4` tại thư mục ổ D. Thư mục làm việc của bạn sẽ luôn gọn gàng và máy tính không bị tình trạng tràn ổ cứng sau nhiều ngày treo luồng tự động.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5c915310157392c3879e083c5700350ee1a7478b%2Fimage%20(151).png?alt=media" alt=""><figcaption></figcaption></figure>


# File read all text

File read all text là hành động dùng để đọc trọn vẹn nội dung của một file văn bản định dạng `.txt` cùng một lúc. Toàn bộ dữ liệu bên trong file sẽ được trả về dưới dạng một chuỗi văn bản (string) duy nhất và lưu vào một biến đầu ra (Output variable).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file `.txt` cần đọc (Ví dụ: `D:\data\content.txt`).
* Output variable: Tên biến lưu cấu trúc chuỗi ký tự vừa đọc được.

#### Ví dụ thực tế: Đọc nội dung bài viết chuẩn bị sẵn

Giả sử bạn chuẩn bị một bài viết dài (gồm nhiều câu, dấu xuống dòng, khoảng trắng) lưu trong file văn bản `D:\GPM\post.txt`. Bạn muốn lấy toàn bộ nội dung này để tự động điền vào ô đăng bài trên trình duyệt:

* Cách cấu hình:
  * File Path: Điền đường dẫn `D:\GPM\post.txt`
  * Output variable: Đặt tên biến lưu kết quả là `$textContent`.
* Kết quả: Hệ thống sẽ bốc trọn vẹn mọi ký tự và cấu trúc dòng có trong file gán vào biến `$textContent`. Ở các bước tiếp theo, bạn chỉ cần gọi hành động Key press truyền biến `$textContent` này vào ô nhập liệu của website là xong.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-f0deced56398a9c3e39151c886b7fb7288c367e4%2Fimage%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>


# File read all lines

File read all lines là hành động dùng để đọc một file văn bản `.txt` và tự động tách mỗi dòng trong file thành một phần tử riêng biệt, sau đó lưu toàn bộ vào một mảng danh sách (array) ở biến đầu ra.

Hành động này cực kỳ hữu ích khi bạn có một danh sách dữ liệu xếp theo từng dòng (như danh sách proxy, danh sách từ khóa, danh sách mã 2FA...) và muốn dùng vòng lặp để lấy ra xử lý từng dòng một.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

> 🔗 Xem hướng dẫn chi tiết về cách dùng ở ví dụ [1. Đếm số dòng của một file văn bản (Text)](https://docs.gpmautomate.com/huong-dan-cac-action/file-and-folder/pages/dThT2mFKvBR6wL42asdx#vi-du-thuc-te-dem-so-luong-link-facebook-trong-file-d-2.txt) trong phần Coun&#x74;*)*.


# File read random line

File read random line là hành động dùng để mở một file văn bản `.txt` có sẵn, tự động bốc ngẫu nhiên một dòng bất kỳ trong file đó, sau đó lưu nội dung dòng bốc được vào một biến đầu ra.

Hành động này cực kỳ hữu ích khi bạn nuôi tài khoản mạng xã hội (Facebook, X, Instagram...) và muốn lấy ngẫu nhiên một câu bình luận (Comment), một câu trạng thái (Status) hoặc một từ khóa tìm kiếm để kịch bản không bị lặp đi lặp lại một nội dung giống nhau giữa các profile.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file `.txt` chứa danh sách dữ liệu có sẵn trên máy tính.
* Output variable: Tên biến lưu nội dung dòng ngẫu nhiên vừa bốc được.

#### Ví dụ thực tế: Tự động bình luận ngẫu nhiên để tránh spam

Giả sử bạn chuẩn bị sẵn một file danh sách các câu bình luận tích cực lưu tại `D:\GPM\comments.txt`, mỗi câu nằm trên một dòng riêng biệt:

```
Bài viết hay quá bạn ơi!
Tuyệt vời quá ạ.
Thông tin rất bổ ích, cảm ơn chủ thớt.
```

Khi kịch bản điều hướng trình duyệt đến một bài viết và chuẩn bị nhấn bình luận, bạn cấu hình như sau:

* Cách cấu hình:
  * Gọi hành động File read random line.
  * File Path: Điền đường dẫn `D:\GPM\comments.txt`.
  * Output variable: Đặt tên biến lưu kết quả là `$randomComment`.
* Kết quả: Mỗi lần luồng chạy đến bước này (hoặc mỗi profile chạy độc lập), hệ thống sẽ tự động bốc ngẫu nhiên 1 trong 3 dòng trên (Ví dụ: Profile 1 bốc trúng dòng số 3: `"Thông tin rất bổ ích, cảm ơn chủ thớt."` và gán vào biến `$randomComment`). Bạn chỉ cần gọi hành động Key press truyền biến này vào ô bình luận trên website là xong.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-431a9b97c89b7e189ba35abf1e17f11a3b025bf2%2Fimage%20(3).png?alt=media" alt=""><figcaption></figcaption></figure>


# File write all text

File write all text là hành động dùng để ghi một chuỗi văn bản vào một file định dạng `.txt` trên máy tính.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

Hành động này sở hữu cơ chế vận hành đặc biệt (ghi đè và tự động tạo mới):

* Nếu file chưa tồn tại: Hệ thống sẽ tự động tạo mới file `.txt` theo đường dẫn đã chỉ định rồi ghi nội dung vào.
* Nếu file đã tồn tại: Hệ thống sẽ xóa sạch toàn bộ nội dung cũ đang có trong file và ghi đè nội dung mới vào.

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file `.txt` muốn ghi dữ liệu (Ví dụ: `D:\GPM\status.txt`).
* Text: Nội dung văn bản thô (hoặc biến chứa văn bản) mà bạn muốn ghi vào file.

#### Ví dụ thực tế: Tự động khởi tạo file báo cáo trạng thái mới

Giả sử bạn bắt đầu chạy một kịch bản tương tác tài khoản mới vào đầu ngày. Bạn muốn kịch bản tự động làm sạch (hoặc tạo mới) một file văn bản có tên là `report.txt` ở ổ D, sau đó ghi dòng chữ chào mừng đầu tiên vào đó để chuẩn bị lưu nhật ký cho ngày hôm nay.

* Cách cấu hình:
  * Gọi hành động File write all text.
  * File Path: Điền `D:\GPM\report.txt`.
  * Text: Điền nội dung: `"--- Nhật ký chạy kịch bản ngày hôm nay ---"`.
* Kết quả:
  * Nếu chưa có file `report.txt`, hệ thống tự động tạo file này tại thư mục `D:\GPM\`.
  * Nếu file đã có sẵn từ hôm qua (chứa đầy chữ cũ), hệ thống sẽ dọn sạch bách nội dung cũ đó, biến file thành file trắng rồi ghi vào dòng chữ `"--- Nhật ký chạy kịch bản ngày hôm nay ---"`.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-0d7918e365995f59ba2fccf5b860913e6008cc77%2Fimage%20(2).png?alt=media" alt=""><figcaption></figcaption></figure>


# File append line

File append line là hành động dùng để chèn thêm một dòng chữ mới vào vị trí cuối cùng của một file định dạng `.txt`.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

Khác với hành động ghi đè (File write all text), hành động này giúp bảo toàn nguyên vẹn toàn bộ những dữ liệu đã có từ trước trong file.

* Nếu file chưa tồn tại: Hệ thống sẽ tự động tạo mới file `.txt` theo đường dẫn đã chỉ định rồi tiến hành chèn dòng chữ vào.
* Nếu file đã tồn tại: Hệ thống giữ nguyên nội dung cũ, tự động xuống dòng ở cuối file và nối đuôi dòng dữ liệu mới vào.

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file `.txt` muốn chèn thêm dữ liệu (Ví dụ: `D:\GPM\history_log.txt`).
* Text: Nội dung văn bản (hoặc biến chứa văn bản) mà bạn muốn nối thêm vào cuối file.

#### Ví dụ thực tế: Ghi nhật ký (Log) các tài khoản đã chạy thành công

Giả sử bạn chạy một kịch bản tương tác và muốn lưu lại danh sách những tài khoản đã hoàn thành nhiệm vụ vào file `success_accounts.txt` để cuối ngày tiện kiểm tra:

* Cách cấu hình: Sau khi tài khoản thực hiện xong các bước tương tác ở cuối kịch bản, bạn gọi hành động File append line:
  * File Path: Điền `D:\GPM\success_accounts.txt`.
  * Text: Truyền biến chứa tên tài khoản vào (Ví dụ: `$currentAccount`).
* Kết quả: Mỗi khi có một luồng chạy xong, tên tài khoản đó sẽ được xếp nối đuôi nhau ngay ngắn thành từng dòng trong file `success_accounts.txt` (Ví dụ: dòng 1 là `tk_01`, dòng 2 là `tk_02`...) mà không bị mất dữ liệu của các tài khoản đã chạy trước đó.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-303c0c7ed0f4a63e35d007ec3bd1d5aa279693f9%2Fimage%20(4).png?alt=media" alt=""><figcaption></figcaption></figure>


# Create empty excel

Create empty excel là hành động dùng để khởi tạo một file Excel hoàn toàn mới (định dạng `.xlsx`) và trống rỗng tại một đường dẫn được chỉ định trên máy tính của bạn.

Hành động này thường được đặt ở đầu kịch bản để chuẩn bị một file lưu trữ sạch sẽ trước khi các hành động cào dữ liệu (Data Crawler) hoặc ghi nhật ký bắt đầu đẩy thông tin vào.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối bao gồm cả tên file và đuôi `.xlsx` nơi bạn muốn tạo file (Ví dụ: `D:\GPM\data_crawler.xlsx`).

#### Ví dụ thực tế: Khởi tạo file xuất dữ liệu trước khi cào bài viết

Giả sử bạn đang viết một kịch bản tự động lướt các hội nhóm và thu thập (cào) liên kết bài viết, lượt tương tác để phục vụ nghiên cứu thị trường. Trước khi vòng lặp cào dữ liệu bắt đầu chạy, bạn cần có sẵn một file Excel trống để lưu kết quả.

* Cách cấu hình: Ở bước đầu tiên của kịch bản, bạn gọi hành động Create empty excel.
  * File Path: Điền đường dẫn `D:\GPM\ketqua_facebook.xlsx`.
* Kết quả:
  * Nếu tại thư mục `D:\GPM\` chưa có file `ketqua_facebook.xlsx`, hệ thống sẽ lập tức tạo ra một file Excel trống.
  * Nếu file đã tồn tại từ trước, hệ thống sẽ xóa file cũ và tạo lại một file trống hoàn toàn mới để đảm bảo dữ liệu của đợt chạy trước không bị lẫn lộn vào đợt chạy này.

Sau bước này, bạn có thể yên tâm sử dụng các hành động như Write excel file hoặc Append excel file để ghi dữ liệu vừa cào được vào file.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-2a1dd6e8d81273e594c08566609c5eabd6c96116%2Fimage%20(6).png?alt=media" alt=""><figcaption></figcaption></figure>


# Read excel file

Read excel file là hành động dùng để trích xuất giá trị của một ô dữ liệu cụ thể trong file Excel (`.xlsx` hoặc `.xls`) dựa trên vị trí hàng và cột được chỉ định, sau đó lưu giá trị đó vào một biến đầu ra.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file Excel cần đọc dữ liệu trên máy tính (Ví dụ: `D:\GPM\data.xlsx`).
* Sheet index: Vị trí của trang tính (sheet) cần đọc trong file Excel, bắt đầu tính từ 0 *(Sheet đầu tiên là `0`, sheet thứ hai là `1`...)*.
* Column Name or Index: Vị trí cột chứa dữ liệu cần lấy. Bạn có thể điền theo hai cách:
  * Theo tên ký tự chữ cái: `A`, `B`, `C`, `D`...
  * Theo số mục chỉ số, bắt đầu tính từ 1 *(Cột A là `1`, cột B là `2`...)*.
* Row Index: Vị trí hàng chứa dữ liệu cần lấy, bắt đầu tính từ 1 *(Hàng đầu tiên là hàng tiêu đề hoặc hàng dữ liệu 1 sẽ là `1`, hàng tiếp theo là `2`...)*.
* Output variable: Tên biến lưu giá trị đọc được từ ô Excel đó.

#### Ví dụ thực tế: Đọc tài khoản và mật khẩu từ file Excel để đăng nhập

Giả sử bạn có một file Excel chứa danh sách tài khoản lưu tại đường dẫn `D:\GPM\accounts.xlsx`. Cấu trúc của sheet đầu tiên (Sheet index = 0) như sau:

* Cột A (Cột 1): Chứa Username
* Cột B (Cột 2): Chứa Password

Bạn muốn đọc dữ liệu tài khoản ở hàng số 2 (hàng dữ liệu đầu tiên sau hàng tiêu đề):

* Cách cấu hình lấy Username:
  * File Path: `D:\GPM\accounts.xlsx`
  * Sheet index: `0`
  * Column Name or Index: `A` (hoặc điền `1`)
  * Row Index: `2`
  * Output variable: `$username`
* Cách cấu hình lấy Password: Bạn tạo thêm một hành động tương tự bên dưới:
  * Các thông số giữ nguyên, chỉ thay Column Name or Index thành `B` (hoặc điền `2`) và đặt Output variable là `$password`.

Kết quả: Hệ thống sẽ trích xuất chính xác giá trị của ô `A2` vào biến `$username` và ô `B2` vào biến `$password`. Sau đó, bạn có thể truyền hai biến này vào hành động tương tác trình duyệt để tiến hành đăng nhập tự động.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-2f55a5e095daf6855fc07c2c8fa8c2d8b57f0229%2Fimage%20(5).png?alt=media" alt=""><figcaption></figcaption></figure>


# Write excel file

Write excel file là hành động dùng để ghi hoặc cập nhật một giá trị cụ thể vào một ô dữ liệu xác định trong file Excel (`.xlsx` hoặc `.xls`) dựa trên vị trí hàng và cột được chỉ định.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file Excel cần ghi dữ liệu (Ví dụ: `D:\GPM\data.xlsx`).
* Sheet index: Vị trí của trang tính (sheet) cần ghi dữ liệu, bắt đầu tính từ 0 *(Sheet đầu tiên là `0`, sheet thứ hai là `1`...)*.
* Column Name or Index: Vị trí cột cần ghi dữ liệu. Bạn có thể điền theo hai cách:
  * Theo tên ký tự chữ cái: `A`, `B`, `C`, `D`...
  * Theo số mục chỉ số, bắt đầu tính từ 1 *(Cột A là `1`, cột B là `2`...)*.
* Row Index: Vị trí hàng cần ghi dữ liệu, bắt đầu tính từ 1 *(Hàng 1 là `1`, hàng 2 là `2`...)*.
* Value: Nội dung văn bản (hoặc biến chứa dữ liệu) mà bạn muốn ghi vào ô Excel đó.

#### Ví dụ thực tế: Cập nhật trạng thái tài khoản khớp theo từng dòng của Profile đang chạy

Khi bạn vận hành kịch bản đa luồng (chạy nhiều profile cùng lúc), mỗi profile sẽ được hệ thống GPM Automate gán sẵn các biến hệ thống để nhận diện: biến đường dẫn file Excel cấu hình đầu vào (`$inputExcelFileLocation`) và số thứ tự hàng dữ liệu mà profile đó đang đảm nhiệm (`$inputExcelCurrentRow`).

Giả sử bạn muốn kịch bản sau khi chạy xong bước đăng nhập thành công thì sẽ tự động ghi chữ `"Thành công"` vào cột C (Trạng thái) tương ứng với đúng hàng của profile đó trong file Excel:

* Cách cấu hình:
  * File Path: Truyền vào biến hệ thống `$inputExcelFileLocation`.
  * Sheet index: `0` *(Ghi vào sheet đầu tiên)*.
  * Column Name or Index: `C` *(Cột trạng thái)*.
  * Row Index: Truyền vào biến hệ thống `$inputExcelCurrentRow` *(Hệ thống tự động hiểu hàng tương ứng của từng profile, ví dụ profile 1 chạy hàng 2 sẽ ghi vào hàng 2, profile 2 chạy hàng 3 sẽ ghi vào hàng 3)*.
  * Value: Điền nội dung chuỗi `"Thành công"` (hoặc biến chứa log của bạn).

Kết quả: Kịch bản chạy đến đâu sẽ tự động cập nhật kết quả đồng bộ và chính xác vào file Excel đến đó theo thời gian thực mà không sợ bị ghi đè hay lệch hàng dữ liệu giữa các luồng.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-e25bdb92e3972de7473ed26c1d2d0c3d568ebb05%2Fimage%20(154).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-c41a7d78a28f78002d6247f505e97c83c3b1b71f%2Fimage%20(152).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-bf3fcc1ad04c59111c0b806d8de8634a05400390%2Fimage%20(153).png?alt=media" alt=""><figcaption></figcaption></figure>


# Append excel file

Thêm dữ liệu mới vào cuối một file excel hiện có mà không ghi đè nội dung hiện tại.

Append excel file là hành động thông minh dùng để tự động tìm kiếm hàng trống đầu tiên ở cuối bảng dữ liệu và ghi nối tiếp nội dung vào đó, giúp bạn không cần phải tính toán hay quản lý số thứ tự hàng (`Row Index`) thủ công.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* File Path: Đường dẫn tuyệt đối dẫn đến file Excel cần chèn thêm dữ liệu (Ví dụ: `D:\GPM\data.xlsx`).
* Sheet index: Vị trí của trang tính (sheet) cần ghi dữ liệu, bắt đầu tính từ 0 *(Sheet đầu tiên là `0`)*.
* Column Name or Index: Vị trí cột cần ghi dữ liệu. Bạn có thể điền theo hai cách:
  * Theo tên ký tự chữ cái: `A`, `B`, `C`, `D`...
  * Theo số mục chỉ số, bắt đầu tính từ 1 *(Cột A là `1`, cột B là `2`...)*.
* Value: Nội dung văn bản (hoặc biến chứa dữ liệu) mà bạn muốn ghi vào ô trống cuối cùng của cột đó.

#### Ví dụ thực tế: Ghi nối tiếp nội dung vào cột B từ dòng thứ 6 trở đi

Giả sử bạn đang có một file Excel chứa danh sách dữ liệu hiện tại đã có chữ từ hàng 1 đến hàng 5. Bạn muốn cấu hình kịch bản tự động điền thêm một dữ liệu mới (ví dụ một mã coupon vừa cào được) vào ô trống tiếp theo của cột B (chính là ô `B6`).

Thay vì phải dùng hành động đọc file để đếm xem dòng nào trống rồi mới dùng lệnh *Write excel file*, bạn chỉ cần cấu hình hành động Append excel file như sau:

* Cách cấu hình:
  * File Path: `D:\GPM\data.xlsx`
  * Sheet index: `0`
  * Column Name or Index: `B` *(Chọn cột B cần nối tiếp dữ liệu)*.
  * Value: Điền nội dung chuỗi (hoặc truyền biến chứa dữ liệu, ví dụ biến mã coupon `$couponCode`).

Kết quả: Hệ thống sẽ tự động quét cột B từ trên xuống dưới, nhận diện được từ hàng 1 đến hàng 5 đã có dữ liệu, và lập tức ghi giá trị của biến vào ngay hàng trống đầu tiên (hàng 6 - ô `B6`). Ở lượt chạy tiếp theo của kịch bản, dữ liệu mới sẽ lại tự động được đẩy xuống hàng 7 (`B7`), hàng 8 (`B8`)... một cách tuần tự và chính xác.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-1261fa7b60a060026d02e05f455152d528824f0d%2Fimage%20(156).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-ef5f21de3369f7e4afdcaa6f3450a38e3a0aad20%2Fimage%20(155).png?alt=media" alt=""><figcaption></figcaption></figure>


# Folder exists

Folder exists là hành động dùng để kiểm tra xem một thư mục (folder) có đang tồn tại trên ổ cứng máy tính theo đường dẫn được chỉ định hay không. Kết quả trả về của hành động này là một giá trị Logic: True (Nếu tìm thấy thư mục) hoặc False (Nếu thư mục không tồn tại).

Hành động này thường được dùng làm bước đệm trước khi bạn thực hiện các thao tác như tạo thư mục mới, xóa thư mục hoặc di chuyển file vào trong đó, giúp kịch bản chạy mượt mà và không bị dừng đột ngột do lỗi sai đường dẫn.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Folder Path: Đường dẫn tuyệt đối dẫn đến thư mục cần kiểm tra trên máy tính (Ví dụ: `D:\GPM_Data`).
* Output variable: Tên biến lưu kết quả kiểm tra (`True` hoặc `False`).

#### Ví dụ thực tế: Kiểm tra thư mục lưu ảnh Profile trước khi tải về

Giả sử bạn có một kịch bản tự động tải ảnh đại diện từ trên mạng về để lưu vào thư mục riêng của từng Profile theo cấu trúc: `D:\GPM_Data\Profile_1`. Nếu thư mục `Profile_1` này chưa được tạo sẵn trên ổ D, hành động tải ảnh phía sau sẽ bị lỗi ngay lập tức.

Để xử lý logic này một cách thông minh, bạn cấu hình như sau:

* Bước 1: Gọi hành động Folder exists, điền đường dẫn thư mục cần kiểm tra là `D:\GPM_Data\Profile_1`, đặt tên biến đầu ra là `$isFolderReady`.
* Bước 2: Dùng khối lệnh điều kiện If để kiểm tra: `Nếu $isFolderReady = False` (nghĩa là thư mục này chưa tồn tại).
* Bước 3: Nằm bên trong khối If, bạn gọi hành động Create folder với đường dẫn `D:\GPM_Data\Profile_1` để hệ thống tự động tạo mới thư mục này.

Kết quả: Kịch bản sẽ tự động kiểm tra trước. Nếu chưa có thư mục, nó sẽ tự động tạo rồi mới tiến hành tải ảnh về, đảm bảo luồng chạy luôn an toàn và không bao giờ bị crash.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-2ae82c478cc53f7fef5187d6c385343e365109b2%2Fimage%20(157).png?alt=media" alt=""><figcaption></figcaption></figure>


# Create folder

Create folder là hành động dùng để khởi tạo một thư mục (folder) mới hoàn toàn trên ổ cứng máy tính theo đường dẫn được chỉ định.

Hành động này sở hữu cơ chế vận hành thông minh và an toàn:

* Nếu thư mục chưa tồn tại: Hệ thống sẽ tự động tạo mới thư mục đó (bao gồm cả việc tự tạo các thư mục cha nếu chúng chưa có sẵn).
* Nếu thư mục đã tồn tại: Hệ thống sẽ bỏ qua và chạy tiếp hành động sau, tuyệt đối không ghi đè hay làm ảnh hưởng đến dữ liệu bên trong thư mục cũ.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Folder Path: Đường dẫn tuyệt đối dẫn đến thư mục bạn muốn khởi tạo (Ví dụ: `D:\GPM_Softwares\Data_Crawler`).

#### Ví dụ thực tế: Tự động tạo thư mục lưu ảnh chụp màn hình (Screenshot) theo ngày

Khi chạy các kịch bản nuôi tài khoản hoặc cào dữ liệu, bạn thường có nhu cầu chụp lại màn hình trình duyệt khi gặp lỗi để tiện kiểm tra lại. Để dễ quản lý, bạn muốn mỗi ngày hệ thống sẽ tự gom ảnh vào một thư mục riêng biệt theo định dạng ngày tháng (Ví dụ: `D:\GPM_Screenshots\2026-06-29`).

* Cách cấu hình:
  * Trước khi gọi lệnh chụp màn hình, bạn gọi hành động Create folder.
  * Folder Path: Bạn kết hợp đường dẫn cố định với biến thời gian hệ thống, điền vào ô: `D:\GPM_Screenshots\$currentDate`.
* Kết quả: Khi kịch bản chạy bước này, hệ thống sẽ tự động kiểm tra xem hôm nay đã có thư mục mang tên ngày hiện tại (ví dụ: `2026-06-29`) chưa. Nếu chưa có, nó sẽ tự động tạo mới một thư mục sạch sẽ. Các hành động Screenshot phía sau chỉ việc trỏ đường dẫn lưu ảnh vào thư mục này là xong, giúp dữ liệu của bạn luôn được phân loại ngăn nắp theo từng ngày.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5f71e08cf4c8a6b567f84a83dcee1736d9c2507d%2Fimage%20(158).png?alt=media" alt=""><figcaption></figcaption></figure>


# Move / rename folder

Move / rename folder là hành động đa năng dùng để di chuyển toàn bộ một thư mục (bao gồm tất cả các file và thư mục con bên trong) sang một vị trí mới, hoặc đổi tên của thư mục đó ngay tại vị trí hiện tại trên ổ cứng.

Tương tự như thao tác với tệp tin, hành động này sẽ cắt hẳn thư mục sang vị trí mới (nếu di chuyển) hoặc thay thế hoàn toàn tên cũ (nếu đổi tên).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Source Folder: Đường dẫn tuyệt đối của thư mục nguồn cần di chuyển hoặc cần đổi tên (Ví dụ: `D:\GPM_Data\old_name`).
* Destination Folder: Đường dẫn tuyệt đối của thư mục đích nơi chuyển đến, hoặc đường dẫn chứa tên thư mục mới sau khi đổi (Ví dụ: `E:\Backup_Data\old_name` hoặc `D:\GPM_Data\new_name`).

#### Ví dụ thực tế 1: Đổi tên thư mục (Rename)

Bạn có một thư mục chứa dữ liệu tạm thời tên là `temp_data`. Sau khi kịch bản xử lý xong toàn bộ dữ liệu bên trong, bạn muốn đổi tên thư mục này thành `processed_data` để đánh dấu hoàn thành.

* Source Folder: `D:\GPM_Data\temp_data`
* Destination Folder: `D:\GPM_Data\processed_data` *(giữ nguyên đường dẫn cha, chỉ thay đổi tên thư mục ở cuối)*.
* Kết quả: Thư mục `temp_data` sẽ được đổi tên ngay lập tức thành `processed_data`.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-bd1a0334169f38ef5d7cba01409b30c024079a32%2Fimage%20(159).png?alt=media" alt=""><figcaption></figcaption></figure>


# Delete folder

Delete folder là hành động dùng để xóa bỏ hoàn toàn một thư mục ra khỏi ổ cứng máy tính theo đường dẫn được chỉ định. Khi thực thi, hành động này sẽ quét sạch và xóa toàn bộ các tệp tin cũng như các thư mục con nằm bên trong nó.

> ⚠️ Lưu ý cực kỳ quan trọng: Thư mục bị xóa bằng hành động này sẽ bị hủy vĩnh viễn và không nằm trong Thùng rác (Recycle Bin) của Windows. Bạn cần kiểm tra kỹ lưỡng đường dẫn để tránh xóa nhầm các thư mục hệ thống hoặc dữ liệu quan trọng của máy tính.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

#### Tham số cấu hình:

* Folder Path: Đường dẫn tuyệt đối dẫn đến thư mục cần xóa trên máy tính (Ví dụ: `D:\GPM_Data\temp_cache`).

#### Ví dụ thực tế: Tự động dọn dẹp thư mục bộ nhớ đệm (Cache) sau khi chạy xong luồng

Khi bạn viết kịch bản tải các video dạng ngắn (Shorts, Reels, TikTok) về máy để xử lý, chỉnh sửa rồi đăng tải lên kênh khác. Kịch bản thường sẽ tạo ra một thư mục tạm thời để chứa các file video thô, file âm thanh tách rời và dữ liệu phát sinh trong quá trình render.

Sau khi kịch bản đã upload video thành công lên các nền tảng, bạn cần xóa bỏ thư mục tạm này để giải phóng dung lượng cho ổ cứng:

* Cách cấu hình: Ở bước cuối cùng của kịch bản, bạn gọi hành động Delete folder.
  * Folder Path: Điền đường dẫn thư mục tạm đã dùng, ví dụ: `D:\GPM_Softwares\Render_Temp`.
* Kết quả: Hệ thống sẽ xóa sạch bách thư mục `Render_Temp` cùng toàn bộ các file rác phát sinh bên trong. Máy tính của bạn sẽ luôn sạch sẽ, chạy mượt mà và không lo bị đầy bộ nhớ sau một thời gian dài treo máy tự động.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4f11bfc6034a2100e148e74c45b42e8b40c8c81c%2Fimage%20(160).png?alt=media" alt=""><figcaption></figcaption></figure>


# Folder get file list

Folder get file list là hành động dùng để quét một thư mục trên máy tính và thu thập toàn bộ đường dẫn của các tệp tin (file) đang có bên trong thư mục đó, sau đó lưu tất cả vào một mảng danh sách (array) ở biến đầu ra.

Hành động này cực kỳ hữu ích khi bạn có một thư mục chứa rất nhiều ảnh, video hoặc file cấu hình và muốn lấy danh sách đó để dùng vòng lặp xử lý từng file một, hoặc dùng để đếm xem trong thư mục đang có tổng cộng bao nhiêu tệp tin.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/EH7olDLAb9c).

> 🔗 Xem hướng dẫn chi tiết về cách kết hợp hành động này để đếm số lượng file và kiểm tra điều kiện tại mục [2. Đếm số lượng tệp tin trong một thư mục (Folder)](/huong-dan-cac-action/variables/count#vi-du-thuc-te-dem-so-luong-anh-bat-dong-san-trong-thu-muc-d-bds-cat-bi) trong phần Count.


# 📋Clipboard


# Get clipboard text

Lấy nội dung văn bản hiện có trong clipboard.

Get clipboard text là hành động dùng để đọc (lấy) toàn bộ nội dung văn bản đang được lưu trữ trong bộ nhớ tạm (Clipboard) của máy tính – chính là phần văn bản bạn vừa thực hiện lệnh Copy (`Ctrl + C`) từ một nguồn bất kỳ – rồi lưu giá trị đó vào một biến đầu ra.

Hành động này cực kỳ linh hoạt khi bạn cần phối hợp xử lý dữ liệu giữa các phần mềm bên ngoài (như Excel, Notepad, công cụ quét dữ liệu khác) với trình duyệt Automation của GPM.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/OLHoUtANkXw).

#### Tham số cấu hình:

* Output variable: Tên biến lưu chuỗi văn bản lấy ra từ bộ nhớ tạm.

> ⚠️ Lưu ý cực kỳ quan trọng đối với Đa luồng (Multi-threading): Hành động này không phù hợp khi chạy đa luồng. Hệ điều hành Windows chỉ có duy nhất một bộ nhớ tạm (Clipboard) chung cho toàn bộ máy tính. Nếu bạn mở nhiều profile chạy cùng một lúc, các luồng sẽ tranh chấp và ghi đè dữ liệu lên nhau, dẫn đến việc luồng này lấy nhầm dữ liệu của luồng kia. Do đó, chỉ nên sử dụng hành động này khi chạy đơn luồng (1 profile tại một thời điểm).

#### Ví dụ thực tế: Lấy mã giảm giá được copy thủ công bên ngoài để điền vào trình duyệt

Giả sử bạn đang chạy một kịch bản đặt hàng tự động ở chế độ đơn luồng. Trước khi bấm chạy luồng, bạn lướt mạng và thấy một mã giảm giá hời, bạn dùng chuột bôi đen và nhấn `Ctrl + C` chuỗi chữ `GIAMGA50K` để lưu vào bộ nhớ máy tính.

Trong kịch bản GPM Automate, khi trình duyệt điều hướng đến trang thanh toán và cần nhập mã, bạn cấu hình như sau:

* Bước 1: Gọi hành động Get clipboard text, đặt tên biến đầu ra là `$copiedText`.
* Bước 2: Gọi hành động nhập liệu (ví dụ Key press), truyền biến `$copiedText` vào ô nhập mã giảm giá trên trang web.

Kết quả: Hệ thống sẽ tự động bốc chuỗi `GIAMGA50K` từ bộ nhớ tạm của Windows và điền thẳng vào website để áp dụng mã giảm giá, giúp bạn kết hợp mượt mà giữa thao tác tay và luồng chạy tự động.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-265c9d2442b2bbae23f7f976069bdc0471ee67e0%2Fimage%20(161).png?alt=media" alt=""><figcaption></figcaption></figure>


# Set clipboard text

Set clipboard text là hành động dùng để gán (ghi) một chuỗi văn bản hoặc giá trị của một biến vào bộ nhớ tạm (Clipboard) của hệ điều hành. Hành động này tương đương với thao tác bôi đen chữ rồi nhấn phím tắt Copy (`Ctrl + C`) trên máy tính.

Hành động này thường được sử dụng làm bước đệm trước khi bạn dùng lệnh dán dữ liệu, giúp nhập các đoạn văn bản dài hoặc ký tự đặc biệt vào trình duyệt một cách nhanh chóng mà không sợ bị lỗi gõ phím.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/OLHoUtANkXw).

#### Tham số cấu hình:

* Text: Nội dung văn bản thô (hoặc biến chứa dữ liệu) mà bạn muốn nạp vào bộ nhớ tạm.

> ⚠️ Lưu ý cực kỳ quan trọng đối với Đa luồng (Multi-threading): Tương tự như hành động lấy văn bản, Set clipboard text không phù hợp khi chạy đa luồng. Do hệ điều hành Windows chỉ sử dụng duy nhất một Clipboard chung cho toàn bộ hệ thống, việc nhiều profile cùng ghi dữ liệu vào Clipboard một lúc sẽ gây ra hiện tượng tranh chấp, luồng sau đè dữ liệu luồng trước và làm sai lệch kết quả. Hãy ưu tiên dùng hành động này cho các kịch bản chạy đơn luồng.

#### Ví dụ thực tế: Tự động copy và dán nội dung bài viết dài

Khi bạn cần điền một đoạn văn bản rất dài (chẳng hạn một bài viết bán hàng có định dạng xuống dòng phức tạp) vào ô nhập liệu trên website. Nếu sử dụng hành động gõ phím thông thường, hệ thống sẽ mất nhiều thời gian để gõ từng ký tự và đôi khi bị lỗi font chữ tiếng Việt. Phương pháp tối ưu nhất là sử dụng Clipboard:

* Bước 1: Bạn gọi hành động Set clipboard text, điền nội dung bài viết vào ô Text (hoặc truyền biến dữ liệu `$postContent`).
* Bước 2: Bạn click chuột vào ô nhập liệu trên website, sau đó gọi hành động Key press với tổ hợp phím `Control+V` để dán thẳng toàn bộ đoạn văn bản vào trang web ngay lập tức.

Kết quả: Toàn bộ nội dung bài viết dài sẽ được dán vào website chỉ trong một tích tắc, đảm bảo giữ nguyên định dạng, không bị lỗi gõ chữ và tăng tốc độ chạy kịch bản lên tối đa.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-dd5e1c628f36e30ab719ec301325f7c528aa49fc%2Fimage%20(162).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🌐HTTP


# HTTP Request

### Hành động gửi yêu cầu mạng (HTTP Request)

HTTP Request là hành động nâng cao dùng để gửi các yêu cầu mạng trực tiếp từ kịch bản đến một hệ thống máy chủ (Server), API bên thứ ba hoặc các website mà không cần phải mở giao diện trình duyệt để tương tác thủ công. Hành động này giúp tối ưu hóa tốc độ xử lý dữ liệu lên gấp hàng chục lần.

#### Giải thích các tham số cấu hình:

* URL: Địa chỉ đường dẫn của tài nguyên hoặc API trên máy chủ cần tương tác (Ví dụ: `[https://api.telegram.org/bot.../sendMessage](https://api.telegram.org/bot.../sendMessage)`).
* Method: Phương thức giao tiếp để định nghĩa hành động thực hiện:
  * `GET`: Lấy (đọc) dữ liệu từ máy chủ về.
  * `POST`: Gửi dữ liệu mới lên máy chủ (thường dùng để đăng nhập, tạo bài viết, gửi tin nhắn).
  * `PUT` / `PATCH`: Cập nhật dữ liệu đã có trên máy chủ.
  * `DELETE`: Xóa tài nguyên trên máy chủ.
* Header: Thông tin bổ sung gửi kèm yêu cầu để máy chủ nhận diện trình duyệt hoặc xác thực quyền truy cập.
  * *Ví dụ*: `Content-Type: application/json` (định dạng dữ liệu gửi lên), hoặc `Authorization: Bearer <token_bí_mật>` (mã cấu hình xác thực tài khoản).
* Data (Body / Payload): Dữ liệu thực tế được gửi kèm trong yêu cầu (chỉ áp dụng khi chọn các phương thức như `POST`, `PUT`, `PATCH`).
* Timeout: Thời gian tối đa (tính bằng giây tùy giao diện thiết lập mà hành động sẽ chờ đợi phản hồi từ máy chủ. Nếu quá thời gian này mà máy chủ không phản hồi, hành động sẽ tự động ngắt kết nối và báo lỗi (hoặc ném ra biệt lệ) để tránh việc kịch bản bị treo vô hạn do mạng lag hoặc server đối phương bị sập.
* Use profile's proxy: Tùy chọn cho phép sử dụng chính Proxy đang gán cho Profile đó để gửi request. Nếu không tích chọn, hệ thống sẽ dùng địa chỉ IP mạng nội bộ (Local IP) của máy tính bạn để gửi đi.

#### Định dạng cấu hình phần Data (Body) theo từng loại nội dung

Tùy thuộc vào yêu cầu của tài liệu API từ máy chủ, phần Data sẽ phải điền theo đúng quy chuẩn định dạng khác nhau:

**Ví dụ 1: Với dạng body `application/json`**

Đây là định dạng phổ biến nhất hiện nay khi làm việc với các API hiện đại. Phần body phải được điền theo cấu trúc cặp ngoặc nhọn `{}` và các trường dữ liệu nằm trong dấu nháy kép bọc chuẩn mã JSON.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-032f2a84848013ea60c7c80b16b90f611500c3b0%2Fimage%20(163).png?alt=media" alt=""><figcaption></figcaption></figure>

**Ví dụ 2: Với dạng body `application/x-www-form-urlencoded`**

Đây là định dạng chuỗi dữ liệu truyền thống thường gặp ở các form đăng nhập cũ hoặc một số cổng thanh toán. Các cặp thuộc tính được nối liền nhau thành một chuỗi văn bản liên tục.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-8a43e82d7fa03b10dd7fe02ca00a1a709bc9d0bf%2Fimage%20(164).png?alt=media" alt=""><figcaption></figcaption></figure>

**Ví dụ 3: Với dạng body `multipart/form-data`**

Đây là định dạng đặc biệt, bắt buộc phải dùng khi bạn có nhu cầu tải tệp tin (như hình ảnh, video, file tài liệu) hoặc gửi các biểu mẫu hỗn hợp phức tạp từ máy tính lên máy chủ.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-0e5abf426c9c6a3e96d907d70295a5e06db1768b%2Fimage%20(165).png?alt=media" alt=""><figcaption></figcaption></figure>


# HTTP Download

Tải xuống một file về máy tính thông qua giao thức HTTP.

HTTP Download là hành động nâng cao dùng để tải trực tiếp một tệp tin (như hình ảnh, video, file tài liệu, file zip...) từ một đường dẫn trực tuyến (URL) về lưu trữ trên máy tính của bạn mà không cần phải mở trình duyệt để nhấn nút Download thủ công.

#### Tham số cấu hình:

* URL: Địa chỉ đường dẫn trực tuyến dẫn thẳng đến tệp tin cần tải về (Ví dụ: `https://example.com/images/avatar.jpg`).
* Save Path: Đường dẫn tuyệt đối trên máy tính nơi bạn muốn lưu tệp tin sau khi tải về, bao gồm cả tên file và đuôi định dạng (Ví dụ: `D:\GPM_Data\downloads\avatar.jpg`).
* Headers: Thông tin bổ sung gửi kèm yêu cầu để xác thực quyền truy cập hoặc giả lập trình duyệt nếu máy chủ yêu cầu (Ví dụ: `User-Agent: Mozilla/5.0...` hoặc `Authorization: Bearer $token`). Nếu tải file công khai, bạn có thể để trống mục này.
* Output variable: Tên biến lưu kết quả trả về của hành động (thường trả về giá trị logic `True` nếu tải file thành công hoặc nội dung log phản hồi từ hệ thống).

#### Ví dụ thực tế: Tự động tải video từ đường dẫn có sẵn về máy tính

Giả sử bạn đang chạy một kịch bản cào bài viết và hệ thống đã trích xuất được một đường dẫn video trực tuyến lưu vào biến `$videoUrl`. Bạn muốn tải video này về một thư mục cố định trên ổ D để chuẩn bị cho các bước xử lý tiếp theo:

* Cách cấu hình:
  * URL: Truyền biến `$videoUrl` vào ô nhập liệu.
  * Save Path: Điền đường dẫn lưu file cụ thể, ví dụ: `D:\GPM_Data\Videos\downloaded_video.mp4`.
  * Headers: Để trống (nếu link tải công khai không cần tài khoản).
  * Output variable: Đặt tên biến lưu kết quả là `downloadStatus`.

Kết quả: Hệ thống sẽ tự động kết nối mạng, tải tệp tin video từ đường dẫn `$videoUrl` về và kết xuất thành một file vật lý tên là `downloaded_video.mp4` nằm gọn gàng tại thư mục `D:\GPM_Data\Videos\`. Biến `$downloadStatus` sẽ nhận giá trị để bạn có thể dùng khối lệnh If kiểm tra xem file đã tải xuống thành công hay chưa trước khi chuyển sang các hành động sau.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5a40534c6baf96490940b8818ac9d02edc8111ab%2Fimage%20(167).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🖼️Image Search


# Wait to image

Hành động này giúp tool tạm dừng và liên tục "canh" màn hình cho đến khi hình ảnh mục tiêu xuất hiện (hoặc hết thời gian chờ).

* Tác dụng: Rất cần thiết để đồng bộ, đảm bảo trang web hoặc ứng dụng đã tải xong dữ liệu rồi tool mới chạy tiếp, giúp kịch bản không bị vội, chạy lệch bước hay bấm nhầm khi web chưa tải kịp.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/xWu0g35YTGo).

> ⚠️ Lưu ý đặc biệt về tỷ lệ Scale (Thu phóng): Tỷ lệ phần trăm scale màn hình và độ phân giải của trình duyệt lúc bạn chụp ảnh mẫu bắt buộc phải giống y hệt với lúc kịch bản vận hành thực tế. Nếu lúc chụp ảnh mẫu bạn để màn hình hiển thị ở mức 100%, nhưng khi chạy profile hệ thống lại tự động mở ở mức scale 80% hoặc 125%, thuật toán quét ảnh sẽ không thể nhận diện được cấu trúc pixel của mục tiêu và dẫn đến kết quả sai lệch.

#### Ví dụ thực tế: Chờ nút đăng nhập hiển thị hoàn toàn

Khi bạn điều hướng trình duyệt đến một trang web, do tốc độ mạng thay đổi nên nút "Đăng nhập" có thể xuất hiện ngay lập tức hoặc mất vài giây để tải xong. Việc đặt cố định một khoảng thời gian chờ (Delay) có thể gây lãng phí thời gian hoặc vẫn bị lỗi nếu mạng quá chậm. Sử dụng Wait to image sẽ giúp kịch bản xử lý linh hoạt hơn:

* Cách cấu hình: Bạn cắt một ảnh nhỏ của nút "Đăng nhập" làm ảnh mẫu, thiết lập thời gian chờ tối đa và độ chính xác khi quét ảnh.
* Kết quả: Kịch bản sẽ chủ động chờ đợi, ngay khi nút "Đăng nhập" vừa hiển thị trên màn hình, hệ thống sẽ lập tức nhận diện được và chuyển sang hành động tiếp theo mà không cần phí thời gian chờ đợi dư thừa.

> 💡 *Các thông số chi tiết như cấu hình vùng ảnh mẫu (Image), thời gian chờ (Timeout), độ lệch màu (Threshold), True color và biến đầu ra (Output) sẽ được phân tích sâu ở phần hướng dẫn kết hợp bộ 3 hành động: Wait to image, Image exists và Image search.*


# Image exists

Hành động này giúp tool "liếc" nhanh một lần xem hình ảnh mục tiêu có đang hiển thị trên màn hình hay không. Kết quả trả về ngay lập tức là True (nếu thấy) hoặc False (nếu không thấy).

* Điểm khác biệt: Khác với `Wait to image` (chờ đợi), hành động này không dừng lại để chờ mà chỉ quét duy nhất một lần tại thời điểm chạy.
* Tác dụng: Rất phù hợp để kết hợp với các khối lệnh điều kiện (`If`, `Else if`), giúp kịch bản đưa ra quyết định thông minh ngay lập tức (ví dụ: nếu thấy pop-up quảng cáo thì đóng, nếu không thấy thì làm bước khác).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/xWu0g35YTGo).

> ⚠️ Lưu ý đặc biệt về tỷ lệ Scale (Thu phóng): Tỷ lệ phần trăm scale màn hình và độ phân giải của trình duyệt lúc bạn chụp ảnh mẫu bắt buộc phải giống y hệt với lúc kịch bản vận hành thực tế. Nếu lúc chụp ảnh mẫu bạn để màn hình hiển thị ở mức 100%, nhưng khi chạy profile hệ thống lại tự động mở ở mức scale 80% hoặc 125%, thuật toán quét ảnh sẽ không thể nhận diện được cấu trúc pixel của mục tiêu và dẫn đến kết quả sai lệch.

#### Ví dụ thực tế: Kiểm tra và tắt thông báo quảng cáo bất ngờ (Popup)

Khi bạn lướt một trang web, đôi khi sẽ có các cửa sổ quảng cáo hoặc thông báo khảo sát bất ngờ hiện lên che khuất màn hình. Nếu có quảng cáo, kịch bản cần bấm nút "X" để tắt đi rồi mới chạy tiếp; nếu không có, kịch bản sẽ bỏ qua bước tắt để tránh mất thời gian.

* Cách cấu hình: Bạn chụp một ảnh mẫu nhỏ của nút "X" tắt quảng cáo để hệ thống nhận diện.
* Kết quả: Hệ thống sẽ quét màn hình tại giây phút đó. Nếu xuất hiện nút "X", biến đầu ra sẽ nhận giá trị `True`. Bạn chỉ cần kết hợp với khối lệnh điều kiện If (Nếu biến = `True`) thì sẽ gọi hành động Mouse click vào vị trí đó để dọn dẹp màn hình trước khi đi tiếp.

> 💡 *Các thông số chi tiết như cấu hình vùng ảnh mẫu (Image), độ lệch màu (Threshold), True color và biến đầu ra (Output) sẽ được phân tích sâu ở phần hướng dẫn kết hợp bộ 3 hành động: Wait to image, Image exists và Image search.*


# Image search

Đây là hành động nâng cao giúp quét toàn bộ màn hình, tìm vị trí của ảnh mục tiêu và trả về chính xác tọa độ (X, Y) của tâm ảnh đó.

* Tác dụng: Là giải pháp "cứu cánh" khi website hoặc ứng dụng không có thẻ HTML (như game, ứng dụng cũ, hay đồ thị canvas). Bạn dùng nó để xác định tọa độ, từ đó yêu cầu tool click chuột vào đúng vị trí đó một cách chuẩn xác.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/xWu0g35YTGo).

> ⚠️ Lưu ý đặc biệt về tỷ lệ Scale (Thu phóng): Tỷ lệ phần trăm scale màn hình và độ phân giải của trình duyệt lúc bạn chụp ảnh mẫu bắt buộc phải giống y hệt với lúc kịch bản vận hành thực tế. Nếu lúc chụp ảnh mẫu bạn để màn hình hiển thị ở mức 100%, nhưng khi chạy profile hệ thống lại tự động mở ở mức scale 80% hoặc 125%, thuật toán quét ảnh sẽ không thể nhận diện được cấu trúc pixel của mục tiêu và dẫn đến việc không tìm thấy tọa độ.

#### Ví dụ thực tế: Tìm vị trí của một vật thể di động trên màn hình để click chuột

Giả sử bạn đang chạy kịch bản trên một website chơi game nhận thưởng hoặc một ứng dụng có nút bấm thay đổi vị trí liên tục theo thời gian thực mà không cố định một chỗ. Bạn cần tìm ra nút bấm đó đang nằm ở đâu để điều khiển chuột click vào:

* Cách cấu hình: Bạn chụp ảnh mẫu của nút bấm đó làm mục tiêu tìm kiếm.
* Kết quả: Khi thực thi, hệ thống sẽ quét nhanh màn hình. Nếu tìm thấy nút bấm, nó sẽ lập tức tính toán ra tọa độ điểm ảnh (Ví dụ: `X = 550`, `Y = 420`) và lưu hai giá trị này vào biến hệ thống đầu ra. Ngay sau đó, bạn có thể gọi hành động Mouse move hoặc Mouse click truyền trực tiếp hai biến tọa độ `X` và `Y` này vào để chuột tự động tìm đến và bấm chính xác vào mục tiêu.

> 💡 *Các thông số chi tiết như cấu hình vùng ảnh mẫu (Image), độ lệch màu (Threshold), True color và biến đầu ra (Output) sẽ được phân tích sâu ở phần hướng dẫn kết hợp bộ 3 hành động: Wait to image, Image exists và Image search.*


# Ví dụ kết hợp cho Image

Để tạo ra một kịch bản automation thông minh, xử lý mượt mà các tình huống thực tế trên giao diện (UI) trang web hoặc phần mềm, việc kết hợp bộ 3 hành động này theo một luồng logic chặt chẽ là giải pháp tối ưu nhất.

Dưới đây là phần giải thích chi tiết các thông số kỹ thuật chung và các bước thiết lập luồng đi cho một kịch bản thực tế.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/xWu0g35YTGo).

#### Các thông số cấu hình cốt lõi cần nắm vững:

* Image (Ảnh mẫu): Vùng ảnh mục tiêu bạn cắt ra từ màn hình để làm dữ liệu đối sánh cho hệ thống.
* Timeout (Thời gian chờ): Giới hạn thời gian tối đa để hệ thống tìm kiếm ảnh (chỉ áp dụng cho *Wait to image*).
* Threshold (Độ lệch màu / Dung sai): Tỷ lệ chính xác khi đối sánh pixel (thường đặt từ `0.7` đến `0.95`). Số càng gần `1` yêu cầu ảnh thực tế phải càng giống ảnh mẫu tuyệt đối. Bạn có thể tăng giảm giá trị này rồi test đến khi phù hợp.
* True color: Tùy chọn bắt buộc hệ thống phải đối sánh chính xác cả dải màu sắc gốc. Nếu tắt, hệ thống sẽ chuyển ảnh về dạng đen trắng (Grayscale) để nhận diện hình khối, giúp tăng tốc độ quét nhưng bỏ qua yếu tố màu sắc.
* Output variable (Biến đầu ra): Biến lưu giá trị logic (`True`/`False`) hoặc lưu tọa độ điểm (`X`, `Y`) tùy thuộc vào hành động được chọn.

### Bài toán thực tế: Tự động nhấn "Continue with Google" trên Pinterest

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-ee470338a1f41e491dffc92cd1f4199e67c84d1e%2Fimage%20(173).png?alt=media" alt=""><figcaption></figcaption></figure>

**Bước 1: Đồng bộ luồng tải trang với hành động Wait to image**

Sau khi bạn nhấn nút *Sign up* trên trang chủ Pinterest, Form đăng ký cần một khoảng thời gian ngắn để tải dữ liệu lên màn hình.

* Cách cấu hình: Bạn trỏ vùng ảnh mẫu (Image) vào tiêu đề dòng chữ hoặc một thành phần cố định (nút Continue with Google) chắc chắn sẽ xuất hiện trên Form đăng ký. Thiết lập thời gian Timeout là `10` (10 giây) và đặt mức Threshold phù hợp (ví dụ: `0.7`).
* Logic vận hành: Kịch bản sẽ tạm dừng lại để quan sát màn hình. Ngay khi Form đăng ký vừa hiển thị, hệ thống lập tức kích hoạt bước tiếp theo mà không cần chờ đợi lãng phí thời gian.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-a61c34c56df64a24524b61d9aaff7535647a21b8%2Fimage%20(168).png?alt=media" alt=""><figcaption></figcaption></figure>

**🔹 Bước 2: Kiểm tra sự tồn tại của nút bấm với hành động Image exists**

Do Pinterest có thể hiển thị biểu mẫu nhập Email đè lên hoặc hiển thị một thông báo điều hướng khác tùy thuộc vào từng Profile, chúng ta cần kiểm tra xem nút Google có thực sự đang nằm trên màn hình hay không.

* Cách cấu hình: Trỏ ảnh mẫu vào biểu tượng chữ "G" bốn màu của Google hoặc dòng chữ Continue with Google. Cấu hình biến đầu ra lưu kết quả.
* Logic vận hành: Hệ thống quét nhanh màn hình tại thời điểm đó đúng 1 lần. Nếu nút Google xuất hiện, biến đầu ra sẽ nhận giá trị logic là `True` (ngược lại là `False`).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-fdbc0a9efde507eaea3faaca076c58c386d39b2f%2Fimage%20(169).png?alt=media" alt=""><figcaption></figcaption></figure>

**🔹 Bước 3: Lọc điều kiện xử lý với khối lệnh If**

Để kịch bản chạy thông minh và không bị lỗi click hụt, chúng ta bọc các bước tương tác phía sau vào trong khối lệnh điều kiện.

* Cách cấu hình: Thêm khối lệnh If và thiết lập điều kiện: Kiểm tra nếu biến kết quả ở Bước 2 trả về giá trị `True` (Nghĩa là nút Google đã sẵn sàng trên màn hình).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-724e5737730201fd8b4ecc8ff99d58c6467d7490%2Fimage%20(170).png?alt=media" alt=""><figcaption></figcaption></figure>

**🔹 Bước 4: Tìm vị trí chính xác trong khối If với hành động Image search**

Nằm bên trong khối lệnh If, khi điều kiện thỏa mãn, hệ thống bắt đầu truy vết để lấy tọa độ của nút bấm (vì vị trí Form đăng ký có thể dịch chuyển linh hoạt tùy theo độ phân giải màn hình của từng Profile).

* Cách cấu hình: Sử dụng ảnh mẫu nút "Continue with Google" hoặc logo chữ "G". Thiết lập bật True color sang `Yes` *(Bắt buộc bật để nhận diện chuẩn xác 4 màu gốc đặc trưng của Google, tránh nhầm lẫn với các ký tự chữ khác)*. Đặt biến đầu ra để lưu tọa độ là `pos`.
* Logic vận hành: Hệ thống quét và tính toán ra chính xác vị trí tâm điểm của nút Google trên màn hình (Ví dụ: `$pos = 720,540`).

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-28a6207e6fde8a41322b3535e679813c175c5187%2Fimage%20(171).png?alt=media" alt=""><figcaption></figcaption></figure>

**🔹 Bước 5: Thực hiện nhấp chuột với hành động Mouse click**

Đây là bước cuối cùng nằm trong khối If để hoàn tất luồng xử lý.

* Cách cấu hình: Chọn hành động Mouse click, tại ô thiết lập tọa độ, bạn truyền trực tiếp biến vừa tìm được ở bước trên vào ô tương ứng: `$pos`.
* Logic vận hành: Chuột trên hệ thống sẽ tự động di chuyển đến đúng vị trí pixel của nút Google đã quét được và thực hiện lệnh click để tiếp tục luồng đăng nhập xuyên qua lớp Iframe một cách mượt mà.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-78df3b5e81d78c2cd3fae55e368422cb205fdce6%2Fimage%20(172).png?alt=media" alt=""><figcaption></figcaption></figure>


# Image to Base64

Hành động này giúp bạn mã hóa một file ảnh trên máy tính thành một chuỗi ký tự văn bản (chuỗi Base64) dài.

* Tác dụng: Cực kỳ hữu ích khi cần gửi ảnh qua các lệnh mạng như `HTTP Request`. Ví dụ: bạn muốn gửi ảnh lên các dịch vụ AI để nhờ giải mã captcha, hoặc upload ảnh lên server mà không muốn truyền tải file theo cách thông thường.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/xWu0g35YTGo).

#### Tham số cấu hình:

* Image Path: Đường dẫn tuyệt đối dẫn đến file ảnh trên máy tính cần chuyển đổi (Ví dụ: `D:\GPM_Data\captcha.png`).
* Output variable: Tên biến lưu chuỗi ký tự Base64 sau khi mã hóa thành công.

#### Ví dụ thực tế: Chuyển đổi ảnh Captcha để gửi lên hệ thống giải tự động qua API

Khi bạn điều hướng vào một website và gặp mã Captcha dạng hình ảnh. Bạn đã dùng hành động Screenshot để chụp lại vùng chứa mã Captcha đó và lưu thành một file ảnh tại `D:\GPM_Data\captcha.png`. Bây giờ, bạn muốn gửi bức ảnh này lên một API bên thứ ba (như 2Captcha, Anti-Captcha) để nhờ họ giải hộ. Vì API của họ yêu cầu dữ liệu ảnh phải ở dạng chuỗi văn bản Base64, bạn sẽ cấu hình như sau:

* Bước 1: Gọi hành động Image to Base64.
  * Image Path: Điền `D:\GPM_Data\captcha.png`.
  * Output variable: Đặt tên biến là `base64String`.
* Bước 2: Gọi hành động HTTP Request (Method POST) để gửi dữ liệu lên Server giải captcha. Trong phần Data (Body), bạn truyền biến `$base64String` vào cấu trúc JSON theo đúng tài liệu API của họ.

Kết quả: File ảnh `captcha.png` sẽ được bẻ thành một chuỗi mã chữ dài thướt tha dạng `data:image/png;base64,iVBORw0KGgoAAAANSU...` lưu vào biến `$base64String`. Lệnh HTTP Request phía sau chỉ việc bốc chuỗi này gửi đi một cách gọn gàng, giúp kịch bản tự động vượt qua các lớp bảo mật Captcha dễ dàng.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-82f0d1c9b3988b4563dee25b80db7f9aa6d51f75%2Fimage%20(174).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🤖AI


# ChatGPT

Chat GPT là hành động tích hợp sẵn giúp kịch bản của bạn có thể giao tiếp trực tiếp với các mô hình ngôn ngữ lớn của OpenAI thông qua giao thức API. Hành động này biến kịch bản Automation trở nên thông minh vượt trội nhờ khả năng tự động xử lý ngôn ngữ tự nhiên, dịch thuật, tóm tắt văn bản, trích xuất thông tin, hoặc tự động sáng tạo nội dung bài viết ngay trong luồng chạy.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/ir5gNwWHYdg).

#### Bước 1: Đăng ký tài khoản và Mua Credits (API) trên OpenAI

Khác với tài khoản ChatGPT Plus (gói trả phí $20/tháng dùng trên giao diện web), tài khoản sử dụng API hoạt động theo cơ chế Nạp tiền trước, dùng bao nhiêu trừ bấy nhiêu (Pay-as-you-go).

1. Đăng ký tài khoản: Bạn truy cập vào trang dành cho lập trình viên của OpenAI tại địa chỉ [https://platform.openai.com](https://platform.openai.com/) và tiến hành đăng ký tài khoản (bằng Email hoặc liên kết trực tiếp với tài khoản Google).
2. Nạp tiền mua API:
   * Tại giao diện quản lý, bạn tìm đến mục Settings ➔ Billing.
   * Nhấp chọn Add credits (hoặc Set up payment) để liên kết thẻ thanh toán quốc tế (Visa/Mastercard) của bạn.
   * Tiến hành nạp một số tiền nhỏ tối thiểu (thường là $5) vào tài khoản. Số tiền này sẽ được trừ dần dựa trên số lượng ký tự (Token) văn bản mà kịch bản của bạn gửi lên và nhận về từ AI.

#### Bước 2: Khởi tạo và Lấy mã API Key (GPT API)

Mã API Key đóng vai trò như một chiếc chìa khóa bảo mật giúp GPM Automate kết nối và sử dụng số tiền bạn vừa nạp để gọi AI xử lý công việc.

1. Tại thanh menu bên trái giao diện OpenAI Platform, bạn truy cập vào mục API Keys.
2. Nhấp vào nút Create new secret key (Tạo khóa bí mật mới).
3. Đặt một cái tên gợi nhớ cho chiếc chìa khóa này (Ví dụ: `GPM_Automate_Key`).
4. Hệ thống sẽ hiển thị một chuỗi ký tự dài bắt đầu bằng chữ `sk-...`.

   > ⚠️ Lưu ý: Hãy Copy và lưu lại mã này ngay lập tức vào một file bảo mật, vì OpenAI sẽ chỉ hiển thị chuỗi này duy nhất một lần này. Nếu làm mất, bạn sẽ phải tạo một chiếc chìa khóa mới.

#### Bước 3: Lấy danh sách tên Model chính xác (GPT Model)

OpenAI cung cấp rất nhiều thế hệ AI với tốc độ, chi phí và độ thông minh khác nhau. Để điền chính xác tên Model vào GPM Automate:

Truy cập mục Models trên trang Platform của OpenAI để xem danh sách tại đây: <https://developers.openai.com/api/docs/models/all>. Hoặc xem nhanh danh sách các Model phổ biến nhất dưới đây:

| **Tên Model (Điền vào GPM)** | **Đặc điểm & Khuyên dùng**                                                                                                               |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| gpt-4o-mini                  | Model thế hệ mới, tốc độ phản hồi siêu nhanh, chi phí token cực kỳ rẻ, tối ưu nhất cho các tác vụ Automation thông thường.               |
| gpt-4o                       | Model thông minh nhất hiện tại, xử lý các logic toán học, lập trình hoặc viết content chuyên sâu vô cùng xuất sắc nhưng chi phí cao hơn. |
| gpt-3.5-turbo                | Model truyền thống, độ thông minh ở mức cơ bản, xử lý tốt các bài toán dịch thuật hoặc dọn dẹp văn bản đơn giản.                         |

#### Giải thích các tham số cấu hình:

* GPT API: Điền mã khóa bí mật (Secret Key API) được khởi tạo từ trang quản lý tài khoản OpenAI của bạn (Chuỗi thường có định dạng bắt đầu bằng `sk-...`).
* GPT Model: Điền tên mã định danh của mô hình trí tuệ nhân tạo mà bạn muốn sử dụng, ví dụ: `gpt-3.5-turbo`, `gpt-3.5-turbo-0125`, `gpt-4o`...
* Prompt: Điền câu hỏi, ngữ cảnh hoặc yêu cầu chi tiết mà bạn muốn ChatGPT xử lý và trả lời. Bạn hoàn toàn có thể lồng các biến dữ liệu cào được từ trình duyệt vào ô này để AI phân tích.
* Output variable: Tên biến lưu lại toàn bộ chuỗi văn bản câu trả lời phản hồi từ ChatGPT.

#### Ví dụ thực tế: Tự động dịch và viết lại tiêu đề bài viết (Rewrite Title) tránh bản quyền

Khi bạn làm Marketing, POD hoặc làm nội dung trên thị trường quốc tế (chẳng hạn như thị trường Đức), bạn cần cào các tiêu đề sản phẩm từ các trang E-commerce bằng tiếng Anh về, sau đó dịch sang tiếng Đức và viết lại một chút để đăng lên cửa hàng của mình nhằm tối ưu SEO và tránh trùng lặp nội dung.

* Cách cấu hình:
  * Giả sử bạn đã cào được tiêu đề gốc tiếng Anh và lưu vào biến `$originTitle`.
  * Gọi hành động Chat GPT trong kịch bản.
  * GPT API: `sk-proj-xxxxxxxxxxxxxxxxxxxx`
  * GPT Model: `gpt-3.5-turbo`
  * Prompt: Bạn điền nội dung chỉ thị cho AI:

    ```
    Hãy dịch tiêu đề sản phẩm sau sang tiếng Đức và viết lại nó sao cho thật tự nhiên, ngắn gọn, hấp dẫn để làm marketing. Tiêu đề gốc: "$originTitle". Chỉ trả về duy nhất chuỗi kết quả sau khi dịch và viết lại, không thêm bất kỳ lời dẫn hay giải thích nào khác.
    ```
  * Output variable: Đặt tên biến đầu ra là `aiContent`.

Kết quả: Hệ thống sẽ đẩy tiêu đề trong biến `$originTitle` lên ChatGPT xử lý. AI sẽ nhanh chóng biên dịch và tối ưu ngôn từ sang tiếng Đức, sau đó nạp thẳng kết quả văn bản tinh gọn nhất vào biến `$aiContent`. Ở các bước tiếp theo, bạn chỉ việc gọi biến `$aiContent` này ra để điền tự động vào ô nhập liệu trên website của mình, giúp tự động hóa quy trình làm content xuyên biên giới cực kỳ chuyên nghiệp.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-b6750a625a7504ce3a97b4b91768fa62e7495842%2Fimage%20(175).png?alt=media" alt=""><figcaption></figcaption></figure>


# DeepSeek

DeepSeek là hành động tích hợp sẵn giúp kịch bản GPM Automate của bạn kết nối thẳng tới hệ thống API của DeepSeek. Với ưu thế vượt trội về chi phí siêu rẻ và khả năng tư duy logic, lập trình, ngôn ngữ vô cùng mạnh mẽ, hành động này là một sự thay thế hoặc bổ sung hoàn hảo bên cạnh Chat GPT để tự động hóa các tác vụ tạo nội dung, phân tích dữ liệu, hay xử lý văn bản thông minh.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/ir5gNwWHYdg).

#### Hướng dẫn đăng ký, mua API và cấu hình hành động DeepSeek

Cơ chế hoạt động và tính toán chi phí qua API của DeepSeek tương tự như OpenAI (Nạp tiền trước, dùng bao nhiêu trừ bấy nhiêu). Quy trình thiết lập cụ thể bao gồm các bước sau:

**Bước 1: Đăng ký tài khoản và Nạp tiền (API Credits)**

1. Bạn truy cập vào trang quản lý API chính thức của DeepSeek tại địa chỉ: [https://platform.deepseek.com](https://platform.google.com/url?q=https://platform.deepseek.com) và tiến hành tạo tài khoản.
2. Sau khi đăng nhập, truy cập vào mục Top up hoặc Billing để liên kết thẻ thanh toán quốc tế (Visa/Mastercard) và nạp số tiền mong muốn (thường tối thiểu từ $2 - $5) để kích hoạt hạn ngạch sử dụng API.

**Bước 2: Khởi tạo và lấy mã DeepSeek API Key**

1. Tại thanh menu bên trái, chọn mục API Keys.
2. Nhấn vào nút Create new secret key, đặt tên cho khóa (Ví dụ: `GPM_DeepSeek_Key`).
3. Hệ thống sẽ hiển thị một chuỗi ký tự bảo mật dài bắt đầu bằng `sk-...`. Bạn hãy Copy và lưu lại ngay lập tức vì chuỗi này sẽ ẩn đi và không hiển thị lại lần thứ hai.

**Bước 3: Lấy danh sách tên Model chính xác**

DeepSeek cung cấp hai mô hình cốt lõi cực kỳ tối ưu, bạn chỉ cần điền chính xác một trong hai mã định danh sau vào ô cấu hình của GPM. Bạn có thể xem danh sách model của DeepSeek tại đây: <https://api-docs.deepseek.com/quick_start/pricing>.

#### Các tham số cấu hình trong GPM Automate:

Khi kéo hành động DeepSeek vào luồng Main workflow, bạn thiết lập như sau:

* API Key: Dán mã khóa bí mật `sk-...` lấy ở Bước 2 vào đây (hoặc truyền qua biến số để bảo mật).
* DeepSeek Model: Điền chính xác chuỗi `deepseek-chat` hoặc `deepseek-reasoning`.
* Prompt: Điền nội dung câu lệnh hoặc yêu cầu chi tiết của bạn (Ví dụ: `"Hãy phân tích đoạn hội thoại sau và trích xuất ra số điện thoại của khách hàng: $webContent"`).
* Output variable: Đặt tên biến đầu ra (Ví dụ: `deepseekResult`) để hệ thống tự động lưu chuỗi văn bản câu trả lời của AI, sẵn sàng cho các hành động điền dữ liệu tiếp theo.

#### Ví dụ thực tế: Tự động dịch và viết lại tiêu đề bài viết (Rewrite Title) tránh bản quyền

Khi bạn làm Marketing, POD hoặc làm nội dung trên thị trường quốc tế (chẳng hạn như thị trường Đức), bạn cần cào các tiêu đề sản phẩm từ các trang E-commerce bằng tiếng Anh về, sau đó dịch sang tiếng Đức và viết lại một chút để đăng lên cửa hàng của mình nhằm tối ưu SEO và tránh trùng lặp nội dung.

* Cách cấu hình:
  * Giả sử bạn đã cào được tiêu đề gốc tiếng Anh và lưu vào biến `$originTitle`.
  * Gọi hành động DeepSeek trong kịch bản.
  * API Key: `sk-proj-xxxxxxxxxxxxxxxxxxxx`
  * DeepSeek Model: `deepseek-v4-flash`
  * Prompt: Bạn điền nội dung chỉ thị cho AI:

    ```
    Hãy dịch tiêu đề sản phẩm sau sang tiếng Đức và viết lại nó sao cho thật tự nhiên, ngắn gọn, hấp dẫn để làm marketing. Tiêu đề gốc: "$originTitle". Chỉ trả về duy nhất chuỗi kết quả sau khi dịch và viết lại, không thêm bất kỳ lời dẫn hay giải thích nào khác.
    ```
  * Output variable: Đặt tên biến đầu ra là `aiContent`.

Kết quả: Hệ thống sẽ đẩy tiêu đề trong biến `$originTitle` lên DeepSeek xử lý. AI sẽ nhanh chóng biên dịch và tối ưu ngôn từ sang tiếng Đức, sau đó nạp thẳng kết quả văn bản tinh gọn nhất vào biến `$aiContent`. Ở các bước tiếp theo, bạn chỉ việc gọi biến `$aiContent` này ra để điền tự động vào ô nhập liệu trên website của mình, giúp tự động hóa quy trình làm content xuyên biên giới cực kỳ chuyên nghiệp.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-36f481cd353c11f821519d77dcfb0d1c9bd9f215%2Fimage%20(176).png?alt=media" alt=""><figcaption></figcaption></figure>


# 📧Mail


# Read mail code

Read mail code là hành động nâng cao giúp kịch bản tự động đăng nhập vào hộp thư điện tử (Gmail, Outlook, Hotmail, Yahoo...) thông qua giao thức kết nối bảo mật IMAP. Hệ thống sẽ tự động quét thư mới nhất, tìm kiếm email từ người gửi chỉ định và trích xuất ra mã xác thực (OTP/Code) để điền vào trang web mà không cần bạn phải mở tab email lên thao tác thủ công.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/c9384x0uWiI).

#### Giải thích các tham số cấu hình:

* Email: Điền địa chỉ hộp thư cần đọc mã xác thực (Ví dụ: `gpm_user@gmail.com`).
* Password: Điền mật khẩu kết nối.

  > ⚠️ Chú ý quan trọng: Với các dòng mail bảo mật cao như Gmail, bạn không được điền mật khẩu chính của tài khoản vào đây mà bắt buộc phải điền Mật khẩu ứng dụng (App Password) được tạo riêng trong cài đặt bảo mật của email đó (Hướng dẫn lấy ở mục dưới).
* Mail server: Địa chỉ máy chủ IMAP của nhà cung cấp dịch vụ mail.
  * *Ví dụ Gmail*: `imap.gmail.com`
  * *Ví dụ Outlook/Hotmail*: `outlook.office365.com`
* Email sent to contains: Từ khóa hoặc địa chỉ email gửi đến có chứa cụm từ đó (Dùng để lọc đúng email cần tìm, ví dụ: `noreply@pinterest.com` hoặc `no-reply@pinterest`).
* Proxy: Tùy chọn cấu hình IP để đăng nhập vào máy chủ mail, giúp tránh bị các nhà cung cấp dịch vụ (như Google, Microsoft) chặn kết nối khi thao tác số lượng lớn tài khoản. Bạn có thể thiết lập theo 3 cách:
  * Để trống: Hệ thống sẽ sử dụng mạng mạng gốc (IP máy thực) để thực hiện kết nối và tải mã.
  * Điền biến `$profileProxy`: Kịch bản sẽ tự động bốc gói Proxy đang được gán riêng cho Profile GPM hiện tại để sử dụng.
  * Tự điền proxy: Nhập trực tiếp chuỗi Proxy theo định dạng cụ thể (Ví dụ: `ip:port` hoặc `ip:port:user:pass`) mà bạn muốn chỉ định riêng cho hành động này.
* Code type: Định dạng cấu trúc của mã OTP cần bóc tách. Hệ thống hỗ trợ 3 tùy chọn:
  1. Number (Kiểu số): Dùng khi mã OTP gửi về hoàn toàn là các con số liên tiếp (Ví dụ: `475997`).
     * *Code Length*: Độ dài chính xác của dãy số cần bóc (Ví dụ mã gồm 6 số thì điền `6`).
  2. Text (Kiểu chữ): Dùng khi mã OTP có chứa cả ký tự chữ và số xen kẽ, hoặc nằm ẩn sâu trong một thẻ cấu trúc HTML của email.
     * *Code element xpath*: Đường dẫn XPath dẫn thẳng đến thẻ chứa mã OTP bên trong nội dung email (Ví dụ: `//h1` hoặc `//span[@id="otp"]`).
     * *Code element attribute*: Điền từ khóa `text` nếu mã OTP nằm trực tiếp giữa hai thẻ (Ví dụ: `<h1>ABCDEF</h1>` ➔ Điền `text`). Hoặc điền *Tên thuộc tính* nếu mã OTP nằm ẩn trong thuộc tính của thẻ (Ví dụ: `<h1 code="ABCDEF"></h1>` ➔ Điền `code`).
  3. Full (Cả nội dung Email): Tùy chọn nâng cao cho phép hệ thống bốc toàn bộ mã nguồn văn bản/HTML của toàn bộ email trả về gán vào biến. Từ đó, bạn có thể truyền biến này qua hành động Regex hoặc Execute JS code để tự viết thuật toán bóc tách linh hoạt theo ý muốn (Phù hợp cho các loại mail có cấu trúc OTP siêu phức tạp).
* Output variable: Tên biến lưu lại chuỗi mã xác thực (hoặc nội dung toàn bộ email) sau khi lấy thành công để truyền vào hành động nhập liệu tiếp theo.

#### Hướng dẫn cách Bật Xác minh 2 bước (2FA) và Lấy Mật khẩu ứng dụng (App Password) cho Gmail

Để bảo mật, Google chặn tất cả các ứng dụng bên thứ ba kết nối trực tiếp vào hộp thư bằng mật khẩu gốc. Bạn bắt buộc phải thực hiện quy trình sau để cấp quyền cho GPM Automate truy cập IMAP:

**1. Bật xác minh 2 bước (2FA) cho tài khoản Google**

1. Đăng nhập vào tài khoản Google của bạn, truy cập trang quản lý tài khoản tại: <https://myaccount.google.com>.
2. Tại thanh thực đơn bên trái, chọn mục Bảo mật (Security).
3. Cuộn xuống phần *"Cách bạn đăng nhập vào Google"*, tìm mục Xác minh 2 bước (2-Step Verification). Nếu đang ở trạng thái *Tắt*, hãy nhấp chọn và làm theo hướng dẫn (liên kết số điện thoại hoặc app xác thực) để chuyển nó sang trạng thái Bật.

**2. Tạo và lấy Mật khẩu ứng dụng (App Password)**

1. Sau khi đã bật thành công Xác minh 2 bước, bạn truy cập phần Mật khẩu ứng dụng (App password) tại đây: <https://myaccount.google.com/apppasswords>.
2. Ô Tên ứng dụng (App name) hiện ra, bạn nhập một tên bất kỳ để ghi nhớ (Ví dụ: `GPM_Automate`) rồi nhấn nút Tạo (Create).
3. Một cửa sổ nhỏ hiện lên chứa một đoạn mã chữ gồm 16 ký tự màu vàng (Ví dụ: `abcd efgh ijkl mnop`).
4. Bạn hãy copy toàn bộ 16 ký tự này (xóa các khoảng trắng nếu có) và dán trực tiếp vào ô Password trong cấu hình hành động *Read mail code* của GPM Automate.

*(Lưu ý: Đối với tài khoản Outlook/Hotmail, bạn thực hiện quy trình tương tự trong mục Settings > Security > Advanced security options > App passwords để lấy chuỗi mật khẩu 16 ký tự tương ứng).*

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5d173de3e9377ecd2c273802bbee4f8b5373eb58%2Fimage%20(177).png?alt=media" alt=""><figcaption></figcaption></figure>


# Read outlook (Oauth2)

Read outlook (OAuth2) là hành động nâng cao chuyên biệt dùng để đọc mã xác thực (OTP) từ các tài khoản thuộc hệ sinh thái Microsoft (Outlook, Hotmail, Live...). Khác với phương thức IMAP truyền thống dễ bị Microsoft quét block hoặc bắt xác minh danh tính, hành động này sử dụng giao thức OAuth2 (thông qua Refresh Token và Client ID). Đây là cơ chế kết nối chính thống, có độ bảo mật cao, cực kỳ ổn định và hạn chế tối đa tình trạng tài khoản bị checkpoint khi chạy số lượng lớn (mass).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/c9384x0uWiI).

#### Giải thích chi tiết các thông số cấu hình:

* Email|Pass|Refresh token|Client ID: Ô nhập thông tin tài khoản cần đọc mã xác thực. Hiện nay khi mua tài khoản Outlook/Hotmail từ các trang web cung cấp nguyên liệu MMO, bạn thường được bàn giao cấu trúc định dạng gồm 4 thông tin ngăn cách bởi dấu gạch đứng `|`. Bạn cần điền vào ô này theo đúng quy chuẩn sau: `Email|Refresh token|Client ID.`
* Email sent to contains: Từ khóa hoặc địa chỉ email gửi đến có chứa cụm từ đó để hệ thống lọc chính xác thư cần tìm.
  * *Ví dụ*: Bạn cần lấy mã OTP từ email do TikTok gửi về có địa chỉ là `noreply@tiktok.com`, hãy điền chính xác `noreply@tiktok.com` (hoặc cụm từ phân biệt như `noreply@tiktok`) vào mục này.
* Proxy: Tùy chọn cấu hình địa chỉ IP để gửi yêu cầu kết nối đến máy chủ Microsoft nhằm tránh trùng lặp IP khi check mail hàng loạt. Bạn có thể thiết lập:
  * *Để trống*: Sử dụng mạng gốc của máy tính đang chạy.
  * *Điền biến `$profileProxy`*: Hệ thống tự bốc Proxy đang gán riêng cho Profile GPM hiện tại để dùng.
  * *Tự điền proxy*: Nhập trực tiếp chuỗi Proxy chỉ định theo dạng `ip:port` hoặc `ip:port:user:pass`.
* Code type: Định dạng cấu trúc của mã OTP cần hệ thống trích xuất từ nội dung thư. Gồm 3 tùy chọn:
  1. Number (Kiểu số): Dùng khi mã OTP gửi về hoàn toàn là các con số liên tiếp.
     * *Code Length*: Độ dài của chuỗi OTP cần đọc (Ví dụ mã gửi về là `475997` ➔ Điền Code length là `6`).
  2. Text (Kiểu chữ): Dùng khi mã OTP chứa cả chữ và số, hoặc nằm ẩn trong cấu trúc thẻ HTML của email.
     * *Code element xpath*: Đường dẫn XPath dẫn thẳng đến phần tử chứa mã OTP cần lấy trong nội dung email.
     * *Code element attribute*: Điền chữ `text` nếu mã OTP là nội dung nằm giữa hai thẻ (Ví dụ: `<h1>ABCDEF</h1>` ➔ Điền `text`). Hoặc điền *Tên thuộc tính* nếu mã OTP là giá trị nằm bên trong thuộc tính của thẻ (Ví dụ: `<h1 @code="ABCDEF"></h1>` ➔ Điền `code`).
  3. Full (Cả nội dung Email): Tùy chọn nâng cao giúp bốc toàn bộ mã nguồn văn bản hoặc mã HTML của email trả về gán vào biến đầu ra. Sau đó, bạn có thể truyền biến này qua hành động Regex hoặc Execute JS code để tự viết quy luật bóc tách linh hoạt theo nhu cầu riêng.
* Output variable: Tên biến đầu ra dùng để lưu chuỗi mã OTP (hoặc toàn bộ nội dung email tùy thuộc vào cấu hình *Code type*) phục vụ cho các hành động nhập liệu tiếp theo trong kịch bản.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-18b320996c8dba048843b0d7a114a99b7c3a0478%2Fimage%20(178).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🧭Navigation


# New tab

New tab là hành động điều khiển trình duyệt tự động mở thêm một thẻ (tab) trống mới trong Profile đang chạy, tương tự như việc bạn nhấn vào dấu cộng `+` trên thanh tab của trình duyệt.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Ví dụ thực tế: Mở thêm tab mới để chạy song song tác vụ

Khi bạn đang thực hiện cào dữ liệu trên một website ở tab hiện tại, nhưng cần mở thêm một trang web khác (ví dụ: trang check mail hoặc trang lấy ví crypto) để lấy thông tin phối hợp mà không muốn làm gián đoạn trang cũ:

* Cách cấu hình: Kéo hành động New tab vào luồng.


# Active tab

Hành động này giúp tool chuyển sang một tab khác đang mở trên trình duyệt.

Giúp bạn làm việc đa nhiệm dễ dàng. Ví dụ: bạn đang ở tab A để lấy dữ liệu, sau đó dùng lệnh này để chuyển sang tab B rồi dán dữ liệu vào đó.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

### Lưu Ý Quan Trọng

Sau khi chuyển, mọi thao tác tiếp theo (click, nhập liệu, cào dữ liệu) của tool sẽ chỉ chạy trên tab mới được chọn này.

### Tham Số Cấu Hình

* Type: Chọn phương thức để hệ thống xác định tab cần chuyển đổi:
  * By Index: Chuyển tab dựa theo số thứ tự vị trí (tính từ trái qua phải, bắt đầu từ số 0).
  * By Prefix URL: Chuyển tab dựa theo phần đầu của địa chỉ đường dẫn (URL). Hệ thống sẽ quét qua các tab đang mở, tab nào có URL bắt đầu bằng chuỗi ký tự bạn điền vào thì sẽ được kích hoạt lên.

#### 💡 Lời Khuyên Cho Người Dùng

Khi sử dụng tính năng chuyển tab, bạn nên ưu tiên chọn phương thức **By Prefix URL**.

Lý do là vì thứ tự tab (Index) có thể thay đổi không theo quy luật do cơ chế trả về từ Remote Port, dẫn đến việc dùng số thứ tự có thể không chính xác và làm gián đoạn kịch bản. Việc dùng Prefix URL sẽ đảm bảo tool luôn tìm đúng tab cần thiết bất kể vị trí của nó trên trình duyệt.

*Mẹo nhỏ: Sau khi trình duyệt bật lên các cửa sổ liên kết dạng popup (như cửa sổ đăng nhập Google, ví MetaMask...), bạn chỉ cần gọi hành động Active Tab với chỉ số 0 để quay trở về màn hình trình duyệt chính một cách nhanh chóng.*

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-d6118316de7c7ef56e7b61745c1dd9d9b3805eda%2Fimage%20(179).png?alt=media" alt=""><figcaption></figcaption></figure>


# Close tab

Close tab là hành động ra lệnh cho trình duyệt lập tức tắt thẻ (tab) hiện tại đang được kích hoạt (active). Hành động này không có bất kỳ tham số cấu hình nào kèm theo.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Ví dụ thực tế: Dọn dẹp màn hình sau khi hoàn thành tác vụ phụ

Khi bạn mở một tab phụ để lấy mã xác thực từ email hoặc lấy thông tin ví điện tử, sau khi đã copy được dữ liệu mong muốn về biến, bạn cần đóng tab đó đi để giải phóng bộ nhớ RAM và giữ cho giao diện trình duyệt gọn gàng:

* Luồng xử lý:
  1. Thao tác lấy mã OTP tại tab phụ thành công.
  2. Kéo hành động Close tab vào kịch bản.
  3. Gọi hành động Active tab (với index = `0`) để đưa quyền điều khiển quay trở lại tab làm việc chính.


# Close all tab

Close all tab là hành động ra lệnh cho trình duyệt tiến hành dọn dẹp và tắt hàng loạt các thẻ đang mở, chỉ giữ lại duy nhất thẻ đầu tiên (tab có index = `0`) trên thanh điều hướng. Hành động này không có tham số cấu hình nào kèm theo.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Ví dụ thực tế: Reset trình duyệt trước khi chuyển tài khoản hoặc kết thúc luồng

Trong quá trình chạy automation, kịch bản của bạn có thể mở ra rất nhiều tab phụ do nhấn vào các đường link quảng cáo, popup hoặc các trang check mail, check ví. Việc để quá nhiều tab chạy ngầm sẽ làm ngốn tài nguyên RAM của máy tính và khiến các luồng chạy sau dễ bị nhầm lẫn giao diện.

* Cách áp dụng: Đặt hành động Close all tab ở cuối kịch bản (trước khối lệnh đóng trình duyệt hoàn toàn) hoặc ở đầu kịch bản để đảm bảo trình duyệt luôn ở trạng thái sạch sẽ nhất trước khi bắt đầu một chu trình làm việc mới.


# Go to URL

Hành động này ra lệnh cho trình duyệt đi thẳng đến một trang web theo đường dẫn (URL) mà bạn đã chỉ định.

* Tác dụng: Đây là bước khởi đầu để tool bắt đầu làm việc. Bạn chỉ cần nhập địa chỉ trang web vào, trình duyệt sẽ tự động vào trang đó để bạn thực hiện các bước tiếp theo.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Tham số cấu hình:

* URL: Địa chỉ chính xác của trang web bạn muốn mở.

  > ⚠️ Lưu ý bắt buộc: Đường dẫn điền vào ô này phải có đầy đủ giao thức mạng là `https://` hoặc `http://` ở đầu (Ví dụ: `https://24h.com.vn`). Nếu bạn chỉ điền dạng vắn tắt là `24h.com.vn`, hệ thống sẽ không nhận diện được cấu trúc định tuyến và báo lỗi hành động.
* Timeout (s): Thời gian giới hạn (tính bằng giây) mà kịch bản sẽ chờ đợi để trang web tải xong toàn bộ dữ liệu. Mặc định của hệ thống nếu bạn để trống là `60` giây.

#### Ví dụ thực tế: Điều chỉnh thời gian chờ khi sử dụng Proxy chậm

Khi bạn chạy kịch bản Marketing hoặc cào dữ liệu qua các Profile có gắn Proxy, đôi khi gặp phải những gói Proxy có tốc độ kết nối rất chậm, thời gian phản hồi lâu hoặc máy chủ của trang web mục tiêu đang bị nghẽn mạng. Nếu giữ nguyên thời gian mặc định, kịch bản có thể bị ngắt kết nối giữa chừng do quá hạn:

* Cách cấu hình:
  * URL: `https://pinterest.com`
  * Timeout: Thay đổi từ `60` lên `120` (2 phút).
* Kết quả: Trình duyệt sẽ kiên nhẫn chờ đợi tối đa lên tới 120 giây để trang web kịp tải dữ liệu xong. Ngược lại, nếu mạng của bạn rất khỏe và bạn muốn tối ưu tốc độ để kịch bản không bị treo khi gặp trang web chết (die), bạn có thể chủ động giảm con số này xuống còn `20` hoặc `30` giây để hệ thống ngắt luồng lỗi nhanh hơn và chuyển sang tài khoản khác.


# Back URL

Back URL là hành động ra lệnh cho trình duyệt quay trở lại trang web vừa truy cập trước đó trong lịch sử duyệt web, tương tự như việc bạn nhấn vào nút mũi tên quay lại (Back) ở góc trên cùng bên trái của trình duyệt Chrome hoặc Firefox. Hành động này hoạt động tự động và không có bất kỳ tham số cấu hình nào kèm theo.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Ví dụ thực tế: Quay lại danh sách sản phẩm sau khi kiểm tra chi tiết

Khi bạn làm kịch bản cào dữ liệu hoặc tương tác tăng tương tác (buff follow/like), luồng chạy thông thường sẽ là: từ trang danh sách tổng hợp, bạn click vào một liên kết chi tiết để kiểm tra thông tin hoặc nhấn nút follow. Sau khi hoàn thành tác vụ tại trang chi tiết đó, thay vì phải dùng hành động Go to URL để gõ lại địa chỉ trang danh sách từ đầu (làm trang web phải tải lại toàn bộ dữ liệu từ máy chủ rất tốn thời gian):

* Cách áp dụng: Bạn chỉ cần chèn hành động Back URL.
* Kết quả: Trình duyệt lập tức lùi lại một bước về trang danh sách trước đó ngay tức thì, giúp kịch bản chạy mượt mà, tiết kiệm băng thông mạng và tối ưu tốc độ xử lý luồng.


# Reload

Reload là hành động ra lệnh cho trình duyệt tiến hành làm mới và tải lại toàn bộ nội dung của trang web hiện tại, tương tự như việc bạn nhấn vào nút mũi tên vòng tròn (F5) trên trình duyệt. Hành động này hoạt động tự động và không có bất kỳ tham số cấu hình nào kèm theo.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Ví dụ thực tế: Xử lý sự cố khi trang web bị lỗi hoặc mất kết nối tạm thời

Trong quá trình chạy automation, đôi khi bạn sẽ gặp phải tình trạng trang web bị lỗi hiển thị, bảng popup bị đơ không tắt được, hoặc mạng bị nghẽn khiến một vài thành phần (element) trên giao diện không thể tải ra.

* Cách áp dụng: Kết hợp khối lệnh điều kiện If với hành động Wait element hoặc Image exists. Nếu sau một khoảng thời gian nhất định không tìm thấy phần tử mục tiêu (trang web bị lỗi), bạn cho kịch bản gọi hành động Reload.
* Kết quả: Trình duyệt sẽ nạp lại dữ liệu của trang từ đầu để sửa các lỗi hiển thị tạm thời, giúp kịch bản tự vượt lỗi và tiếp tục vận hành mà không bị dừng luồng đột ngột.


# Get URL

Get URL là hành động dùng để trích xuất toàn bộ đường dẫn địa chỉ (URL) của trang web hiện tại đang mở trên trình duyệt và lưu vào một biến số.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Tham số cấu hình:

* Output variable: Tên biến số do bạn tự đặt để lưu lại chuỗi địa chỉ trang web sau khi bóc tách thành công.

#### Ví dụ thực tế: Kiểm tra trạng thái chuyển hướng sau khi đăng nhập thành công

Khi bạn làm kịch bản tự động đăng nhập (Login) vào một nền tảng nào đó (ví dụ như Pinterest hoặc Facebook). Sau khi điền thông tin và bấm nút đăng nhập, bạn muốn kiểm tra xem tài khoản đã vào được trang chủ thành công hay bị chuyển hướng sang trang báo lỗi/bắt xác minh danh tính (Checkpoint):

* Cách cấu hình:
  * Đợi một vài giây sau khi bấm nút đăng nhập, gọi hành động Get URL.
  * Output variable: Đặt tên biến là `currentLink`.
  * Kết hợp chèn khối lệnh điều kiện If phía sau để kiểm tra dữ liệu của biến `$currentLink`:
    * *Trường hợp 1*: Nếu biến `$currentLink` chứa cụm từ `checkpoint` hoặc `login_error` ➔ Kịch bản nhận diện tài khoản lỗi và xử lý dừng luồng.
    * *Trường hợp 2*: Nếu biến `$currentLink` chứa cụm từ `home` hoặc dữ liệu chuyển sang trang cá nhân ➔ Kịch bản nhận diện đăng nhập thành công và chạy tiếp các tác vụ nuôi tài khoản.


# Wait URL Changed

Wait URL Changed là hành động ra lệnh cho kịch bản tạm dừng lại và liên tục theo dõi thanh địa chỉ của trình duyệt cho đến khi đường dẫn (URL) hiện tại chuyển sang một địa chỉ mới, hoặc hệ thống sẽ tự động bỏ qua khi hết thời gian giới hạn (Timeout) được chỉ định.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/a9qNt96X1SM).

#### Tham số cấu hình:

* Timeout (s): Thời gian giới hạn tối đa (tính bằng giây) để hệ thống ngồi chờ URL thay đổi. Nếu quá thời gian này mà URL vẫn giữ nguyên, kịch bản sẽ tự động chuyển sang hành động tiếp theo.

#### Ví dụ thực tế: Chờ xử lý cổng thanh toán hoặc xác thực chuyển hướng thành công

Hành động này cực kỳ hữu ích khi bạn thiết lập các luồng đăng nhập bằng bên thứ ba (như bấm *Continue with Google* trên Pinterest), hoặc khi bạn nhấn nút "Thanh toán/Mua ngay" trên các trang thương mại điện tử:

* Cách cấu hình: Ngay sau hành động click vào nút kích hoạt chuyển hướng, bạn chèn hành động Wait URL Changed với Timeout là `30` (30 giây).
* Logic vận hành: Thay vì bạn phải dùng lệnh cố định như Delay 5-10 giây một cách cảm tính (gây lãng phí thời gian nếu mạng khỏe, hoặc bị lỗi click hụt nếu mạng yếu), hệ thống sẽ chủ động quan sát thanh địa chỉ. Ngay khi Pinterest chuyển hướng thành công từ trang đăng nhập về trang chủ (`pinterest.com/home`), kịch bản sẽ lập tức chạy tiếp các bước tương tác phía sau ngay mà không cần đợi hết 30 giây.


# 🎯Element


# Wait element

Hành động này giúp tool tạm dừng và "canh" đến khi nào một thành phần trên trang web (như nút bấm, ô nhập liệu) xuất hiện thì mới làm việc tiếp. Nếu quá thời gian chờ mà chưa thấy, tool sẽ tự bỏ qua.

* Tác dụng: Giúp tool chạy "nhịp nhàng" với tốc độ tải của web. Thay vì phải dùng lệnh chờ cố định (Delay) làm mất thời gian, lệnh này giúp kịch bản chạy nhanh nhất có thể và tránh được lỗi không tìm thấy phần tử do web tải chậm.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/AwlJt1TG80U).

#### Tham số cấu hình:

* Element XPath: Đường dẫn mã định danh (XPath) của phần tử bạn cần chờ đợi trên giao diện trang web (Ví dụ: `//button[@type="submit"]`).
* Timeout (s): Thời gian giới hạn tối đa (tính bằng giây) để hệ thống ngồi chờ phần tử xuất hiện. Nếu quá thời gian này mà phần tử vẫn chưa tải ra, kịch bản sẽ tự động chuyển sang hành động tiếp theo trong luồng.

#### Ví dụ thực tế: Chờ nút "Đăng bài" sẵn sàng sau khi tải ảnh lên

Khi bạn làm kịch bản tự động đăng bài (Post bài) lên mạng xã hội. Sau khi bạn chọn tệp ảnh và nhấn tải lên, hệ thống trang web cần một khoảng thời gian để xử lý và render hình ảnh đó lên server. Nút "Đăng bài" thường sẽ bị mờ (Disabled) hoặc chưa xuất hiện cho đến khi ảnh tải xong hoàn toàn.

* Cách cấu hình: Ngay sau hành động tải ảnh, bạn chèn hành động Wait element.
  * Element XPath: Nhập XPath của nút đăng bài, ví dụ: `//span[text()="Đăng bài"]/ancestor::button`.
  * Timeout: Đặt `20` (20 giây).
* Logic vận hành: Hệ thống sẽ liên tục kiểm tra trang web. Nếu mạng khỏe và ảnh tải xong trong 2 giây, nút bấm xuất hiện, kịch bản sẽ lập tức chạy lệnh click để đăng bài ngay (tiết kiệm được 18 giây chờ vô ích). Nếu mạng yếu, hệ thống sẽ kiên nhẫn đợi tối đa đến 20 giây để tránh bị lỗi hụt luồng.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-af8567927223de2c30d4d25177225599e90f0777%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>


# Get element attribute

Hành động này giúp bạn "bóc tách" những thông tin ẩn bên trong một phần tử trên trang web và lưu nó vào một biến để dùng sau.

* Tác dụng: Ví dụ, bạn có thể lấy đường dẫn ảnh từ thuộc tính `src`, hoặc lấy link từ thuộc tính `href` của một thẻ liên kết, hay lấy giá trị nhập trong ô `value`.
* Cách hiểu đơn giản: Mỗi thành phần trên web đều có những "thuộc tính" đi kèm (như cái nhãn dán thông tin). Lệnh này giúp bạn đọc và "chép" thông tin từ cái nhãn đó ra để lưu lại.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/AwlJt1TG80U).

#### Giải thích các tham số cấu hình:

* Element XPath: Đường dẫn mã định danh (XPath) của phần tử chứa thuộc tính cần lấy trên giao diện trang web.
* Attribute name: Tên của thuộc tính mà bạn muốn bốc tách dữ liệu.
  * *Ví dụ cấu trúc*: `<thẻ tên_thuộc_tính="giá_trị_thuộc_tính">Văn bản</thẻ>` ➔ Bạn chỉ cần điền `tên_thuộc_tính` vào ô này để lấy ra `giá_trị_thuộc_tính`.
* Output variable: Tên biến số để lưu lại chuỗi giá trị thuộc tính sau khi lấy thành công.

#### Ví dụ thực tế: Cào link ảnh sản phẩm dựa trên hình ảnh thực tế (Hình 5)

Dựa trên giao diện trang web cửa hàng điện thoại mà bạn đang thao tác trong hình, bạn muốn cào (scrape) đường dẫn hình ảnh của chiếc điện thoại Samsung galaxy s6 để phục vụ cho việc lưu trữ dữ liệu hoặc đăng tải tự động lên shop của mình.

Nhìn vào bảng mã nguồn HTML (khung đỏ bên phải hình):

> Cấu trúc thẻ ảnh: `<img class="card-img-top img-fluid" src="imgs/galaxy_s6.jpg" alt="">`

Để lấy được chuỗi đường dẫn ảnh `imgs/galaxy_s6.jpg`, bạn sẽ cấu hình hành động như sau:

* Element XPath: Nhập chính xác đường dẫn XPath đang chỉ vào thẻ ảnh đó, ví dụ: `//div[@class="card h-100"]/a/img` (hoặc dùng cú pháp như trong hình của bạn: `//div[@class='card h-100']//img`).
* Attribute name: Điền chữ `src` *(Đây là tên thuộc tính chứa đường dẫn tệp tin của hình ảnh)*.
* Output variable: Đặt tên biến đầu ra là `imgUrl`.

Kết quả: Hệ thống sẽ tìm đến thẻ ảnh của Samsung Galaxy S6, bóc tách chuỗi giá trị nằm trong thuộc tính `src` và nạp thẳng giá trị `imgs/galaxy_s6.jpg` vào biến `$imgUrl`. Bạn có thể sử dụng biến này cho các hành động tải ảnh hoặc lưu trữ ở phía sau.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-e877c15fe9231f74f2294d70b893a3cd40c9e791%2Fimage%20(181).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-d45458808ef60dfcb6c31a4ec0ac80d3f55932c4%2Fimage%20(182).png?alt=media" alt=""><figcaption></figcaption></figure>


# Get element text

Hành động này giúp tool "đọc" và lấy toàn bộ chữ hiển thị trên một phần tử (như nội dung bài viết, tiêu đề, giá tiền, hay tên tài khoản) rồi lưu vào một biến để bạn sử dụng.

* Tác dụng: Dùng khi bạn cần cào dữ liệu văn bản từ website. Bạn chỉ cần chỉ định đúng vị trí (element), tool sẽ tự động bóc tách phần chữ đang hiển thị trên giao diện ra cho bạn.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/AwlJt1TG80U).

#### Giải thích các tham số cấu hình:

* XPath: Đường dẫn mã định danh (XPath) của phần tử chứa đoạn văn bản cần lấy trên giao diện trang web.
* Output variable: Tên biến số để lưu lại nội dung văn bản sau khi bóc tách thành công.

#### Ví dụ thực tế: Cào giá tiền của sản phẩm

Dựa trên hình ảnh giao diện cửa hàng mà bạn cung cấp, bạn muốn cào mức giá của chiếc điện thoại Samsung galaxy s6 để phục vụ việc so sánh giá hoặc đồng bộ dữ liệu lên hệ thống của mình.

Nhìn vào bảng mã nguồn HTML được khoanh đỏ bên phải hình dưới:

> Cấu trúc thẻ chứa giá tiền: `<h5>$360</h5>`

Để lấy được chuỗi văn bản giá tiền `$360` này, bạn sẽ cấu hình hành động như sau:

* Element XPath: Nhập chính xác đường dẫn XPath đang chỉ thẳng vào thẻ chứa giá tiền của sản phẩm đó, ví dụ: `//div[@class='card h-100']//h5` (như ô tìm kiếm XPath bạn đã kiểm tra thành công trong hình).
* Output variable: Đặt tên biến đầu ra là `productPrice`.

Kết quả: Hệ thống sẽ tìm đến thẻ `<h5>` tương ứng của sản phẩm, bóc tách phần văn bản thuần nằm ở giữa thẻ và nạp thẳng giá trị `$360` vào biến `$productPrice`. Ở các bước sau, bạn có thể gọi biến này ra để ghi vào file Excel hoặc gửi lên dữ liệu hệ thống.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-7fe575eaccefb98c54ebf12980fc5764eea6f96f%2Fimage%20(183).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-f633aa3be3cabb9d43b7ab4afd84b48537f20788%2Fimage%20(184).png?alt=media" alt=""><figcaption></figcaption></figure>


# Count element

Hành động này giúp tool quét trên trang web xem có bao nhiêu mục khớp với cái "tên" (XPath) mà bạn đã cung cấp, sau đó lưu con số tổng cộng đó vào một biến.

* Tác dụng: Rất hữu ích khi bạn muốn kiểm tra số lượng sản phẩm đang hiển thị, đếm số comment, hay kiểm tra xem một danh sách đã tải đủ dữ liệu chưa. Nếu đếm được 0 thì tức là không thấy mục nào, nếu đếm được nhiều hơn 0 thì bạn có thể dùng các vòng lặp để xử lý lần lượt từng mục đó.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/AwlJt1TG80U).

#### Giải thích các tham số cấu hình:

* XPath: Đường dẫn mã định danh (XPath) của tập hợp các phần tử bạn muốn đếm số lượng trên giao diện trang web.
* Output variable: Tên biến số để lưu lại kết quả số lượng đếm được (Trả về một số nguyên: `0`, `1`, `2`, `3`,...).

#### Ví dụ thực tế: Đếm tổng số sản phẩm đang hiển thị trên trang cửa hàng

Khi bạn truy cập vào trang cửa hàng điện thoại như trong hình, bạn muốn kịch bản tự động kiểm tra xem trên trang hiện tại đang hiển thị bao nhiêu sản phẩm để thiết lập số vòng lặp tương tác hoặc cào dữ liệu cho chính xác:

Nhìn vào cấu trúc mã nguồn, mỗi một ô sản phẩm đều nằm chung trong một khối thẻ `div` có thuộc tính `class="card h-100"`. Bạn cấu hình hành động như sau:

* Element XPath: Nhập đường dẫn XPath chung của các ô sản phẩm: `//div[@class="card h-100"]`
* Output variable: Đặt tên biến đầu ra là `totalProducts`.

Kết quả: Hệ thống sẽ quét toàn bộ trang web và đếm xem có bao nhiêu thẻ khớp với XPath trên. Ví dụ trên màn hình hiển thị 9 sản phẩm, biến `$totalProducts` sẽ nhận giá trị là `9`.

> 💡 Ứng dụng nâng cao: Bạn có thể sử dụng biến số lượng này để truyền vào cấu hình của vòng lặp For, giúp kịch bản tự động lặp đúng `9` lần để click xem chi tiết hoặc cào đủ thông tin của cả 9 sản phẩm mà không bị thừa hay thiếu sót.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-a8e58c7e4b488e625b1251aa6f5ea4d3ba57550d%2Fimage%20(186).png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-793128dd933faa13db880f95bc39e02a7f6c814b%2Fimage%20(187).png?alt=media" alt=""><figcaption></figcaption></figure>


# 🖱️Mouse


# Mouse click

Click chuột vào một element.

Mouse click là hành động điều khiển con trỏ chuột thực hiện lệnh bấm (click) vào một vị trí cụ thể trên màn hình. Để tối ưu cho từng tình huống tương tác giao diện khác nhau, GPM Automate cung cấp cho bạn 3 tùy chọn thiết lập linh hoạt:

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/kQZWs1I76Zo).

#### 3 kiểu lựa chọn click chuột tương thích mọi giao diện

**1. Click dựa theo XPath (Mặc định cho giao diện Web)**

* Cách hoạt động: Bạn điền đường dẫn mã định danh (XPath) của phần tử trên trang web (ví dụ: `//button[@id="submit"]`). Hệ thống sẽ tự động tìm kiếm thẻ HTML này, tính toán vị trí của nó trên trình duyệt và đưa chuột đến bấm chính xác.
* Ứng dụng: Dùng cho cấu trúc trang web thông thường, các nút bấm cố định có thẻ mã nguồn rõ ràng.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-4e5037f37feed6ab72ce6d87be13c5fa9f0ac378%2Fimage%20(190).png?alt=media" alt=""><figcaption></figcaption></figure>

**2. Click dựa theo vị trí hiện tại của con trỏ chuột**

* Cách hoạt động: Hệ thống không dịch chuyển chuột đi đâu cả, mà sẽ thực hiện lệnh bấm ngay tại đúng điểm mà con trỏ chuột đang đứng im từ hành động trước đó (như sau lệnh Mouse move hoặc Random scroll).
* Ứng dụng: Dùng khi bạn đã có một chuỗi hành động di chuyển chuột dò đường phức tạp trước đó và chỉ cần ra lệnh click để kích hoạt.

**3. Click dựa theo tọa độ (Kết hợp hoàn hảo với Image search)**

* Cách hoạt động: Bạn nhập trực tiếp vị trí điểm ảnh theo trục ngang `X` và trục dọc `Y` (Pixel) trên màn hình để chuột nhảy đến bấm.
* Tối ưu kết hợp: Kiểu click này thường được kết hợp chung với hành động Image search. Khi *Image search* tìm thấy ảnh mục tiêu, nó sẽ trả về một biến tọa độ gộp (ví dụ tên biến mặc định là `pos`) dưới dạng chuỗi văn bản chứa cả trục X và Y ngăn cách bằng dấu phẩy: `900,800`.
* Cách cấu hình: Tại ô nhập tọa độ của hành động *Mouse click*, bạn chỉ cần truyền trực tiếp biến gộp `$pos` vào. Hệ thống thông minh của GPM Automate sẽ tự động bóc tách cú pháp `900,800` này ra để đưa chuột đến tọa độ x=900, y=800 để click thẳng vào mục tiêu.
* Ứng dụng: Dùng để click vào các phần tử nằm trong Canvas (game), các nút bấm nằm ẩn sâu trong Iframe bảo mật, hoặc tương tác với các thành phần không có thẻ XPath cố định.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-5f5c0ebf508069d07a022b5c7f6f16cd6a7dcf34%2Fimage%20(191).png?alt=media" alt=""><figcaption></figcaption></figure>


# Mouse try to click

Mouse try to click là hành động nâng cao của nhóm lệnh chuột, cho phép kịch bản thực hiện thao tác nhấp chuột lặp đi lặp lại nhiều lần vào một mục tiêu cho đến khi thỏa mãn một điều kiện mong muốn thì mới dừng lại.

Hành động này là giải pháp hoàn hảo để xử lý các nút bấm "cứng đầu" trên website (loại nút bấm đôi khi bị lag, cần phải click mồi vài lần mới ăn lệnh), hoặc dùng để săn (spam) các nút nhận thưởng, nút mở hộp quà xuất hiện trong thời gian ngắn.

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/kQZWs1I76Zo).

#### Các tham số cấu hình cốt lõi:

* Click type: Tương tự như hành động Mouse click, bạn cũng có 3 kiểu lựa chọn để chỉ định vị trí bấm chuột:
  1. *Click dựa theo XPath*: Hệ thống tìm thẻ HTML của phần tử để nhấp vào.
  2. *Click dựa theo vị trí hiện tại của con trỏ chuột*: Nhấp liên tục tại điểm con trỏ chuột đang đứng im.
  3. *Click dựa theo tọa độ*: Nhấp vào điểm ảnh cố định hoặc truyền biến gộp tọa độ dạng `900,800` (kết hợp từ kết quả của hành động *Image search*).
* Number of tries: Số lần click thử tối đa mà kịch bản được phép thực hiện (Ví dụ điền `10`, hệ thống sẽ click tối đa 10 lần rồi tự động dừng luồng để chuyển sang hành động tiếp theo, tránh việc bị treo kịch bản vô hạn).
* Delay each clicks (s): Thời gian giãn cách giữa 2 lần click liên tiếp, tính bằng giây (Ví dụ điền `0.5` hoặc `1` giây để chuột không bị bấm quá nhanh khiến hệ thống hiểu nhầm là spam/DDoS).
* Stop condition: Điều kiện để hệ thống ra lệnh dừng click lập tức. Chuột sẽ nhấp liên tục cho đến khi điều kiện này được thỏa mãn HOẶC khi đã bấm đủ số lần quy định ở mục *Number of tries*.

#### Ví dụ thực tế: Click liên tục vào nút "Nhận mã OTP" cho đến khi bảng nhập mã xuất hiện

Khi bạn thực hiện đăng ký tài khoản trên các website có hệ thống tải chậm, khi bấm vào nút "Gửi mã" (Send Code), hệ thống có thể bị nghẽn và không phản hồi ngay. Bạn cần chuột phải click liên tục cho đến khi một ô nhập mã OTP xuất hiện trên màn hình thì mới dừng lại.

* Cách cấu hình:
  * Click type: Chọn *Click dựa theo XPath* ➔ Nhập XPath của nút gửi mã: `//button[@id="send-code"]`.
  * Number of tries: Điền `5` (thử tối đa 5 lần).
  * Delay each clicks: Điền `2` (mỗi lần click cách nhau 2 giây để chờ trang web xử lý).
  * Stop condition: Sử dụng hàm kiểm tra phần tử xuất hiện: `hasElement(//input[@id="otp-input"])`.

Logic vận hành: Hệ thống đưa chuột đến nút gửi mã và click lần 1. Sau 2 giây, hệ thống kiểm tra xem ô nhập mã OTP (`//input[@id="otp-input"]`) đã xuất hiện chưa. Nếu chưa có, hệ thống tiếp tục click lần 2, lần 3... Ngay khi click đến lần thứ 3, hệ thống phản hồi và ô nhập mã OTP hiện ra trên màn hình (Hàm `hasElement` trả về giá trị đúng), kịch bản sẽ lập tức dừng hành động click này lại và chuyển sang bước tiếp theo mà không cần phải bấm nốt 2 lần còn lại.

> 💡 Mẹo mở rộng: Bạn cũng có thể dùng điều kiện phủ định `!hasElement(XPATH)` để ra lệnh cho chuột click liên tục cho đến khi một banner quảng cáo hoặc một biểu tượng vòng tròn tải trang (loading) biến mất khỏi màn hình.

<figure><img src="https://275605936-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN9cKpvJdcLU6FS8VMSTs%2Fuploads%2Fgit-blob-af5b38000755c2c5c1725743dbe9feb4f4ccc0e0%2Fimage%20(192).png?alt=media" alt=""><figcaption></figcaption></figure>


# Mouse move

### Hành động di chuyển con trỏ chuột (Mouse move)

Mouse move là hành động điều khiển con trỏ chuột di chuyển mượt mà từ vị trí hiện tại đến một điểm chỉ định trên màn hình. Hành động này giúp mô phỏng chính xác hành vi rê chuột của người dùng thật, giúp kịch bản vượt qua các hệ thống quét bot bảo mật (Anti-bot).

🎥 Xem thêm video hướng dẫn: [Tại đây](https://youtu.be/kQZWs1I76Zo).

#### Các kiểu di chuyển chuột hỗ trợ:

Hành động hỗ trợ di chuyển chuột linh hoạt theo 2 cơ chế chính:

* Di chuyển theo XPath: Bạn điền đường dẫn mã định danh (XPath) của phần tử trên trang web. Hệ thống sẽ tự động xác định vị trí của thẻ HTML đó trên giao diện và đưa con trỏ chuột đến tâm của phần tử.
* Di chuyển theo tọa độ: Bạn nhập trực tiếp điểm ảnh theo trục x,y hoặc truyền một biến gộp tọa độ (Ví dụ biến `$pos` có dạng `900,800` thu được từ hành động Image search) để điều hướng con trỏ chuột nhảy đến vị trí chính xác trên màn hình.

#### 💡 Mẹo nâng cao: Kéo và thả phần tử (Drag and Drop)

Bạn có thể kết hợp chuỗi các hành động liên tiếp để thực hiện thao tác nhấn giữ, kéo và thả một phần tử bất kỳ trên giao diện (Ví dụ: kéo thanh trượt mở khóa captcha, kéo thả các khối bento grid, hoặc di chuyển các quân cờ) theo công thức sau:

1. Mouse press and hold: Nhấn và giữ chuột trái tại vị trí phần tử bắt đầu (có thể chọn theo XPath hoặc tọa độ).
2. Mouse move: Di chuyển con trỏ chuột (kèm theo khối dữ liệu đang giữ) đến vị trí đích mới.
3. Mouse release: Thả chuột trái ra để hoàn tất việc thả phần tử vào vị trí mới.




---

[Next Page](/llms-full.txt/1)

