ایجاد Website Blocker با استفاده از پایتون

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 04 مرداد 1397
دسته بندی ها : پایتون

درست است که اپلیکیشن‌های مختلف بسیاری برای بلاک کردن وبسایت‌ها وجود دارد، اما چرا وقتی خودتان می‌توانید آن را بنویسید، سراغ دیگر اپلیکیشن‌ها می‌روید؟ بهتر است که اپلیکیشن سفارشی مربوط به خودتان را طراحی کنید. این دقیقا کاری‌ست که ما در این مطلب قصد انجام دادنش را داریم. می‌خواهیم اپلیکیشنی طراحی کنیم که با استفاده از آن دسترسی به تعدادی از وبسایت‌ها از طریق این کامپیوتر و یا کامپیوترهای مربوط به یک شبکه محلی محدود شود. ایجاد اپلیکیشن خودتان، به شما کنترل کامل و انعطاف‌پذیری لازم را می‌دهد، می‌توانید دقیقا چیزی که می‌خواهید را ایجاد کنید. زبانی که برای ساخت چنین اپلیکیشنی استفاده می‌کنیم، جزو قدرتمندترین زبان‌های برنامه‌نویسی در دنیا است. بله منظورمان پایتون است. 

نیازمندی‌ها

  • پایتون ۳ 
  • دانشی پایه از پایتون

قرار است چه چیزی را ایجاد کنیم؟

قصد داریم اپلیکیشنی را با استفاده از پایتون ایجاد کنیم که در پس‌زمینه سیستم عامل اجرا شده و دسترسی به لیستی از وبسایت‌ها را در ساعات کاری ۹ تا ۵ قطع می‌کند. ما اینکار را با استفاده‌ از کتابخانه‌های داخلی پایتون انجام می‌دهیم، بنابراین نیازی به نصب پکیج‌های خارجی نداریم. 

چگونه قرار است وبسایت‌ها را بلاک کنیم؟ هر سیستم عاملی یک فایل مربوط به هاست‌ها را با نام hosts در اختیار دارد. از این فایل برای محدود کردن دسترسی به وبسایت‌ها و دامنه‌ها استفاده می‌شود. بیشتر اپلیکیشن‌ها وبسایت بلاکر و... نیز از این فایل استفاده می‌کنند. تصویر زیر فایل hosts را در Notepad اجرا می‌کند:

کامنت‌ها را در نظر نگیرید و به پایین‌تر از آن‌ها مراجعه کنید:

127.0.0.1 www.facebook.com
127.0.0.1 www.twitter.com

کاری که این دستور انجام می‌دهد این است که در صورت فرستادن درخواست برای اجرای وبسایت فیسبوک یا توییتر، سیستم عامل شما را به آدرس محلی یعنی 127.0.0.1 بازمی‌گرداند.

 

اپلیکیشن ما قرار است با استفاده از دستورهای مربوط به انجام تغییرات در فایل، این فایل را باز کرده و خطوط جدیدی را به آن اضافه کند.

خب چرا وقتی می‌توانیم این کار را از طریق یک ابزار ویرایشگر ساده انجام دهیم، باید برای آن برنامه بنویسیم؟ در حقیقت برنامه‌ ما کار بیشتری را انجام می‌دهد. وقتی که برنامه را اجرا کردید این برنامه همواره در پس زمینه می‌ماند و این خطوط را به برنامه هر روز ساعت ۹ صبح اضافه می‌کند. همچنین تا ساعت ۵ این برنامه هر دو دقیقه یک‌بار ساعت را بررسی می‌کند و در نهایت راس ساعت ۵ دو خط را از برنامه حذف می‌کند. در این برنامه از کتابخانه‌های داخلی date و datetime پایتون استفاده می‌کنیم. این موضوع راه‌حل بسیار منطقی و ساده‌ای است، به این خاطر که در یک شرکت بزرگ با کامپیوترهای زیاد، مطمئنا نمی‌خواهید که فایل hosts هر کامپیوتر را تغییر دهید. توضیحات کافی است، شروع به کدنویسی کنیم. ابتدای کار کتابخانه‌های مورد نیازمان را وارد پروژه می‌کنیم:

import date
from datetime import datetime as dt

بعد از این کار یک لیست از وبسایت‌هایی که قصد بلاک آن‌ها را داریم ایجاد می‌کنیم:

website_list=["www.facebook.com","facebook.com","www.twitter.com","twitter.com"]

می‌توانید وبسایت‌های بیشتری را نیز به پروژه اضافه کنید. در سیستم عامل ویندوز، فایل hosts که به آن احتیاج داریم در آدرس C:\Windows\System32\Drivers\etc\hosts قرار دارد.

این مسیر را در یک رشته raw قرار می‌دهیم. منظور از رشته raw رشته‌ای است که در آن یک متن همراه با کاراکترهای منحصر به فردی قرار می‌گیرد. برای اینکار به صورت زیر عمل می‌کنیم:

hosts_file = r”C:\Windows\System32\Drivers\etc\hosts”

بعد از آن یک رشته دیگر برای آدرس ریدایرکت ایجاد می‌کنیم:

redirect = "127.0.0.1"

برای اینکه هر دو دقیقه زمان را بررسی کنیم، یک حلقه بی پایان loop می‌نویسیم:

while True:
time.sleep(120)

این حلقه همیشه اجرا می‌شود، به این خاطر که مقدار حلقه همواره برابر با True است. تابع sleep برنامه را به مدت ۱۲۰ ثانیه در اجرای هر حلقه نگه می‌دارد. این موضوع یک راهکار منطقی و عاقلانه است، به این خاطر که مطمئنا قصد ندارید برنامه منابع سیستم را بدون استفاده به خود اختصاص دهد. حال دو سناریو در پیش روست. زمان باید بین ۹ تا ۵ باشد و یا اینکه زمان باید خارج از ۹ تا ۵ باشد. برای هر کدام از این شرایط می‌توانیم مجموعه‌ای متفاوت از دستورالعمل‌ها را اجرا کنیم. بنابراین ما به یک if-else نیاز داریم.

اولین سناریو: ساعات کاری

اولین if مورد نظر ما ساعت کنونی را از سیستم عامل دریافت می‌کند. بعد از آن بررسی می‌کند که آیا در بین ساعات کاری قرار دارد یا خیر. 

if dt(dt.now().year,dt.now().month,dt.now().day,9) < dt.now() < dt(dt.now().year,dt.now().month,dt.now().day,17):

اگر زمان در بین ساعات کاری قرار داشت، فایل host را در حالت r+ باز می‌کنیم. حال می‌توانیم فایل را بخوانیم و در آن بنویسیم. 

with open(hosts_file,'r+') as file:

    content=file.read()

حال باید یک بررسی را انجام دهیم. براساس یک حلقه در لیست وبسایت‌ها، ما باید وجود یا عدم وجود نام وبسایت در فایل hosts را بررسی کنیم. اگر وجود داشت که هیچ کاری لازم به انجام نیست، در غیر اینصورت باید محتویات جدید را اضافه کنیم.

for website in website_list:
    if website in content:
    #Do nothing
        pass
    else:
        file.write(redirect+" "+ website+"\n")

سناریو دوم: بعد از ساعات کاری

حال ساعت کاری به پایان رسیده، چه کسی دوست ندارد وارد شبکه‌های اجتماعی شود؟ بنابراین حال مجبور هستیم که کدهایی را بنویسیم تا بتواند خطوط مورد نظر را حذف کند. به نظر می‌رسد این قسمت کمی سخت باشد. ما می‌خواهیم که خطوطی را از متن حذف کنیم، اما هیچ متدی برای انجام چنین کاری وجود ندارد. راه‌حل موجود برای این کار این است که فایل را به صورت کامل و خط به خط با استفاده از متد file.readlines() بخوانیم و بعد خطوطی که قصد حذف آن‌ها از فایل را داریم انتخاب کنیم. بعد از اینکار ما محتویات را دوباره در فایل می‌نویسیم. حال بیایید فایل را در حالت r+ باز کرده و وجود لیست وبسایت‌ها را بررسی کنیم.

else:
    with open(hosts_path,'r+') as file:
        content=file.readlines()

حال ما خطوط را در یک لیست با نام content قرار داده‌ایم بیایید با استفاده از متد file.seek() به ابتدای فایل برگشته و وجود لیست وبسایت‌ها را در لیست خطوط بررسی کنیم. 

 file.seek(0)
            for line in content:
                if not any(website in line for website in website_list):
                    file.write(line)

بعد از آن برای اینکه حلقه for چندین بلاک متنی را قرار ندهد، از متد truncate  استفاده می‌کنیم.

file.truncate()

حال برنامه ما آماده برای اجرا کردن است. فایل اجرا شدنی فایل تنها با دسترسی مدیر سیستم اجرا می‌شود، به این دلیل که نیاز دارد تا از فایل سیستمی hosts استفاده کند. پس حساب‌های کاربری عادی نمی‌توانند با آن کار بکنند. اسکریپت را در CMD یا محیط ترمینال اجرا کنید. به دایرکتوری پروژه رفته و فایل پایتون را اجرا کنید. حال به وبسایت Facebook بروید:

عالی است حال اسکریپت ما به خوبی کار می‌کند. حال برای اینکه برنامه بتواند در پس‌زمینه اجرا شود باید پسوند فایل پایتون را از py به pyw تغییر دهید. بدین صورت اسکریپت به صورت یک برنامه اجرایی شناخته خواهد شد و Pythonw.exe برای سیستم عامل ایجاد می‌شود. برنامه را اجرا کرده و به قسمت Task Manager بروید. خواهید دید که برنامه در قسمت پردازش‌ها قرار دارد:

ایجاد Website Blocker با استفاده از پایتون

می‌توانید این برنامه را در قسمت startup نیز قرار دهید. بنابراین برنامه هر وقت که کامپیوتر اجرا شد، اجرا می‌شود. 

ایجاد Website Blocker با استفاده از پایتون

حال ما یک برنامه پایتونی که به خوبی کار می‌کند را در اختیار داریم. 

سورس کد کامل:

import time
from datetime import datetime as dt

hosts_file=r"C:\Windows\System32\Drivers\etc\hosts"
local="127.0.0.1"
website_list=["www.facebook.com","facebook.com","www.twitter.com","twitter.com"]

while True:
    if dt(dt.now().year,dt.now().month,dt.now().day,9) < dt.now() < dt(dt.now().year,dt.now().month,dt.now().day,17):
        with open(hosts_file,'r+') as file:
            content=file.read()
            for website in website_list:
                if website in content:
                    pass
                else:
                    file.write(local+" "+ website+"\n")
    else:
        with open(hosts_file,'r+') as file:
            content=file.readlines()
            file.seek(0)
            for line in content:
                if not any(website in line for website in website_list):
                    file.write(line)
            file.truncate()
    time.sleep(120)

منبع

مقالات پیشنهادی

ایجاد افزونه کروم با استفاده از پایتون

تا به حال از افزونه‌های کروم استفاده کرده‌اید؟ اگر جواب‌تان بله است، پس مطمئنا تا به حال از خودتان پرسیده‌اید که این افزونه‌ها چگونه ساخته می‌شود. اگر...

ایجاد اپلیکیشنی مدرن با استفاده از Django و Vue.js - بخش دوم

JWT یک URL-safe کوچک است که برای نمایش درستی یک انتقال بین دو موجودیت استفاده می‌شود. درستی در JWT در یک شئ اینکود شده داخل JSON قرار دارد و به عنوان...

ایجاد اپلیکیشنی مدرن با استفاده از Django و Vue.js - بخش اول

در این مقاله ما قصد داریم از چهارچوب Django و Django REST برای بک‌اند و Vue.js برای فرانت‌اند است. APIها با کمک Axois (یک کتابخانه HTTP Client) از طری...

آموزش زبان برنامه نویسی پایتون – قسمت پنجم

در جلسه پنجم از آموزش پایتون قصد داریم تا شما رو با توابع آشنا کنم. مفهوم مهم و کاربردی که در زبان های برنامه نویسی و در خود مفهوم برنامه نویسی کاربرد...