آموزش پایتون: ساخت اپلیکیشن مسدود کننده وب‌ سایت در ۳ مرحله — به زبان ساده

۳۴۵ بازدید
آخرین به‌روزرسانی: ۰۵ مهر ۱۴۰۲
زمان مطالعه: ۶ دقیقه
آموزش پایتون: ساخت اپلیکیشن مسدود کننده وب‌ سایت در ۳ مرحله — به زبان ساده

دنیا به سرعت در حال پیشرفت است و فناوری نیز از این قاعده مستثنی نیست. هر روز با چیزهای جدیدی آشنا می‌شویم که تاکنون هرگز به گوشمان هم نخورده بود. اما این وضعیت یک مشکل محسوب نمی‌شود. مشکل اینجا است که چگونه می‌توان منابع مناسبی برای یادگیری همه چیز با ترتیب درست یافت؟ ما در بلاگ فرادرس با ارائه این سری مقالات آموزش عملی پایتون به شما کمک می‌کنیم تا به صورت مرحله به مرحله پایتون را بیاموزید. بنابراین با ما تا انتهای این مقاله نیز همراه باشید. در این نوشته می‌خواهیم اقدم به ساخت یک اپلیکیشن مسدود کننده وب‌ سایت کنیم که دارای یک ساختار ساده و عملیات فایل است و به درک عمیق مفاهیم اساسی پایتون کمک می‌کند.

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

مرحله اول

ابتدا با محیط آغاز می‌کنیم، زیرا محیط مهم است. برای راه‌اندازی محیط در پایتون سه گام اساسی وجود دارد. ابتدا باید مسیر فایل hosts را پیدا کنید.

در ویندوز این فایل در مسیر زیر قرار دارد:

C:\Windows\System32\drivers\etc\hosts

در لینوکس نیز مسیر فایل hosts به صورت زیر است:

linux- etc/hosts

اگر معلومات رایانه‌ای‌تان خوب است، این احتمال وجود دارد که قبلاً سروکارتان به این فایل افتاده باشد. اما اگر چنین نیست باید بگوییم که فایل hosts می‌تواند برای نگاشت hostname-ها به آدرس‌های IP استفاده شود. یعنی با آن می‌توان وب‌سایت‌ها را ریدایرکت کرده و یا با ارجاع به localhost آن‌ها را مسدود کرد و این موضوع در هر سیستم عامل، موضوعی حساس محسوب می‌شود.

در گام دوم باید آدرس IP را که می‌خواهیم وب‌سایتمان به آن ریدایرکت شود را تعریف کنیم که در این مورد localhost است. localhost به طور معمول hostname استاندارد است که به خود سیستم داده می‌شود. localhost به وسیله آدرس IP 127.0.0.1 نمایش می‌یابد. در نهایت فهرستی از وب‌سایت‌هایی که می‌خواهیم مسدود کنیم تهیه می‌کنیم.

1#Path to the host file
2host_path = "/etc/hosts"
3
4#Redirect to local host
5redirect = "127.0.0.1"
6
7#Websites to block
8website_list = ["www.netflix.com","www.facebook.com"]

مرحله دوم

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

ما در این جا از حلقه while استفاده می‌کنیم، چون کد را به سرعت اجرا می‌کند. اینک در شرط if بررسی می‌کنیم که آیا زمان جاری بین 8 صبح تا 4 بعد از ظهر است یا نه. بنابراین که اگر ساعت کاری بود، عبارت work time و در غیر این صورت عبارت idle time نمایش یابد. کد (time.sleep(5 یک تأخیر پنج‌ثانیه‌ای ایجاد می‌کند که قطعاً قابل درک است.

دقت کنید که جهت رعایت امنیت بهتر است فایل hosts را به دایرکتوری کاری خود کپی کنید و به جای فایل اصلی، مسیر آن را به برنامه بدهید. زمانی که همه موارد مورد نیاز را گردآوری کردیم مسیر را دوباره به مسیر اصلی تعیین می‌کنیم:

1#Import libraries
2import time
3from datetime import datetime as dt
4
5#Path to the host file, redirect to local host, list of websits to block
6host_path = "/etc/hosts"
7redirect = "127.0.0.1"
8website_list = ["www.netflix.com","www.facebook.com"]
9
10#Condition
11while True:
12    #Check for the current time
13    if dt(dt.now().year,dt.now().month,dt.now().day,8) < dt.now() < dt(dt.now().year,dt.now().month,dt.now().day,16):
14        print("Work Time")
15    else:
16        print("Idel Time")
17time.sleep(5)

مرحله سوم

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

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

1while True:
2    #Check for the current time
3    if dt(dt.now().year,dt.now().month,dt.now().day,8) < dt.now() < dt(dt.now().year,dt.now().month,dt.now().day,16):
4        print("Work Time")
5        #Open file and read the content
6        file = open(host_path,"r+")
7        content = file.read()
8        for website in website_list:
9            if website in content:
10                pass
11            else:
12                #Write the IP of loalhost and name of the website to block
13                file.write(redirect + " " + website + "\n")
14    else:
15print("Idle Time")

block websites

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

file.readlines()

عملیات فایل

عبارت (file.seek(0 برای قرار دادن اشاره‌گر در موقعیت ابتدایی فایل استفاده می‌شود. اینک به جاهای مهم رسیده‌ایم. ما باید فایل را دو بار و با سرعت کم بخوانیم. چرخه تکرار تعریف شده شاید به نظرتان پیچیده بیاید؛ اما چنین نیست. در واقع این همان کد if و for است. دستور website in line به بررسی خط نخست فایل hosts می‌پردازد و وب‌سایت‌هایی که باید بررسی شوند از حلقه for به دست می‌آیند. به طور خلاصه معنای کل خط این است که اگر وب‌سایت ما از فهرست وب‌سایت‌های مسدود شده در خطی از فایل hosts قرار نداشته باشد، آن خط باید append/print شود. اگر در آن خط وب‌سایت ما باشد در این صورت آن خط نادیده گرفته می‌شود. امیدواریم با این توضیح متوجه منطق برنامه شده باشید، چون بسیار حائز اهمیت است. بدین ترتیب موفق می‌شویم وب‌سایت‌ها را از فهرست فایل hosts حذف کنیم.

1else:
2        print("Idle Time")
3        #Open hosts file and read content from it- line by line
4        file = open(host_path,'r+')
5        content = file.readlines()
6        #Take back pointer to starting of the file from the end of file
7        file.seek(0)
8        for line in content:
9            #Please check explaination for this line
10            if not any(website in line for website in website_list):
11                file.write(line)
12            file.truncate()
13time.sleep(5)

Idle Time

گام نهایی

بدین ترتیب ما موفق شدیم یک اپلیکیشن مسدودکننده وب‌سایت بسازیم؛ اما نمی‌خواهیم کد را هر روز به صورت دستی اجرا کنیم. به همین دلیل است که باید از یک نرم‌افزار زمان‌بندی وظیفه برای اجرای این کار استفاده کنیم. بدین منظور از Cron Job Scheduler (+) استفاده می‌کنیم. این نرم‌افزار از پیش روی سیستم نصب است و لازم نیست کاری در این خصوص انجام دهید. کافی است جدول cron را با مجوز Sudo و پارامتر e باز کنید:

مسیر فایل اصلی را به همراه یک دستور reboot به صورت زیر وارد کنید:

done

سخن پایانی

بدین ترتیب کار انجام یافته است. ما موفق شدیم فهرست وب‌سایت‌های مورد نظر خود را مسدود کنیم. رایانه خود را مجدداً راه‌اندازی کنید تا اپلیکیشنمان به طور کامل اجرا شود. بحث مسدودسازی وب‌سایت‌ها امروزه یک موضوع رایج است و می‌توان به صورت افزونه در فروشگاه‌های مرتبط با مرورگرها مشاهده کرد. اما شاید عده کمی واقعاً در مورد طرز کار این اپلیکیشن‌ها اطلاع دارند. دانستن طرز کار این اپلیکیشن‌ها مهم است. کد کامل این اپلیکیشن مسدودکننده وب‌سایت به صورت زیر است:

1#Import libraries
2import time
3from datetime import datetime as dt
4
5#Path to the host file, redirect to local host, list of websits to block
6host_path = "etc/hosts"
7redirect = "127.0.0.1"
8website_list = ["www.netflix.com","www.facebook.com"]
9
10#Condition
11while True:
12    #Check for the current time
13    if dt(dt.now().year,dt.now().month,dt.now().day,15) < dt.now() < dt(dt.now().year,dt.now().month,dt.now().day,16):
14        print("Work Time")
15        file = open(host_path,"r+")
16        content = file.read()
17        for website in website_list:
18            if website in content:
19                pass
20            else:
21                file.write(redirect + " " + website + "\n")
22    else:
23        print("Idle Time")
24        file = open(host_path,'r+')
25        content = file.readlines()
26        file.seek(0)
27        for line in content:
28            if not any(website in line for website in website_list):
29                file.write(line)
30            file.truncate()
31time.sleep(2)

برای مطالعه این مجموعه مطلب روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *