Vừa qua mình có làm một game tặng ARM NB F80, mình đã viết một Tool bằng Node.js để lấy comment từ bài viết tinhte để random và chọn ra người may mắn. Hôm nay mình xin chia sẻ quá trình làm ra Tool GA.
Mình đã có chia sẻ về quá trình học lập trình tại đây:
https://tinhte.vn/thread/hoc-lap-trinh-co-kho-khong-review-qua-trinh-tu-hoc-lam-app-ios-va-dang-len-app-store.3363130/
Học lập trình có khó không? Review quá trình tự học làm App iOS và đăng lên App Store
1. Mình là ai
Mình là một thầy giáo tiếng Anh và đây là bài về mail tự động mình viết lần trước [Chia sẻ] [Mày mò lập trình và cái kết] - Mail tự động đã thay đổi việc dạy học của mình như thế nào | Tinh tế (tinhte.vn)
2.
tinhte.vn
https://tinhte.vn/thread/tinhtelookback-google-workspace-tu-dong-hoa-cong-viec-qua-ngon.3449377/
#TinhteLookBack: Google Workspace, tự động hóa công việc quá ngon
Đã 1 năm mình không cài Microsoft Office và chuyển hẳn sang Google Workspace (mình dùng nhiều nhất là Google Docs, Sheets và Forms). Bộ công cụ này đã thay đổi cách mình làm việc, hỗ trợ mình tạo ra nhiều thứ vui vẻ và kiếm thêm thu nhập.
1.
tinhte.vn
Node.js là gì
Node.js là một nền tảng được xây dựng dựa trên V8 Javascript engine, sử dụng Javascript để code server-side.Mình code Javascript cho Website cá nhân và App Script (dùng cho hệ thống dữ liệu) thường xuyên nên việc đọc tài liệu của Node.js không mất quá nhiều thời gian, chỉ phải làm quen với những khái niệm mới để làm việc trên server.
Bài toán đặt ra
Mình tạo một bài viết trên tinhte và chia sẻ vào Group LG IT để rủ mọi người comment, đủ 1k comment là quay số.https://tinhte.vn/thread/tang-arm-nb-f80-cho-anh-em-tham-gia-lg-it-group.3452597/
Tặng ARM NB F80 cho anh em tham gia LG IT Group
VIDEO KẾT QUẢ QUAY GAME ARM NB F80
Lần đầu làm game quay xổ số mà nó hồi hộp còn hơn phim hành động!
Số may mắn: 859
Nick trúng giải: https://tinhte.vn/profile/kienvu154.2877717/
Đã nhắn tin cho bạn…
tinhte.vn
Trước đó thì mình định quay số thủ công bằng file Excel, một trang của bài viết sẽ có 19 comment, cứ như vậy tính lên thì sẽ có danh sách như sau:
Khi quay số trong random.org xong thì chỉ cần xác định số đó nằm ở trang nào rồi vô đếm số để chọn người may mắn. Sau đó thì mình thấy cách này không được tinh tế lắm, nên đổi qua phương án làm Tool.
Mình phác thảo Tool trong đầu:
- Có một ô nhập link bài viết tinhte, một ô nhập số trang
- Bấm nút là Tool sẽ tự động lấy dữ liệu comment về
- Dữ liệu sẽ là link profile của thành viên, có đánh số thứ tự để tiện random
- Nếu một thành viên comment nhiều lần thì Tool sẽ tự động lọc để tỉ lệ thắng giải của mọi người là như nhau
Quá trình thực hiện
*Đây không phải bài hướng dẫn (tutorial), mình sẽ không viết chuyên sâu về code vì mình cũng chỉ ở level Beginner, mình chỉ tập trung vào giải thích để các bạn không biết về code vẫn có thể đọc và hiểu được.Quảng cáo
*Hình ảnh minh họa mình chạy Tool ở local (máy mình)
Việc lấy dữ liệu từ một trang web gọi là "Web Scraping", này các bạn làm phân tích dữ liệu chắc quen quá rồi nè. Mình sử dụng một thư viên của Node gọi là Puppeteer, nó có khả năng điều khiển Chrome Headless Browser (trình duyệt không cần giao diện) qua code.
Các bạn có thể tìm hiểu thêm tại đây: puppeteer/puppeteer: Headless Chrome Node.js API (github.com)
Mình code bằng Visual Studio Code, đi từ ý tưởng → nghiên cứu docs → xem video Youtube → code hoàn chỉnh khoảng 3 tiếng
Nguyên lý hoạt động
Quảng cáo
Để lấy được comment trong bài thì mình phải tìm hiểu HTML, CSS của nó, chuột phải vào tên nick của thành viên và chọn Inspect (mình dùng trình duyệt Microsoft Edge).
Bạn nào chưa biết HTML, CSS thì xem qua bài viết này nha: https://tinhte.vn/thread/tu-lam-game-khong-qua-kho-biet-co-ban-lap-trinh-tre-em-cung-lam-duoc.3440017/
Xong khi bấm Inspect thì mình thấy được cái mình cần lấy là đoạn link: /profile/[tên thành viên]
Nó nằm trong một cái div (division - hộp chứa các thành phần của HTML) có phân loại (class) tên là “jsx-691990575”
Khi mình bỏ link và số trang vào Tool và bấm Submit thì:
- Thằng Puppeteer nó sẽ mở link bằng một trình duyệt vô hình (chúng ta không nhìn thấy được)
- Nó mở trang 1 → tìm tất cả những cái div có phân loại “jsx-691990575” trong trang và lấy cái link profile của các thành viên có comment bỏ vào một mảng (Array) - các bạn cứ hiểu nôm na là một cái hộp chứa kết quả
- Sau khi nó lấy hết ở trang 1 rồi nó sẽ bấm sang trang 2 → lặp lại các bước → bỏ link profile thành viên comment ở trang 2 vào hộp chứa kết quả
- Quá trình này diễn ra tương tự cho tất cả các trang còn lại (bài viết mình làm là 1054 comment có 54 trang)
- Sau khi lấy xong hết các trang, Tool sẽ mở một trang mới và lấy tất cả dữ liệu trong hộp kết quả hiển thị lên cho chúng ta xem
Kết quả của bài viết 1054 comment thì mình lấy được 975 comment, do mình có code một phần để lọc những nick comment nhiều lần nhằm đảm bảo tính công bằng. Sau đó mình dùng random.org chọn ra số may mắn 1-975 → bạn may mắn đợt vừa rồi là số 859 (bạn Kiên Vũ sống tại Hà Nội).
Cách thức tương tự có thể áp dụng để lấy Data từ các nguồn khác như Facebook nhưng sẽ phức tạp hơn nhiều, khi nào có thời gian mình sẽ làm thử và chia sẻ cùng mọi người.
Qua việc giải bài toán làm Tool GA thì mình thấy là:
- Khi biết lập trình thì có thể tạo ra công cụ để giải quyết công việc vui vẻ hơn,
- Tool này mình làm ra để hỗ trợ các mod, khacten làm Game GA → giúp đỡ được mọi người xung quanh,
- Vận dụng Javascript để Code server-side (điều trước đây mình chưa bao giờ làm), tạo tiền đề để học các ngôn ngữ server-side khác như Golang.
Cảm ơn các bạn đã đọc bài, hy vọng bài viết hữu ích cho mọi người ạ ^^