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
  • Hơn 1 tuần nay mình không đăng bài, không phải không có gì để viết mà đang tìm cách để phân phối nội dung có giá trị hơn trong thời đại AI đang bùng nổ mạnh mẽ như thế này.

    Như từ hồi đầu năm đã chia sẻ, số lượng người truy cập vào trang blog của mình đang dần ít đi. Khi xem thống kê, lượng người dùng trong 6 tháng đầu năm 2025 đã giảm 30% so với cùng kì năm ngoái, 15% so với 6 tháng cuối năm 2024. Như vậy một sự thật là người dùng đang rời bỏ dần đi. Nguyên nhân do đâu?

    Mình nghĩ lý do lớn nhất là thói quen của người dùng đã thay đổi. Họ tìm thấy blog chủ yếu qua các công cụ tìm kiếm, trong đó lớn nhất là Google. Gần 1/2 số lượng người dùng quay trở lại blog mà không cần thông qua bước tìm kiếm. Đó là một tín hiệu đáng mừng nhưng vẫn không đủ để tăng lượng người dùng mới. Chưa kể giờ đây, Google đã ra mắt tính năng AI Search Labs - tức là AI hiển thị luôn nội dung tổng hợp khi người dùng tìm kiếm, điều đó càng khiến cho khả năng người dùng truy cập vào trang web thấp hơn. Một điều thú vị là khi Search Labs được giới thiệu, thì các bài viết bằng tiếng Anh đã soán ngôi trong bảng xếp hạng truy cập nhiều nhất.

    Một bài viết của mình thường rất dài, có khi lên đến cả 2000 chữ. Mà để viết ra được một bài như thế tốn nhiều thời gian. Nhiều bài viết ra chẳng có ai đọc là điều bình thường. Mình biết và chấp nhận vì không phải ai cũng gặp phải vấn đề đang nói đến. Viết đối với mình như một cách để rèn luyện sự kiên nhẫn và cả tư duy. Viết ra mà giúp được cả ai đó là một điều tuyệt vời.

    Vậy nên mình đang nghĩ sẽ tập trung vào nội dung ngắn và trung bình để viết được nhiều hơn. Nội dung dài chỉ khi muốn viết chi tiết hoặc đi sâu về một chủ đề nào đó. Nên là đang tìm cách thiết kế lại trang blog. Mọi người cùng chờ nha 😄

    » Xem thêm
  • CloudFlare đã giới thiệu tính năng pay per crawl để tính phí cho mỗi lần AI "cào" dữ liệu trên trang web của bạn. Là sao ta 🤔?

    Mục đích của SEO là giúp các công cụ tìm kiếm nhìn thấy trang web. Khi người dùng tìm kiếm nội dung mà có liên quan thì nó hiển thị trang web của bạn ra kết quả tìm kiếm. Điều này gần như là đôi bên cùng có lợi khi Google giúp nhiều người biết đến trang web hơn, còn Google thì được nhiều người dùng hơn.

    Bây giờ cuộc chơi với các AI Agents thì lại khác. AI Agents phải chủ động đi tìm kiếm nguồn thông tin và tiện thể "cào" luôn dữ liệu của bạn về, rồi xào nấu hay làm gì đó mà chúng ta cũng chẳng thể biết được. Vậy đây gần như là cuộc chơi chỉ mang lại lợi ích cho 1 bên 🤔!?

    Nước đi của CloudFlare là bắt AI Agents phải trả tiền cho mỗi lần lấy dữ liệu từ trang web của bạn. Nếu không trả tiền thì tôi không cho ông đọc dữ liệu của tôi. Kiểu vậy. Hãy chờ thêm một thời gian nữa xem sao 🤓.

    » Xem thêm
  • Lúc khái niệm "Vibe Code" bùng nổ mình cũng tò và tìm hiểu xem nó là gì. Hoá ra là chỉ cách lập trình mới: Lập trình viên ra lệnh và để cho LLM tự viết mã. Sau đó là hàng loạt các bài viết nói về cách họ đã xây dựng ứng dụng mà không cần phải viết một dòng mã nào, hoặc 100% là do AI viết...

    Mình không có ý kiến gì vì mỗi người một sở thích. Nhưng nếu tiếp xúc với nhiều thông tin như vậy thì ít nhiều thế hệ lập trình viên mới sẽ "ám ảnh". Khi làm việc với ngôn ngữ lập trình, chúng ta đang tiếp xúc ở bề nổi rồi. Đằng sau đó còn nhiều lớp khác che giấu sự phức tạp. Ví dụ biết viết JavaScript nhưng có biết nó chạy như thế nào không 🤔? Trên thực tế bạn chẳng cần phải biết nó chạy như thế nào mà chỉ cần biết cú pháp là viết được chương trình chạy ngon ơ.

    LLMs giờ đây lại thêm một lớp ảo hoá cho việc viết mã. Tức là nơi chúng ta không cần trực tiếp viết mà là ra lệnh. Làm việc sẽ nhanh hơn nhưng khi gặp vấn đề thì nhiều khả năng phải vận dụng kiến thức của tầng thấp hơn để giải quyết.

    Mình dùng Cursor, nhưng tính năng thích nhất và dùng nhiều nhất là Autocomplete & Suggestions. Thi thoảng cũng dùng Agents để bảo nó viết tiếp đoạn mã đang dở, thường thì nó làm rất tốt. Hoặc khi gặp lỗi thì hỏi, có lúc giải quyết được, lúc thì không. Nhìn chung nó đang làm thay nhiệm vụ của Google & Stack Overflow, giúp tiết kiệm thời gian 😆

    LLMs như một cuốn bách khoa toàn thư rất khủng khiếp. Hỏi gì cũng biết, cũng trả lời được nhưng có một sự thật là nó chỉ là mô hình đoán chữ (đoán tokens). Thế nên nếu vấn đề phổ biến thì nó sẽ làm rất tốt, nhưng vấn đề ít phổ biến hơn thì nó lại rất tệ, hoặc thậm chí là đưa ra thông tin sai lệch, nhiễu... Tóm lại, cần phải biết cách khai thác thông tin, mà để biết thì buộc người dùng phải có một lượng kiến thức nhất định, tránh rơi vào cái bẫy thiên kiến uy quyền (tin tưởng tuyệt đối vào ai đó) hoặc thiên kiến xác nhận (xác nhận niềm tin sẵn có bằng cách chỉ tìm bằng chứng xác nhận niềm tin đó).

    Tại thấy bài viết này nên lại nổi hứng viết vài dòng 🤓 Why I'm Dialing Back My LLM Usage

    » 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ủ một thời gian dài trên nền tảng web. Hầu như trang nào cũng phải dùng jQuery vì đó là thư viện có nhiều hàm tương tác với DOM rất mạnh mẽ. Rất nhiều thư viện được xây dựng dựa trên jQuery, thậm chí yêu cầu jQuery trước khi sử dụng. Nhưng vì quá nặng và cồng kềnh, kèm theo cả việc lạm dụng jQuery quá mức mà nó càng ngày càng bị ghét bỏ. Cộng với sự ra đời của nhiều công cụ xây dựng web hiện đại mà giờ đây nó đã bê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 như di chuột, bấm, gõ phím... thể hiện cho việc tương tác với DOM. DOM có thể hiểu đơn giản là các thành phần HTML hiển thị trên trang web. Ngoài ra, còn một vài thứ nữa có thể tương tác với DOM như là JavaScript. Tức là có thể sử dụng JavaScript để tạo ra tương tác với DOM thay cho người dùng. Từ đó chúng ta có thể tự động hóa một chuỗi các hành động mà không cần sự tương tác của con người nữa.

Hầu hết trình duyệt hiện đại đều cung cấp tính năng gọi là Console cho viết mã JavaScript ngay trang web đang truy cập. Đó cũng là nội dung của bài viết của ngày hôm nay, tôi sẽ lấy một ví dụ cụ thể về cách sử dụng JavaScript để thực hiện một hành động trên trang web. Hy vọng qua bài viết này bạn đọc có thể tạo ra nhiều tính ứng dụng hơn trong thực tế và áp dụng 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. Hình dung DOM như một Web API mà trình duyệt cung cấp cho JavaScript 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. Nhiều Framework, Library ra đời dựa trên JavaScript đề cao khả năng tương tác với DOM, mang đến sự tiện lợi và thân thiện cho lập trình viên.

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. Ví dụ trong Chrome, sau khi bật Dev Tools và vào cửa sổ Console, có thể viết mã JavaScript 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 kẻ tấn công mạng cố gắng lừa người dùng dán một đoạn mã vào Dev Tools nhằm ăn cắp dữ liệu người dùng. Đối với một người dùng thông thường không thể hiểu hết sự nguy hiểm của việc thực thi mã JavaScript ngay tại chính trang web đang sử dụng. 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.

Lý thuyết thì hơi suông, hãy lấy một ví dụ cụ thể là "Thả phản ứng liên tục vào tin nhắn trên web Telegram" để làm ví dụ .

Thả phản ứng liên tục vào tin nhắn trên web Telegram

Ngoài ứng dụng đa nền tảng, Telegram còn cho phép truy cập qua trang web. Một điều mà tôi thấy thích thú là tính năng thả phản ứng cho tin nhắn bằng các biểu tượng 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 biểu tượng, hoặc đôi khi thả để cho người gửi biết là mình đã đọc tin nhắn của họ, cảm xúc sau khi đọc được tin nhắn đó là như thế nào.

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

Để viết được mã, 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 thả phản ứng.

Đầu tiên, mỗi khi di chuột vào khung thời gian thì các biểu tượng hiện ra, bấm vào biểu tượng nào đó thì là thả phản ứng thành công. Các tin nhắn khác cũng tương tự. Để ý là DOM chứa thành phần biểu tượng vẫn luôn có ở đó, chỉ dùng css để ẩn nó đi, chúng chỉ hiện lên khi di chuột vào.

Cách thả phản ứng hoạt động

Vậy ý tưởng là viết một đoạn mã lấy tất cả phần DOM chứa tin nhắn, lặp qua từng cái, bấm vào biểu tượng là thả phản ứng 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 > divselector của mỗi tin nhắn.

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

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

Hàm thả phản ứng tin nhắn bằng cách click:

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

Một hàm xử lý chính:

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

Cuối cùng gọi hàm main và xem kết quả. Nếu muốn nó tiếp tục thả phản ứng vào những tin nhắn mới sau đó thì thêm hàm setInterval để lặp lại hành động theo chu kỳ.

setInterval(main, 3000);

Kết quả.

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. Bài viết trên đây là một ví dụ cụ thể về việc JavaScript có thể thả phản ứng liên tục vào tin nhắn trên web Telegram. Ngoài ra bạn đọc có thể làm điều tương tự trên các trang web khác mà bạn muốn. Nếu có ý tưởng nào mới, hãy để lại bình luận cho tôi và mọi người cùng biết nhé. Xin cảm ơn.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? 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ừ1 năm 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ống1 năm trước

Cảm ơn bạn, một bài viết khá chi tiết về developer tools 😄