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

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Hẳn là nhiều người ở đây đã nghe đến kiểu tấn công bảo mật Clickjacking rồi nhỉ. Kẻ tấn công thường nhúng một website (thường là mục tiêu) vào trong một iframe trên website của chúng, sau đó làm mờ hoặc ẩn nó đi rồi đặt vào vị trí các nút bấm trên web, ví dụ "Bấm vào để nhận quà". Đâu ai ngờ rằng phía trên nút bấm đó là một nút bấm khác trong iframe. Khá nguy hiểm!

    Nhưng trình duyệt đã có cách ngăn chặn kiểu tấn công này bằng các quy tắc như tiêu đề X-Frame-Options, frame-ancestors của CSP và SameSite: Lax/Strict của Cookies...

    Mới đây, đã xuất hiện thêm kiểu tấn công mới - "DoubleClickjacking" 😨. Đại ý là "hắn" lợi dụng hành động double click để lừa người dùng bấm vào một nút mà hắn muốn. Chi tiết hơn trong bài viết này: DoubleClickjacking: A New Era of UI Redressing.

    » Xem thêm
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » 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

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên 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