Автор оригинала: FreeCodeCamp Community Member.
Мадхавом Баль
Надоело тратить свое время на различных непродуктивных сайтах? Почему бы не сделать сценарий, который поможет вам ограничить время, которое вы проводите на этих сайтах?
Этот звук знакомо …?
Как насчет создания сценария, который заблокирует все эти сайты? Скрипт позволяет использовать их только в некоторых конкретных заданных часах дня. Звучит законно! Давай сделаем это.:-)
Да, я знаю, что есть много простых методов для блокировки любого сайта. Просто скачайте несколько хромированного плагина или, скорее любое программное обеспечение, которое сделало бы это для нас. Ну, да, довольно легко! Но давай, мы являемся разработчиками, мы не делаем этих вещей! Когда нам что-то нужно, мы разрабатываем сценарии для него, а не использовать какую-то случайное трюк, чтобы сделать работу … верно?!
Если вы хотите загрузить скрипт напрямую, вы можете сделать это из здесь Отказ
Давайте начнем!
В отличие от моих других учебных пособий, вам не понадобится никакой структуру каталогов или среда Dev, созданная для этого проекта. Все, что вам нужно, это Nodejs, установленные в вашей системе и хороший текстовый редактор. Вы можете сделать этот скрипт, используя любой язык вашего выбора, который поддерживает обработку файлов. Я выбрал JavaScript, потому что я люблю это!
Идея фона
Идея этого блокатора, которую мы собираемся сделать, очень просто. Есть файл с именем хозяева Отказ Мы можем добавить URL любого веб-сайта и URL веб-сайта, на который мы хотим перенаправить бывшего веб-сайта. Что-то вроде этого:
127.0.0.1 www.facebook.com
Теперь, когда мы пытаемся открыть Facebook, он будет перенаправлен на 127.0.0.1 (localhost) автоматически. Это косвенно заблокирует сайт.
Файл хостов, о котором я говорю, присутствует в C: \ Windows \ System32 \ Drivers \ etc \ hosts Если вы используете Windows. Если вы являетесь пользователем Mac или Linux, местоположение этого файла: /etc/hosts Отказ
Давайте изменим файл …
Перед запуском кода давайте попробуем изменять файл и посмотреть, работает ли он. Обратите внимание, что только пользователь с правами администратора может изменить этот файл. Если вы находитесь в Windows, вы можете щелкнуть правой кнопкой мыши на этом файле и открыть как администратор. Если вы используете Linux, вы можете использовать команду sudo. Я использую Nano, чтобы открыть файл, вы можете использовать любой другой редактор по вашему выбору.
sudo nano /etc/hosts
После того, как вы введите эту команду, она попросит вас ввести свой пароль. Вы можете ввести его и открыть свой файл. Давайте попробуем:)
Хорошо, поэтому мы добавили наши «быть заблокированным» сайтом в файле хостов, теперь давайте проверим это, работало ли это или нет. Чтобы проверить его, перейдите в любой веб-браузер и перейдите на этот сайт.
Теперь, когда мы проверили, что наша концепция верна, давайте код блокатора.
1. Настройка переменных
Как я уже говорил ранее, нет необходимости в огромных структуре структурирования или создания среды Dev. Все, что вам нужно сделать, это сделать файл JavaScript (скажем, Blocker.js ) и начните кодирование.
Прежде всего, нам нужно импортировать ФС (Файловая система) Модуль узла, через который мы будем внесены изменения в файл наших хостов. Вы можете прочитать полную документацию FS здесь Отказ
const fs = require('fs');Теперь нам нужно будет инициализировать 3 переменных:
- FilePath – хранить путь файла хостов
- RedirectPath – Для пути перенаправления (здесь, localhost)
- Сайты – Массив сайтов, которые должны быть заблокированы
Кроме того, мы сделаем переменную по имени задержка Отказ Эта переменная будет хранить значение продолжительности времени (в миллисекундах), после чего наш скрипт будет повторяться. В основном идея состоит в том, чтобы сохранить сценарий все время, чтобы проверить, является ли оно время заблокировать/разблокировать веб-сайты. Чтобы он продолжал работать, мы будем использовать SetInterval () Метод в JavaScript. Мы также можем использовать в то время как (правда) {} сделать бесконечную петлю.
Прямо сейчас мы удерживаем время, после чего функция повторяется константы (скажем, 10 секунд). Но этот скрипт может быть сделан умнее путем установки значения задержки, равный разнице времени между текущим временем и временем, на котором необходимо изменить состояние сценария (блок/разблокировка). Делать это гораздо легче, чем то, что ощущается – так что я хочу, чтобы вы (читатель) сделать это сами, и бросить мне Почта Я хотел бы услышать от вас?
const filePath = "/etc/hosts";const redirectPath = "127.0.0.1";let websites = [ "www.someRandomWebsite.com","anotherWebsite.com" ];let delay = 10000;
Примечание * Если вы являетесь пользователем Windows, храните это в переменной FilePath: C: \ Windows \ System32 \ Drivers \ etc \ hosts
2. Функция блокатора
Теперь мы сделаем блокаторную функцию. Мы называем его из метода SetInterval, чтобы он продолжал работать после каждого данного временного интервала.
let blocker = () => { .... ....};Теперь мы заполним код в нашей функции блокатора.
Внутри блокатора: получить текущее время
Прежде всего, нам нужно получить текущее время, а затем проверять, является ли это время заблокировать сайт или разблокировать его.
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'); .... ....}Внутри блокатора: внутри, если – это состояние, если
Теперь нам нужно прочитать файл хостов и преобразовать полученные данные в строку (функция Readfile () (), вернет файлы буферов, которые необходимо преобразовать в строку).
После прочтения файла нам необходимо проверить, присутствует ли каждый веб-сайт и путь перенаправления в файле хостов или нет. Если он присутствует, то мы можем игнорировать это. В противном случае нам нужно добавить RedirectPath WebseUrl к этому, который будет выглядеть что-то вроде этого:
127.0.0.1 www.someRandomWebsite
Для реализации этого мы будем использовать для цикла. Цикл переиграет каждый URL на массиве веб-сайтов и проверяет, существует ли она внутри файла. Для этого мы будем использовать indexof () Способ строк. Если значение больше нуля, то есть данный веб-сайт присутствует внутри файла хостов, мы можем просто игнорировать. В противном случае, если значение не превышает нуля, нам нужно добавить URL-адрес RedirectPath и веб-сайта (разделенный пробелом) в файл.
fs.readFile(filePath, (err, data) => { fileContents = data.toString(); for(let i=0;i { if (err) return console.log(err); console.log('File Updated Successfully'); }); } else { console.log('Website is present'); } }}); Внутри блокатора: внутри еще – если условие ложно
Если условие неверно, нам необходимо проверить, есть ли веб-сайты в списке в файле хостов. Если они присутствуют, нам нужно удалить их.
Для удаления мы будем использовать простой трюк. Мы прочитаем файловую строку по строке. Мы создаем пустую строку и проверяем, содержит ли текущая строка на любой из веб-сайтов, присутствующих в списке. Если да, мы просто игнорируем это. В противном случае мы добавим эту строку в строку, которую мы инициализированные. После проверки последней строки мы просто заменим текущее содержимое файла этой полноценной строкой.
Код для этого очень легко. Сначала инициализируйте пустую строку ( 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); }});Теперь, когда у нас есть доступ к каждой строке, мы можем проверить, содержит ли эта строка любой веб-сайт, используя флаг и цикл A для LOOP. Мы устанавливаем флаг 1 (или верному), а затем запустите цикл, чтобы перебраться через список веб-сайтов. Если линия содержит текущий веб-сайт (мы проверим его, используя String.indexof (подстрока) Метод), сбросьте флаг до 0 и разбейте текущую петлю. За пределами цикла мы проверяем, если флаг 1 (или правда), мы добавляем текущую строку в CompleteContent Переменная.
Пожалуйста, также обратите внимание что Если флаг 1, мы также проверяем, является ли текущая строка последней линией или нет. Если это не последняя строка, мы добавляем текущую строку в CompleteContent строка вместе с "\ N" так что следующая строка будет добавлена в CompleteContent из новой линии (или с перерывом линии). Следуйте по следующему коду внутри Foreach () вышеуказанного блока кода.
let flag = 1;for (let i=0; i= 0) { // line contains website flag = 0; break; }}
if(flag == 1) { if (line === '') completeContent += line; else completeContent += line + "\n";}3. Запуск кода для функции блокатора
Вот код для функции блокатора, на всякий случай, если вы были путать с распределенным кодом в разделе 2:
Теперь, для выполнения этой функции непрерывно, мы можем пойти на в то время как (правда) {} как бесконечная петля. Внутри этого мы можем дать некоторую задержку, чтобы он не был занимать процессор непрерывно.
Или лучший вариант – использовать SetInterval () функция. Это продолжает повторять функцию блокатора после определенного интервала времени. Но SetInterval () будет работать впервые после указанной задержки. Поэтому нам придется позвонить в блокировку функцию один раз перед функцией setinterval.
blocker();setInterval(blocker, delay);
4. Все сделано! Давайте проверим наш скрипт
Время запустить наш скрипт. Чтобы запустить скрипт, откройте настоящий рабочий каталог в терминале и введите следующую команду:
sudo node blocker.js
Если вы являетесь пользователем Windows, вы можете открыть командную строку в качестве администратора, перейдите в каталог проекта, а затем запустите команду:
node blocker.js
Обратите внимание, что только для проверки целей я блокирую Facebook.com Отказ Вот тестовый прогон:
5. Последний шаг …
Для Mac и Linux
Вы можете запланировать этот скрипт, когда кто-то запускает систему, используя Crontab. CRON – это планировщик заданий на основе времени в Unix-подобных компьютерных операционных системах. Вы можете узнать больше о Cron здесь Отказ
Поэтому мы будем добавлять нашу команду, через которую мы запустим скрипт ( Sudo Node Blocker.js ) в таблице Cron. Это очень просто: откройте терминал, используя Ctrl + Alt + T Затем открыть Crontab, используя Sudo Crontab -e Отказ Эта команда откроет таблицу CRON.
Примечание что Мы использовали Sudo Crontab , не Crontab Отказ Это позволит нам изменить таблицу CRON.
После того, как у вас он открыт, добавьте эту строку в конце (замените Path-to-script с пути каталога вашего проекта):
@reboot node /path-to-script/blocker.js
Вот и все! Это запускает ваш скрипт каждой перезагрузки системы.
Для окон
Сценарий может быть запланирован для запуска каждый раз, когда система также начинается в Windows. Здесь это очень хорошая статья, которая говорит, как это сделать.
Куда пойти отсюда?
Вы энтузиаст с открытым исходным кодом? Хотите внести свой вклад в этот проект? Я начинаю новый проект с открытым исходным кодом по имени «Контроль – сами» который будет настольным приложением, сделанным с использованием Электрон Отказ Особенности будут включать в себя:
- принимать входы от пользователей, о которых они хотят заблокировать, какие сайты
- Отслеживание времени Пользователь проводит просмотр веб-сайтов в социальных сетях
- Таймер Помодоро
- и приложение перечисления TODO с ежедневным отчетом о производительности.
Проверьте Репозиторий И добавьте комментарий «заинтересован» по вопросу, на котором вы заинтересованы.
Теперь позвольте мне дать вам полный код с надлежащими комментариями, которые помогут вам понять код:
Полный код (Blocker.js)
Вот и все
Вы нашли статью полезной?
Подписаться на TheilanProgramammer быть первым, кто получает уведомление от меня для будущих обновлений.
Не стесняйтесь добраться до меня в любое время, если вы хотите что-то обсудить: D
Я был бы более чем счастливым, если вы отправите свой отзыв или предложению, или если вы задаете вопросы. Более того, я люблю новых друзей – так что просто брось мне письмо.