Cài đặt Practice App
Practice App là một ứng dụng web nhỏ đi kèm bộ tài liệu này. Nó là mục tiêu mà mọi bài học tự động hóa: một dashboard với các ô số liệu có kiểu, các nút bấm với biểu tượng đặc trưng, một popup gọi ra theo ý muốn, một danh sách cuộn được, và một thử thách thanh trượt.
Cài đặt mất khoảng năm phút, một lần duy nhất.
Vì sao cần một mục tiêu luyện tập
Bài học automation cần một màn hình giống hệt nhau với mọi người đọc, mọi lần chạy. Ứng dụng thật không thể hứa điều đó — nội dung đổi từng ngày, tài khoản khác nhau, và hình ảnh có bản quyền. Practice App thì:
- Xác định — mọi giá trị đều cố định. Gold luôn là
12480, đồng hồ luôn09:45, danh sách mục tiêu luôn là mười hai dòng đó. Kết quả OCR của bạn sẽ khớp bài học từng chữ số. - Điều khiển được — popup phần thưởng chỉ xuất hiện khi bạn yêu cầu (
?popup=1), chính điều đó làm bài học phần-tử-tùy-chọn tái hiện được. - Của bạn — nó đi kèm tài liệu. Không giấy phép, không có gì thay đổi sau lưng bạn.
Bước 1 — Lấy các tệp
Ứng dụng gồm bốn tệp HTML và một stylesheet, phục vụ dưới dạng tệp tĩnh từ chính site tài liệu này tại /practice-app/:
| Tệp | Màn hình |
|---|---|
index.html | Đăng nhập |
dashboard.html | Dashboard với bốn ô số liệu |
targets.html | Danh sách mục tiêu cuộn được |
verify.html | Thử thách thanh trượt |
Nếu bạn đọc tài liệu từ site được host, tải thư mục từ /practice-app/. Nếu bạn có repository, nó nằm tại docs-site/static/practice-app/.
Bước 2 — Chạy server trên PC
Bất kỳ static file server nào cũng được. Với Python (đã có sẵn nếu máy bạn có bộ công cụ của ứng dụng):
python -m http.server 8010 --bind 0.0.0.0 --directory path/to/practice-app
--bind 0.0.0.0 là điểm quan trọng: nó cho phép giả lập truy cập server, không chỉ riêng PC của bạn.
Lần đầu, cho phép cổng qua Windows Firewall (PowerShell, quyền Administrator):
powershell -Command "New-NetFirewallRule -DisplayName 'Practice App 8010' -Direction Inbound -LocalPort 8010 -Protocol TCP -Action Allow"
Bước 3 — Tìm địa chỉ LAN của PC
Giả lập truy cập PC qua địa chỉ IP trong mạng LAN, không phải localhost:
ipconfig
Tìm địa chỉ IPv4 của adapter mạng bạn đang dùng — ví dụ 192.168.1.3. (Với chế độ mạng bridged của MuMu, giả lập nằm cùng dải mạng, ví dụ 192.168.1.4.)
Bước 4 — Mở trong giả lập
Trong trình duyệt của giả lập, mở:
http://<ip-cua-pc>:8010/dashboard.html
Bạn sẽ thấy dashboard:

Nếu trang không tải được, kiểm tra kết nối từ bên trong giả lập trước — một phép thử nhanh qua ADB:
adb shell "curl -s -o /dev/null -w '%{http_code}' http://<ip-cua-pc>:8010/dashboard.html"
200 nghĩa là server và firewall ổn; vấn đề còn lại chỉ là URL bạn gõ trong trình duyệt.
Các màn hình
Dashboard
Ngôi nhà của phần lớn bài học. Bốn ô số liệu — mỗi ô một kiểu giá trị OCR — cùng bốn nút hành động và một nhật ký hoạt động:

① Gold ② Energy ③ Troops ④ Next Cycle — mỗi ô một kiểu giá trị OCR. ⑤ Thanh trạng thái: một đồng hồ và một cặp tọa độ, cả hai đều là mục tiêu regex tùy biến.
| # | Ô số liệu | Hiển thị | Kiểu OCR nó dạy |
|---|---|---|---|
| ① | Gold | 12480 | Số (Number) |
| ② | Energy | 85% | Phần trăm (Percentage) |
| ③ | Troops | 3/5 | Bộ đếm (Counter x/y) |
| ④ | Next Cycle | 04:20 | Thời gian (Time mm:ss) |
| ⑤ | Thanh trạng thái | 09:45, X:1167 Y:1120 | Regex tùy biến (Custom) |
Bốn ô số liệu, bốn kiểu giá trị khác nhau, trên cùng một màn hình — nên một mục tiêu luyện tập duy nhất phủ hết mọi kiểu nội dung mà Read Text trích được.
Popup phần thưởng
Mở dashboard.html?popup=1 và hộp thoại Daily Reward xuất hiện; không có tham số thì không hiện. Claim cộng 2500 vào ô Gold; Close đóng hộp thoại:

① Công tắc ?popup=1 trên thanh địa chỉ — toàn bộ khác biệt giữa hai trạng thái. ② Claim cộng 2500 vào Gold. ③ Close đóng lại mà không thu.
Công tắc này là trái tim của Bài 04: một flow phải xử lý đúng cả hai trạng thái.
Targets
Mười hai dòng cố định, mỗi dòng có huy hiệu hạng (A/B/C), tên, và một dãy số monospace X:1167 Y:1120 VAL:320. Danh sách cuộn được — đúng thứ mà bài luyện Swipe (Vuốt) cần — và các dãy số phục vụ OCR regex Custom:

① Dãy số của từng dòng. Ba con số trong một chuỗi chính là ca mà OCR regex Custom tồn tại để giải — xem Bài 06.
Verify
Một thử thách thanh trượt: kéo tay nắm vào khe kẻ đứt. Khe nằm ở vị trí cố định (62% chiều dài thanh), nên có thể nêu chính xác khoảng cách kéo kỳ vọng; ?gap=40 dời khe khi bạn cần một ca thứ hai:

① Tay nắm, ở đầu thanh trượt. ② Khe kẻ đứt nó phải tới. Mũi tên là cú vuốt flow của bạn thực hiện — khe cố định nghĩa là khoảng cách kéo cố định.
Ghim giá trị qua query string
Mọi giá trị đều ghim được qua query string — các bài học dùng nó để tạo đúng kịch bản cần thiết:
| Tham số | Tác dụng | Ví dụ dùng |
|---|---|---|
?popup=1 | Hiện popup phần thưởng | Bài 04 |
?gold=900 | Đặt ô Gold | Rẽ nhánh theo ngưỡng |
?energy=15% | Đặt Energy | Nhánh thiếu năng lượng ở capstone |
?troops=5/5 | Đặt bộ đếm Troops | Ca "kín chỗ" |
?timer=00:10 | Đặt đồng hồ chu kỳ | Đọc thời gian |
?clock=21:30 | Đặt đồng hồ trạng thái | Rẽ nhánh theo giờ |
?x=990&y=1040 | Đặt tọa độ | Regex Custom |
?gap=40 | Dời khe thanh trượt | Ca captcha thứ hai |
Các tham số kết hợp được: dashboard.html?popup=1&gold=900&troops=5/5.
Best practices
- Giữ server luôn chạy khi làm bài — flow sẽ trượt các bước phát hiện nếu trang biến mất.
- Bookmark URL dashboard trong trình duyệt giả lập.
- Dùng tham số ghim để tạo đúng trạng thái bài học yêu cầu, thay vì ngồi chờ nó xảy ra.
- Mở trình duyệt toàn màn hình nếu thanh công cụ che mất trang ở độ phân giải nhỏ.
Khắc phục sự cố
Giả lập không mở được trang, nhưng PC mở được.
Server đang bind vào localhost (hãy bind 0.0.0.0), thiếu rule firewall, hoặc bạn gõ localhost trong giả lập thay vì IP LAN của PC.
Giá trị hiển thị khác với bài học.
URL còn sót tham số ghim. Mở lại dashboard.html trơn.
Popup không bao giờ hiện.
Nó chỉ hiện với ?popup=1. Đó là tính năng, không phải lỗi.
OCR đọc sai lung tung. Kiểm tra độ phân giải giả lập là 1280×720 như đã thiết lập trong Cấu hình MuMu — các ô số liệu được canh cỡ cho độ phân giải đó.