HomeLập trìnhJavaScriptCách chặn các...

Cách chặn các trang web không hiệu quả và tăng năng suất của bạn bằng JavaScript


của Madhav Bahl

1*9-xBdZXdd_FT1X-DTTX75A
Thời gian để hoàn thành sh * t 🙂

Mệt mỏi vì lãng phí thời gian của bạn trên các trang web không hiệu quả khác nhau? Tại sao không tạo một tập lệnh giúp bạn hạn chế thời gian dành cho các trang web này?

Điều này nghe có quen không…?

Chỉ một ngày khác, cuộn qua của tôi Truyền thông xã hội cho ăn và xem meme. Tôi thấy rằng đã 4 giờ trôi qua kể từ khi tôi ngồi ở cùng một vị trí và “Không làm gì cả”. Tôi ghét nó! Tôi đã phải làm một cái gì đó về nó. Tôi chợt nghĩ, tại sao không tạo một số kịch bản giúp tôi hạn chế thời gian dành cho các trang web này?

0*bIF5jb6o8DpD_JvS
Ngừng cuộn qua nguồn cấp dữ liệu của bạn và làm điều gì đó đi xD (nguồn: https://www.writerswrite.com/writingmemes/)

Làm thế nào về việc tạo một tập lệnh sẽ chặn tất cả các trang web này? Tập lệnh cho phép bạn chỉ sử dụng chúng vào một số giờ cụ thể trong ngày. Nghe hợp lý phết! Hãy làm nó. 🙂

Vâng, tôi biết có nhiều phương pháp dễ dàng để chặn bất kỳ trang web nào. Chỉ cần tải xuống một số plugin của Chrome hoặc đúng hơn là bất kỳ phần mềm nào có thể thực hiện việc này cho chúng tôi. Vâng vâng, khá dễ dàng! Nhưng thôi nào, chúng tôi là nhà phát triển, chúng tôi không làm những việc này! Khi chúng tôi cần thứ gì đó, chúng tôi phát triển kịch bản cho nó thay vì sử dụng một số thủ thuật ngẫu nhiên để thực hiện công việc…đúng không?!

Nếu bạn muốn tải xuống tập lệnh trực tiếp, bạn có thể làm như vậy từ đây.

Bắt đầu nào!

Không giống như các bài viết hướng dẫn khác của tôi, bạn sẽ không cần bất kỳ cấu trúc thư mục hoặc môi trường dev nào được thiết lập cho dự án này. Tất cả những gì bạn cần là cài đặt NodeJS trên hệ thống của bạn và một trình soạn thảo văn bản tốt. Bạn có thể tạo tập lệnh này bằng bất kỳ ngôn ngữ nào bạn chọn hỗ trợ xử lý tệp. Tôi chọn JavaScript vì tôi thích nó!

0*Fhqu52MS8kbjNWKY
Tôi ❤️ JavaScript! (nguồn: https://brendaneich.com/2015/06/from-asm-js-to-webassembly/)

Ý tưởng nền tảng

Ý tưởng đằng sau công cụ chặn này mà chúng tôi sắp thực hiện rất đơn giản. Có một tập tin tên hosts. Chúng tôi có thể thêm URL của bất kỳ trang web nào và URL của trang web mà chúng tôi muốn chuyển hướng trang web cũ đến. Một cái gì đó như thế này:

127.0.0.1    www.facebook.com

Bây giờ, bất cứ khi nào chúng tôi cố gắng mở Facebook, nó sẽ tự động được chuyển hướng đến 127.0.0.1 (localhost). Điều này sẽ gián tiếp chặn trang web.

Tệp máy chủ mà tôi đang nói đến có trong C:\Windows\System32\drivers\etc\hosts nếu bạn sử dụng Windows. Nếu bạn là người dùng Mac hoặc Linux, vị trí của tệp đó là: /etc/hosts.

Hãy sửa đổi tập tin…

Trước khi bắt đầu mã, hãy thử sửa đổi tệp và xem nó có hoạt động không. Xin lưu ý rằng chỉ người dùng có quyền quản trị viên mới có thể sửa đổi tệp này. Nếu bạn đang dùng Windows, bạn có thể nhấp chuột phải vào tệp đó và mở với tư cách quản trị viên. Nếu bạn đang sử dụng Linux, bạn có thể sử dụng lệnh sudo. Tôi đang sử dụng nano để mở tệp, bạn có thể sử dụng bất kỳ trình chỉnh sửa nào khác mà bạn chọn.

sudo nano /etc/hosts

Sau khi bạn gõ lệnh này, nó sẽ yêu cầu bạn nhập mật khẩu của mình. Bạn có thể nhập nó và mở tập tin của bạn. Hãy thử nó ra 🙂

Đọc thêm  Cách sử dụng Bộ lọc, Bản đồ và Giảm để có mã dễ bảo trì hơn
1*0MXqMMIcuM34PF780gIO-w

Được rồi, vì vậy chúng tôi đã thêm trang web “bị chặn” vào tệp máy chủ, bây giờ hãy kiểm tra xem nó có hoạt động hay không. Để kiểm tra, hãy truy cập bất kỳ trình duyệt web nào và truy cập trang web đó.

0*l-CTDo6vZEcLlSUu
Diệp Bình! Nó hoạt động :3

Bây giờ chúng ta đã kiểm tra xem khái niệm của mình có đúng không, hãy viết mã trình chặn.

1. Thiết lập các biến

Như tôi đã nói trước đó, không cần cấu trúc thư mục khổng lồ hoặc thiết lập môi trường nhà phát triển. Tất cả những gì bạn cần làm là tạo một tệp JavaScript (giả sử, blocker.js) và bắt đầu viết mã.

Trước hết, chúng ta cần nhập khẩu fs (hệ thống tệp) Mô-đun nút thông qua đó chúng tôi sẽ thực hiện các thay đổi đối với tệp máy chủ của mình. Bạn có thể đọc tài liệu đầy đủ về fs tại đây.

const fs = require('fs');

Bây giờ, chúng ta sẽ cần khởi tạo 3 biến:

  1. đường dẫn tập tin — Để lưu trữ đường dẫn của tập tin máy chủ
  2. chuyển hướng — Đối với đường dẫn chuyển hướng (ở đây, localhost)
  3. trang web – Mảng các trang web bị chặn

Ngoài ra, chúng tôi sẽ tạo một biến có tên delay. Biến này sẽ lưu trữ giá trị thời lượng (tính bằng mili giây) sau đó tập lệnh của chúng ta sẽ tự lặp lại. Về cơ bản, ý tưởng là giữ cho tập lệnh luôn chạy để kiểm tra xem đã đến lúc chặn/bỏ chặn các trang web hay chưa. Để giữ cho nó chạy, chúng tôi sẽ sử dụng setInterval() phương pháp trong JavaScript. Chúng ta cũng có thể sử dụng while (true) {} để tạo một vòng lặp vô hạn.

Ngay bây giờ, chúng tôi đang giữ thời gian mà sau đó chức năng tự lặp lại không đổi (giả sử là 10 giây). Tuy nhiên, tập lệnh này có thể được thực hiện thông minh hơn bằng cách đặt giá trị của độ trễ bằng chênh lệch thời gian giữa thời gian hiện tại và thời điểm mà trạng thái của tập lệnh (chặn/bỏ chặn) phải được thay đổi. Làm điều này dễ dàng hơn nhiều so với cảm giác của nó – vì vậy tôi muốn bạn (người đọc) tự làm điều đó và gửi thư cho tôi, tôi rất muốn nhận được phản hồi từ bạn ?

const filePath = "/etc/hosts";const redirectPath = "127.0.0.1";let websites = [ "www.someRandomWebsite.com","anotherWebsite.com" ];let delay = 10000;

Ghi chú* Nếu bạn là người dùng Windows, hãy lưu trữ tệp này trong biến filePath: C:\Windows\System32\drivers\etc\hosts

2. Chức năng chặn

Bây giờ chúng ta sẽ tạo một chức năng chặn. Chúng tôi gọi nó từ phương thức setInterval để giữ cho nó chạy sau mỗi khoảng thời gian nhất định.

let blocker = () => {    ....    ....};

Bây giờ chúng ta sẽ điền mã bên trong chức năng chặn của chúng ta.

Trình chặn bên trong: Nhận thời gian hiện tại

Trước hết, chúng ta cần lấy thời gian hiện tại, sau đó kiểm tra xem đã đến lúc chặn hoặc bỏ chặn trang web hay chưa.

let date = new date();let hours = date.getHours();if(hours >= 14 && hours < 18) {    console.log('Time to block websites');    ....    ....} else {    console.log('Time to unblock websites');    ....    ....}

Trình chặn bên trong: Bên trong Nếu – Điều kiện Nếu là đúng

Bây giờ chúng ta cần đọc tệp máy chủ và chuyển đổi dữ liệu đã tìm nạp thành chuỗi (các readFile() sẽ trả về dữ liệu bộ đệm cần được chuyển đổi thành chuỗi).

Sau khi đọc tệp, chúng tôi cần kiểm tra xem từng trang web và đường dẫn chuyển hướng có trong tệp máy chủ hay không. Nếu nó hiện diện, thì chúng ta có thể bỏ qua nó. Nếu không, chúng ta cần nối thêm redirectPath websiteURL với nó sẽ trông giống như thế này:

127.0.0.1    www.someRandomWebsite

Để thực hiện điều này, chúng ta sẽ sử dụng vòng lặp for. Vòng lặp sẽ lặp qua từng URL trong mảng trang web và kiểm tra xem nó có tồn tại bên trong tệp hay không. Để làm điều này, chúng tôi sẽ sử dụng indexOf() phương pháp chuỗi. Nếu giá trị lớn hơn 0, tức là trang web đã cho có trong tệp máy chủ, chúng ta có thể bỏ qua. Mặt khác, nếu giá trị không lớn hơn 0, chúng tôi cần nối thêm redirectPath và URL trang web (được phân tách bằng dấu cách) vào tệp.

fs.readFile(filePath, (err, data) => {    fileContents = data.toString();    for(let i=0;i<websites.length;i++) {        let addWebsite = "\n" + redirectPath + " " + websites[i];        if (fileContents.indexOf(addWebsite) < 0) {            console.log('Website not present in hosts file');            fs.appendFile(filePath, addWebsite, (err) => {                if (err)  return console.log(err);                console.log('File Updated Successfully');            });        } else {            console.log('Website is present');        }    }});

Trình chặn bên trong: Inside Else – Nếu điều kiện là sai

Nếu điều kiện là sai, chúng ta cần kiểm tra xem các trang web trong danh sách có trong tệp máy chủ hay không. Nếu chúng hiện diện, chúng ta cần xóa chúng.

Đọc thêm  JavaScript split() a String – Phương thức JS String to Array

Để xóa, chúng tôi sẽ sử dụng một thủ thuật đơn giản. Chúng tôi sẽ đọc từng dòng tệp. Chúng tôi tạo một chuỗi trống và kiểm tra xem dòng hiện tại có chứa bất kỳ trang web nào có trong danh sách hay không. Nếu có, chúng tôi chỉ đơn giản là bỏ qua nó. Nếu không, chúng tôi sẽ thêm dòng đó vào chuỗi mà chúng tôi đã khởi tạo. Sau khi kiểm tra dòng cuối cùng, chúng ta chỉ cần thay thế nội dung hiện tại của tệp bằng chuỗi CompleteContent này.

Mã để làm như vậy là rất dễ dàng. Đầu tiên khởi tạo một chuỗi rỗng (completeContent). Sau đó đọc từng dòng tệp. Thực hiện theo các bước được đưa ra trong mã dưới đây. Sau đó thay thế nội dung của tệp bằng biến CompleteContent.

// Initialize the empty stringlet completeContent="";
// Read the file line by linefs.readFileSync(filePath)    .toString()    .split()    .forEach((line) => {        ....        ....        ....        // Do the below given procedure to update completeContent });
// Replace the file contents by `completeContent` variablefs.writeFile(filePath, completeContent, (err) => {    if (err) {        return console.log('Error!', err);    }});

Bây giờ chúng ta có quyền truy cập vào từng dòng, chúng ta có thể kiểm tra xem dòng này có chứa bất kỳ trang web nào hay không bằng cách sử dụng cờ và vòng lặp for. Chúng tôi đặt cờ thành 1 (hoặc đúng) và sau đó chạy một vòng lặp để lặp qua danh sách các trang web. Nếu dòng chứa trang web hiện tại (chúng tôi sẽ kiểm tra nó bằng cách sử dụng string.indexOf(substring) phương pháp), đặt lại cờ về 0 và ngắt vòng lặp hiện tại. Bên ngoài vòng lặp, chúng tôi kiểm tra, nếu cờ là 1 (hoặc đúng), chúng tôi sẽ nối dòng hiện tại vào completeContent Biến đổi.

Cũng xin lưu ý điều đó nếu cờ là 1, chúng tôi cũng kiểm tra xem dòng hiện tại có phải là dòng cuối cùng hay không. Nếu nó không phải là dòng cuối cùng, chúng tôi nối dòng hiện tại vào completeContent chuỗi cùng với một "\n" để dòng tiếp theo sẽ được thêm vào completeContent từ một dòng mới (hoặc ngắt dòng). Thực hiện theo đoạn mã sau bên trong forEach() của khối mã trên.

let flag = 1;for (let i=0; i<websites.length; i++) {    if (line.indexOf(websites[i]) >= 0) { // line contains website        flag = 0;        break;    }}
if(flag == 1) {    if (line === '')           completeContent += line;    else         completeContent += line + "\n";}

3. Chạy code chức năng blocker

Đây là mã cho chức năng chặn trong trường hợp bạn nhầm lẫn với mã phân tán trong phần 2:

Bây giờ, để chạy chức năng này liên tục, chúng ta có thể thực hiện while (true) {} như một vòng lặp vô tận. Bên trong nó, chúng ta có thể đặt một khoảng thời gian trễ để nó không chiếm bộ xử lý liên tục.

Đọc thêm  JavaScript JavaScript

Hoặc, một lựa chọn tốt hơn là sử dụng setInterval() chức năng. Điều này tiếp tục lặp lại chức năng chặn sau một khoảng thời gian cụ thể. Nhưng mà, setInterval() sẽ chạy lần đầu tiên sau độ trễ được chỉ định. Do đó, chúng ta sẽ phải gọi hàm chặn một lần trước hàm setInterval.

blocker();setInterval(blocker, delay);

4. Tất cả đã xong! Hãy kiểm tra kịch bản của chúng tôi

Thời gian để chạy kịch bản của chúng tôi. Để chạy tập lệnh, hãy mở thư mục làm việc hiện tại trong một thiết bị đầu cuối và nhập lệnh sau:

sudo node blocker.js

Nếu bạn là người dùng Windows, bạn có thể mở dấu nhắc lệnh với tư cách quản trị viên, chuyển đến thư mục dự án rồi chạy lệnh:

node blocker.js

Xin lưu ý rằng chỉ vì mục đích kiểm tra, tôi đang chặn facebook.com. Đây là quá trình chạy thử:

1*3csxXZL_6AjyODUwXucfbw
Yuss! Chúng tôi đã làm được ❤

5. Bước Cuối Cùng…

Đối với Mac và Linux

Bạn có thể lên lịch chạy tập lệnh này bất cứ khi nào ai đó khởi động hệ thống bằng crontab. Cron là một bộ lập lịch công việc dựa trên thời gian trong các hệ điều hành máy tính giống Unix. Bạn có thể đọc thêm về cron tại đây.

Vì vậy, chúng tôi sẽ thêm lệnh của mình thông qua đó chúng tôi chạy tập lệnh (sudo node blocker.js) trong bảng cron. Làm điều này rất đơn giản: mở terminal bằng cách sử dụng ctrl+alt+tsau đó mở crontab bằng cách sử dụng sudo crontab -e. Lệnh này sẽ mở bảng cron.

Ghi chú điều đó chúng tôi đã sử dụng sudo crontabkhông phải crontab. Điều này sẽ cho phép chúng tôi sửa đổi bảng cron.

Khi bạn đã mở nó, hãy thêm dòng này vào cuối (thay thế path-to-script với đường dẫn của thư mục dự án của bạn):

@reboot node /path-to-script/blocker.js

Đó là nó! Làm điều này sẽ chạy tập lệnh của bạn mỗi khi hệ thống khởi động lại.

Cho cửa sổ

Tập lệnh cũng có thể được lên lịch để chạy mỗi khi hệ thống khởi động trong Windows. Đây là một bài viết rất hay cho biết làm thế nào để làm như vậy.

Đi đâu từ đây?

Bạn có phải là người đam mê mã nguồn mở? Bạn muốn đóng góp cho dự án này?
Tôi đang bắt đầu một dự án Nguồn mở mới có tên “Tự kiểm soát” đó sẽ là một ứng dụng máy tính để bàn được tạo bằng Electron. Các tính năng sẽ bao gồm:

  • lấy thông tin đầu vào từ người dùng về thời gian họ muốn chặn trang web nào
  • theo dõi thời gian người dùng dành để xem các trang web truyền thông xã hội
  • đồng hồ bấm giờ Pomodoro
  • và một ứng dụng danh sách việc cần làm với báo cáo tiến độ năng suất hàng ngày.

Kiểm tra kho lưu trữ và thêm nhận xét “quan tâm” về vấn đề bạn quan tâm để giải quyết.

Bây giờ, hãy để tôi cung cấp cho bạn mã hoàn chỉnh với các nhận xét phù hợp sẽ giúp bạn hiểu mã:

Mã hoàn chỉnh (blocker.js)

Đó là nó

Bạn có thấy bài viết hữu ích không?

Đăng ký TheLeanProgrammer để trở thành người đầu tiên nhận được thông báo từ tôi về các bản cập nhật trong tương lai.

1*L-3kS5mz7jp4e8zV8WLoLQ

Hãy liên hệ với tôi bất cứ lúc nào nếu bạn muốn thảo luận điều gì đó 😀

Tôi sẽ rất vui nếu bạn gửi phản hồi hoặc đề xuất của mình hoặc nếu bạn đặt câu hỏi. Hơn nữa, tôi thích kết bạn mới — vì vậy hãy gửi thư cho tôi.

Cảm ơn rất nhiều vì đã đọc đến cuối. Bạn có thể liên hệ với tôi trong trường hợp nếu bạn cần bất kỳ sự trợ giúp nào:
Email: madhavbahl10[at]gmail[dot]com
Web: http://madhavbahl.tech/
Github: https://github.com/MadhavBahlMD
LinkedIn: https://www.linkedin.com/in/madhavbahl/



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status