Ở bài 2 chúng ta đã có thể giải quyết một số bài toán đơn giản. Ở bài này, mình sẽ hướng dẫn mọi người giải quyết bài toán phức tạp hơn.

Yêu cầu bài toán:

Viết một file macro tự động đăng nhập vào facebook bằng tài khoản có sẵn.

Hướng dẫn

1. Đầu tiên mình mở iMacros và nhấp vào nút Record để bắt đầu ghi macro mới.

2. Ở trình duyệt mở 1 tab mới, truy cập đến trang facebook.com. Tiến hành nhập tài khoản mật khẩu và đăng nhập như bình thường.

3. Sau đó mình lưu file macro vừa rồi lại để phân tích. Lúc này file sẽ có các lệnh như sau:

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
URL GOTO=fb.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:u_0_2_ME ATTR=ID:email CONTENT=demo@gmail.com
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:u_0_2_ME ATTR=ID:pass CONTENT=password
TAG POS=1 TYPE=BUTTON FORM=ID:u_0_2_ME ATTR=ID:u_0_5_QG

Có lệnh mới kìa, lạ thế. Tìm hiểu thôi !!!

Lệnh TAG

Lệnh này giúp bạn chọn một đối tượng bất kỳ trên trang web, nếu đối tượng đấy là Textbox thì có thể gán dữ liệu cho nó luôn.

Thông dụng nhất là câu lệnh này:

TAG POS=n TYPE=type [FORM=form] ATTR=attr [CONTENT=some_content]
  • POS: Thứ tự xuất hiện của phần tử cần chọn trong trang HTML.
  • TYPE: Loại HTML của phần tử cần chọn.
  • FORM: Khai báo tên form cha chứa đối tượng cần chọn.
  • ATTR: Mã định danh của phần tử được chọn
  • CONTENT: Nội dung sẽ chèn vào.

Áp dụng vào bài toán:

TAG POS=1 TYPE=INPUT:TEXT FORM=ID:u_0_2_ME ATTR=ID:email CONTENT=demo@gmail.com

=> Ý nghĩa: Chọn ô Email > khai báo dữ liệu là demo@gmail.com.

SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:u_0_2_ME ATTR=ID:pass CONTENT=password

=> Ý nghĩa: Chọn ô Mật khẩu > khai báo dữ liệu là password.

Ngoài ra có thể dùng lênh TAG theo các cấu trúc sau:

TAG XPATH="[xpath_expression]" [CONTENT=some_content]
TAG SELECTOR="[selector_expression]" [CONTENT=some_content]

Theo mình thì mọi người cứ record lại là nhanh nhất, iMacros sẽ tự bắt và điền chính xác tất cả các thông số cần thiết. Ta chỉ cần thay giá trị vào phần CONTENT là xong.

4. Tuy nhiên xem xét kỹ lại thì ID của FORM có vẻ không cố định. Để chắc thì mình record 1 file mới. Kết quả là ID ấy random thật, đây là một hình thức chống automation của fb.

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
URL GOTO=https://www.facebook.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:u_0_2_S3 ATTR=ID:email CONTENT=demo@gmail.com
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:u_0_2_S3 ATTR=ID:pass CONTENT=password
TAG POS=1 TYPE=BUTTON FORM=ID:u_0_2_S3 ATTR=ID:u_0_5_J/

Không những ID của form random mà cả ID của nút Submit cũng random luôn.

Vậy bỏ à, không. Phải tìm cách chứ. Ở các bài sau mình sẽ hướng dẫn mọi người cách để lấy được giá trị ID đấy.

Nhưng hôm nay mình tìm thấy 1 cách nhanh hơn. Đấy là sử dụng trang mbasic.facebook.com. Trang này dùng HTML thuần nên có giao diện cách đây chục năm về trước, nhưng vẫn dùng tốt.

Thử lại nào.

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
URL GOTO=mbasic.facebook.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:login_form ATTR=ID:m_login_email CONTENT=demo@gmail.com
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:login_form ATTR=NAME:pass CONTENT=password
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:login_form ATTR=NAME:login

Lúc này các thông số đã cố định rồi. Thêm lệnh WAIT vào cho nó giống người thật thao tác.

VERSION BUILD=8970419 RECORDER=FX
TAB T=1
URL GOTO=mbasic.facebook.com/
WAIT SECONDS=2
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:login_form ATTR=ID:m_login_email CONTENT=demo@gmail.com
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:login_form ATTR=NAME:pass CONTENT=password
WAIT SECONDS=2
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:login_form ATTR=NAME:login

5. Các câu lệnh trên đã có thể tự động login vào fb, nhưng nếu thời gian WAIT cứ giống nhau thế kia thì kiểu gì cũng bị phát hiện là bot. WAIT mà là random thì sẽ an toàn hơn nhiều.

Khai báo biến bằng lệnh SET

Biến là một giá trị có thể được sử dụng ở nhiều nơi.

Để khai báo biến dùng công thức sau:

SET var value
  • var: Tên biến do người dùng đặt.
  • value: Giá trị cho biến đấy

Để sử dụng thì đặt biến trong cặp dấu ngoặc

{{Tên_biến}}

Ví dụ bài toán trên chúng ta có thể sử dụng các biến delay, email, password.

VERSION BUILD=8970419 RECORDER=FX
SET delay 2
SET email "demo@gmail.com"
SET PASS "password"
TAB T=1
URL GOTO=mbasic.facebook.com/
WAIT SECONDS={{delay}}
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:login_form ATTR=ID:m_login_email CONTENT={{email}}
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:login_form ATTR=NAME:pass CONTENT={{password}}
WAIT SECONDS=2
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:login_form ATTR=NAME:login

Tạo giá trị random trong khoảng giá trị

Để tạo một giá trị ngẫu nhiên trong khoảng nhất định, bạn dùng câu lệnh sau:

EVAL("var min = 2; var max = 4; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")

Trong đó var min là giá trị bắt đầu, var max là giá trị kết thúc.

Có thể kết hợp với hàm SET để tạo 1 biến tên là delay với giá trị ngẫu nhiên từ 2 đến 4:

SET delay EVAL("var min = 2; var max = 4; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")

Lệnh PROMPT

PROMPT prompt_text [variable_name] [default_value]

Lệnh này dùng để tạo ra 1 popup thông báo trên màn hình

Nếu chỉ khai báo mình prompt_text, trình duyệt sẽ hiển thị giá trị của prompt_text lên. Nhưng nếu thêm cả giá trị [variable_name], hệ thống sẽ yêu cầu nhập giá trị cho biến đấy và tiến hành gán giá trị vào biến luôn. Nếu có giá trị mặc định thì khai báo luôn ở [default_value].

Như bài toán trên mình có thể sửa lại thành nhập giá trị các biến từ bàn phím như sau:

VERSION BUILD=8970419 RECORDER=FX
SET delay EVAL("var min = 2; var max = 4; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")
PROMPT "Hãy nhập giá trị Email" email
PROMPT "Hãy nhập giá trị Password" PASS
TAB T=1
URL GOTO=mbasic.facebook.com/
WAIT SECONDS={{delay}}
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:login_form ATTR=ID:m_login_email CONTENT={{email}}
SET !ENCRYPTION NO
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:login_form ATTR=NAME:pass CONTENT={{password}}
WAIT SECONDS=2
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:login_form ATTR=NAME:login
WAIT SECONDS=5
CLEAR

Khai báo một số biến hệ thống

Các khai báo hệ thống này bạn nên đặt ở đầu chương trình.

Khai báo USERAGENT

Để fake useragent cho phiên làm việc hiện tại bạn dùng câu lệnh sau:

SET !USERAGENT "useragent"

Trong đó useragent là thông số useragent của trình duyệt.

Khai báo thời gian TIMEOUT 

SET !TIMEOUT n

n là thời gian tối đa mà trình duyệt sẽ chờ 1 trang web load xong.

ERRORIGNORE 

Bình thường iMacro chạy lần lượt các lệnh từ trên xuống dưới, nếu gặp câu lệnh nào bị lỗi sẽ dừng lại ngay và ko chạy nữa. Nếu muốn iMacros bỏ qua lỗi đấy mà chạy tiếp thì bạn khai báo câu lệnh sau:

SET !ERRORIGNORE YES

Kết luận

Vừa rồi mình đã hướng dẫn về sử dụng biến và một số lệnh khai báo. Nếu còn thắc mắc hoặc vấn đề gì cần hỏi thì mọi người cứ reply dưới phần bình luận nhé. Mình sẽ phản hồi trong thời gian sớm nhất. Cảm ơn mọi người đã theo dõi.