Tương tác với trang web bằng Console của trình duyệt qua một ví dụ đơn giản

Tương tác với trang web bằng Console của trình duyệt qua một ví dụ đơn giản

Tin ngắn hàng ngày dành cho bạn
  • Bắt đầu kỳ nghỉ tết rồi nên mình cũng không đăng bài nữa. Hẹn gặp lại các bạn qua tết nha 😁

    » Xem thêm
  • Tiếp tục về jj. Đang thắc mắc là nó mới thế liệu có ai làm mấy phần mềm dạng GUI cho dễ nhìn chưa. Kiểu giống như git thì có quá nhiều rồi không đếm xuể.

    May quá, tác giả tổng hợp lại luôn rồi Community-built tools around Jujutsu 🥳

    » Xem thêm
  • Turso thông báo rằng họ đang viết lại SQLite bằng Rust. Thế là lại có thêm một bằng chứng nữa cũng cố cho câu nói Rust đang "tái định nghĩa" lại nhiều thứ.

    Nhưng nguyên nhân sâu xa mới thú vị. Tại sao họ lại làm vậy? Ai cũng biết SQLite là nguồn mở, ai cũng có thể tạo bản sao (fork) để chỉnh sửa lại theo ý mình. Lẽ nào nhóm của Turso không thích hoặc không tin vào C - vốn là ngôn ngữ dùng để cấu thành SQLite.

    Mình xin kể chuyện một chút. Turso là một bên cung cấp dịch vụ máy chủ cơ sở dữ liệu dựa trên SQLite, họ đã thực hiện một vài tùy chỉnh trên bản sao của SQLite để phục vụ cho mục đích của mình, gọi nó là libSQL. Họ "hào phóng" cho cộng đồng đóng góp thoải mái.

    Quay trở lại SQLite là mã nguồn mở chứ không phải là đóng góp mở. Chỉ có một nhóm người đứng đằng sau duy trì mã nguồn này, và họ không tiếp nhận yêu cầu kéo (pull request) từ những người khác. Đồng nghĩa mọi thay đổi hoặc tính năng đều là của nhóm người này tạo ra. Có vẻ như SQLite rất phổ biến nhưng cộng đồng không thể làm điều mà họ muốn là đóng góp cho sự phát triển của nó.

    Chúng ta biết rằng hầu hết ứng dụng mã nguồn mở thường đi kèm với một thư mục "tests" với các bài kiểm tra rất nghiêm ngặt. Điều đó giúp cho sự cộng tác trong phát triển trở nên dễ dàng hơn. Nếu muốn chỉnh sửa hoặc thêm một tính năng mới, trước hết bạn cần phải đảm bảo sự thay đổi vượt qua được tất cả bài kiểm tra. Nhiều thông tin cho rằng SQLite không công khai bộ kiểm tra này. Điều này vô tình gây khó khăn cho những ai muốn chỉnh sửa mã nguồn. Vì họ không chắc chắn rằng liệu triển khai mới của mình có phù hợp với những tính năng cũ hay không.

    tursodatabase/limbo là dự án viết lại SQLite bằng Rust đã nhắc đến ở đầu bài. Họ nói rằng nó hoàn toàn tương thích với SQLite và nguồn mở hoàn toàn. limbo đang trong giai đoạn hoàn thiện. Chúng ta hãy chờ xem kết quả trong tương lai thế nào nhé. Bài viết chi tiết tại Introducing Limbo: A complete rewrite of SQLite in Rust.

    » Xem thêm

Vấn đề

Có thể bạn đã biết, trước đây khi chưa có React, Vue... thì jQuery đã làm bá chủ của nhiều trang web. Hầu như trang nào cũng sử dụng jQuery vì đó là thư viện cung cấp nhiều hàm tương tác với DOM để thay đổi dữ liệu rất mạnh mẽ. Nhưng vì quá nặng và cồng kềnh, cộng với sự ra đời của nhiều công cụ xây dựng web hiện đại sau này, mà giờ đây nó đã trên "bờ vực của cái chết".

Khi truy cập vào một trang web, mỗi hành động của bạn thể hiện cho việc tương tác với DOM. Ngoài ra, còn một vài thứ có thể tương tác với DOM nữa như là JavaScript. Điều đó nghĩa là, có thể sử dụng JavaScript để tạo ra tương tác với DOM như một người dùng bình thường. Từ đó, chúng ta có thể tự động hóa một chuỗi các hành động lặp đi lặp lại mà không cần sự tương tác của người dùng nữa.

Hầu hết trình duyệt hiện đại bây giờ đều cung cấp chức năng gọi là Console để cho chúng ta viết và chạy mã JavaScript ngay tại trang web đang truy cập. Bài viết ngày hôm nay, tôi sẽ nêu ra một ví dụ cụ thể về cách viết mã JavaScript thực hiện một hành động lặp đi lặp lại trên trang web. Hy vọng qua bài viết này, bạn đọc có thể hình dung ra nhiều ứng dụng hơn nữa và áp dụng nó trong công việc hàng ngày.

DOM và JavaScript

Document Object Model (DOM) là một giao diện lập trình cho các trang web. Nó đại diện cho trang web để các chương trình có thể thay đổi cấu trúc, kiểu và nội dung tài liệu. DOM đại diện cho trang web (document) dưới dạng các nút và đối tượng. Qua đó, làm cho một số ngôn ngữ lập trình có thể tương tác với trang.

JavaScript có thể tương tác với DOM một cách mạnh mẽ. Hình dung DOM như một Web API mà trình duyệt cung cấp cho nó toàn quyền truy cập và chỉnh sửa. Hầu như trải nghiệm tuyệt vời trên web ngày nay đều có sự góp mặt của JavaScript. Cùng với sự phát triển của thế giới web, chúng ta ngày càng có nhiều trang web động, chú trọng đến trải nghiệm của người dùng hơn. Nhiều Framework, Library dựa trên JavaScript để tăng tương tác với DOM góp phần tạo ra trang web mang nhiều tiện ích như thế.

Trình duyệt cho phép chúng ta chạy mã JavaScript trực tiếp trên trang web thông qua Dev Tools của nó. Trong Chrome, sau khi bật Dev Tools và vào cửa sổ Console, bạn đã có thể viết mã JS vào đây và chạy nó.

Console của trình duyệt

Lợi dụng điều này mà trước đây, nhiều hacker cố gắng lừa người dùng dán một đoạn mã để họ ăn cắp dữ liệu. Nhưng trong bài viết này, tôi không đi sâu vào chủ đề đó, mà mục đích là giúp cho các bạn hình dung được cách sử dụng JavaScript để tương tác với DOM.

Nói thì có vẻ dài dòng, hãy lấy một ví dụ đơn giản là "thả react liên tục vào tin nhắn trên Telegram" để giúp bạn đọc dễ hình dung hơn.

Thả react liên tục vào tin nhắn Telegram

Hầu như bây giờ, các dịch vụ nhắn tin OTT có cung cấp phiên bản web cho chúng ta sử dụng. Một điều tôi thấy thích thú là tính năng react tin nhắn bằng các emoji để thể hiện cảm xúc. Thích vì nhiều khi mình không cần phải trả lời mà chỉ cần thả một emoji, hoặc đôi khi react để cho người gửi biết là mình đã đọc tin nhắn của họ, và cảm xúc khi đọc được tin nhắn đó là như thế nào.

Tôi có một thói quen hay react tin nhắn. Một phần vì muốn cho họ biết là mình đã đọc, một phần thì là do "nghịch ngợm". Trên Telegram thì có một nhóm bạn chuyên nói nhiều chuyện trên trời dưới đất, và để cho bớt nhàm chán mỗi khi không "rảnh tay", thì tôi đã viết một script cho nó tự thả emoji vào tin nhắn của bọn họ.

Để viết được script, trước tiên chúng ta cần bỏ ra một ít thời gian nghiên cứu cách hoạt động của tính năng react.

Đầu tiên, tôi thấy mỗi khi di chuột vào khung thời gian thì emoji sẽ hiện ra, bấm vào emoji thì là thả react thành công. Các tin nhắn khác cũng tương tự. Để ý là phần DOM của emoji vẫn luôn có ở đó, chỉ là CSS đã ẩn nó đi và chỉ hiện khi chúng ta di chuột vào.

Cách react emoji hoạt động

Vì vậy ý tưởng là lấy tất cả tin nhắn, lặp qua từng cái và bấm vào emoji là đã thả react thành công.

Đầu tiên là hàm lấy tất cả tin nhắn:

const getListMessage = () => {
  return (
    document.querySelectorAll(
      "div.message-content-wrapper.can-select-text > div"
    ) || []
  );
};

div.message-content-wrapper.can-select-text > div là selector của mỗi tin nhắn.

Hàm kiểm tra tin nhắn đã được react chưa bằng cách kiểm tra có element .Reactions chưa.

const checkReactMessage = (elm) => {
  if (elm) {
    return !!elm.querySelector(".Reactions");
  }
  return false;
};

Hàm react tin bằng cách click:

const react = (elm) => {
  if (elm) {
    elm.click();
  }
};

Cuối cùng là hàm xử lý chính:

const main = () => {
  const listMessage = getListMessage();
  listMessage.forEach((elm) => {
    if (!checkReactMessage(elm)) {
      react(elm.querySelector('div.quick-reaction'));
    }
  });
};

Sau đó bạn có thể gọi hàm main và xem kết quả. Hoặc nếu muốn nó react vào những tin nhắn mới sau đó thì thêm hàm setInterval.

setInterval(main, 3000);

Kết quả là:

Kết quả

Tổng kết

DOM là một giao diện lập trình cho các tài liệu web. JavaScript có thể tương tác với DOM một cách dễ dàng. Đặc biệt, việc có thể chạy JavaScript trực tiếp từ Console trong trình duyệt giúp bạn thoải mái tạo ra các hành động thay mặt người dùng một cách tự động hóa.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Anh Đức Trừ11 tháng trước
bài viết của mình về Google Chrome Developer Tools bạn đọc thử nhé. https://www.blogchemgio.com/2022/06/google-chrome-developer-tools.html
Trả lời
Avatar
Xuân Hoài Tống11 tháng trước
Cảm ơn bạn, một bài viết khá chi tiết về developer tools 😄
Bấm hoặc cuộn mạnh để sang bài mới