درست است که اپلیکیشنهای مختلف بسیاری برای بلاک کردن وبسایتها وجود دارد، اما چرا وقتی خودتان میتوانید آن را بنویسید، سراغ دیگر اپلیکیشنها میروید؟ بهتر است که اپلیکیشن سفارشی مربوط به خودتان را طراحی کنید. این دقیقا کاریست که ما در این مطلب قصد انجام دادنش را داریم. میخواهیم اپلیکیشنی طراحی کنیم که با استفاده از آن دسترسی به تعدادی از وبسایتها از طریق این کامپیوتر و یا کامپیوترهای مربوط به یک شبکه محلی محدود شود. ایجاد اپلیکیشن خودتان، به شما کنترل کامل و انعطافپذیری لازم را میدهد، میتوانید دقیقا چیزی که میخواهید را ایجاد کنید. زبانی که برای ساخت چنین اپلیکیشنی استفاده میکنیم، جزو قدرتمندترین زبانهای برنامهنویسی در دنیا است. بله منظورمان پایتون است.
نیازمندیها
- پایتون ۳
- دانشی پایه از پایتون
قرار است چه چیزی را ایجاد کنیم؟
قصد داریم اپلیکیشنی را با استفاده از پایتون ایجاد کنیم که در پسزمینه سیستم عامل اجرا شده و دسترسی به لیستی از وبسایتها را در ساعات کاری ۹ تا ۵ قطع میکند. ما اینکار را با استفاده از کتابخانههای داخلی پایتون انجام میدهیم، بنابراین نیازی به نصب پکیجهای خارجی نداریم.
چگونه قرار است وبسایتها را بلاک کنیم؟ هر سیستم عاملی یک فایل مربوط به هاستها را با نام 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 بروید. خواهید دید که برنامه در قسمت پردازشها قرار دارد:
میتوانید این برنامه را در قسمت startup نیز قرار دهید. بنابراین برنامه هر وقت که کامپیوتر اجرا شد، اجرا میشود.
حال ما یک برنامه پایتونی که به خوبی کار میکند را در اختیار داریم.
سورس کد کامل:
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)
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید