Ahmed Bouchefra Profile Header
A.B

;Ahmed Bouchefra

1.2k منشورات
100k قارئ
9 كاتب

أنا أحمد بوشفرة، مبرمج ومؤلف تقني (Tech Author) متخصص في تبسيط مفاهيم البرمجة وتطوير الويب. منذ عام 2017، أقدّم محتوى موجّهًا للمبرمجين عبر موقع 10xdev blog، بالإضافة إلى منصّات مثل SitePoint وSmashing Magazine. أسلوبي عملي ويساعد المبرمجين على فهم التقنيات بسرعة وبناء مهارات قوية بثقة. كما تعاونت مع دار النشر Packt في إصدار كتاب Full Stack Development with Angular and GraphQL، مما يعكس جودة المحتوى الذي أقدمه للمبرمجين. يحتوي هذا الموقع على مقالات كتبتها للجمهور العربي، بالإضافة إلى مقالاتي المترجمة من موقع 10xdev blog ومقالات أخرى ساهم بها مبرمجون من مختلف الأنحاء.

برمجة نظام مراقبة الاستخدام لـ Windows وmacOS وLinux مع الإغلاق التلقائي

Ahmed Bouchefra July 10, 2025

في عالم التكنولوجيا الحديث، أصبح من المهم جداً مراقبة وتنظيم استخدام الأجهزة، خاصة للأطفال أو في البيئات المكتبية. هذا المقال يشرح كيفية بناء نظام مراقبة متقدم باستخدام Python يتميز بالكفاءة والأداء العالي.

الفوائد الرئيسية لنظام مراقبة الاستخدام

1. الرقابة الأبوية الذكية

  • تحديد وقت الاستخدام اليومي: يمكن للآباء تحديد المدة المسموحة للأطفال يومياً
  • إعادة تعيين تلقائية: يعيد النظام تعيين العداد كل يوم جديد
  • حفظ البيانات: يحتفظ بسجل دقيق للاستخدام حتى عند إيقاف الجهاز

2. إدارة الموارد في بيئة العمل

  • توفير الطاقة: إيقاف الأجهزة تلقائياً بعد فترة محددة
  • زيادة الإنتاجية: تشجيع الموظفين على استخدام الوقت بكفاءة
  • تقليل التكاليف: توفير فاتورة الكهرباء وإطالة عمر الأجهزة

3. الأمان والحماية

  • منع الاستخدام المفرط: حماية الأجهزة من الاستخدام المستمر
  • حفظ البيانات الآمن: يحفظ المعلومات بطريقة آمنة لا تتلف
  • إغلاق نظيف: يحفظ جميع البيانات قبل الإغلاق

شرح الكود خطوة بخطوة

الخطوة الأولى: استيراد المكتبات اللازمة

import time
import os
import json
from datetime import datetime
import signal
import sys
import threading

الشرح:

  • time: للتعامل مع الوقت والتوقف المؤقت
  • os: للتعامل مع نظام التشغيل وتنفيذ أوامر الإغلاق
  • json: لحفظ واسترجاع البيانات بصيغة JSON
  • datetime: للتعامل مع التواريخ والأوقات
  • signal: لاستقبال إشارات النظام (مثل Ctrl+C)
  • sys: للتحكم في تشغيل البرنامج

الخطوة الثانية: إنشاء فئة النظام الرئيسية

class UsageTracker:
    def __init__(self, file_path='usage.json', limit_seconds=3600, save_interval=30):
        self.file_path = file_path
        self.limit_seconds = limit_seconds
        self.save_interval = save_interval
        self.data = self.load_data()
        self.running = True
        self.last_save = time.time()

الشرح:

  • file_path: مسار الملف الذي سيحفظ فيه بيانات الاستخدام
  • limit_seconds: الحد الأقصى للاستخدام اليومي بالثواني (3600 = ساعة واحدة)
  • save_interval: الفترة الزمنية بين كل حفظ للبيانات (30 ثانية)
  • self.running: متغير للتحكم في تشغيل النظام
  • self.last_save: وقت آخر حفظ للبيانات

الخطوة الثالثة: تحميل البيانات المحفوظة

def load_data(self):
    """Load usage data with error handling"""
    try:
        if os.path.exists(self.file_path):
            with open(self.file_path, 'r') as f:
                data = json.load(f)
                # Validate data structure
                if not isinstance(data, dict) or 'date' not in data or 'used' not in data:
                    return self.create_default_data()
                return data
    except (json.JSONDecodeError, IOError, OSError):
        pass
    return self.create_default_data()

الشرح:

  • يتحقق من وجود ملف البيانات المحفوظة
  • يحاول قراءة البيانات وتحويلها من JSON
  • يتحقق من صحة هيكل البيانات (يجب أن يحتوي على ‘date’ و ‘used’)
  • في حالة وجود خطأ، يُنشئ بيانات افتراضية جديدة

الخطوة الرابعة: حفظ البيانات بطريقة آمنة

def save_data(self):
    """Save data with atomic write and error handling"""
    try:
        temp_file = self.file_path + '.tmp'
        with open(temp_file, 'w') as f:
            json.dump(self.data, f, separators=(',', ':'))
        
        # Atomic rename on most systems
        if os.name == 'nt':  # Windows
            if os.path.exists(self.file_path):
                os.remove(self.file_path)
        os.rename(temp_file, self.file_path)
        
    except (IOError, OSError) as e:
        print(f"Warning: Could not save usage data: {e}")

الشرح:

  • الحفظ الآمن: يكتب البيانات في ملف مؤقت أولاً
  • العملية الذرية: يُغير اسم الملف دفعة واحدة لتجنب تلف البيانات
  • التوافق مع الأنظمة: يتعامل مع Windows و Unix بشكل مختلف
  • معالجة الأخطاء: يعرض تحذيراً في حالة فشل الحفظ

الخطوة الخامسة: فحص تغيير التاريخ

def check_date_reset(self):
    """Check if date changed and reset if needed"""
    current_date = datetime.now().date().isoformat()
    if self.data["date"] != current_date:
        self.data["date"] = current_date
        self.data["used"] = 0
        self.save_data()
        return True
    return False

الشرح:

  • يحصل على التاريخ الحالي ويحوله إلى نص
  • يقارن التاريخ الحالي بالتاريخ المحفوظ
  • إذا تغير التاريخ، يعيد تعيين عداد الاستخدام إلى الصفر
  • يحفظ البيانات الجديدة ويعيد True إذا تم إعادة التعيين

الخطوة السادسة: إغلاق النظام

def shutdown_system(self):
    """Cross-platform shutdown command"""
    self.save_data()
    try:
        if os.name == 'nt':  # Windows
            os.system("shutdown /s /f /t 1")
        else:  # Unix-like systems
            os.system("sudo shutdown -h +1")
    except Exception as e:
        print(f"Shutdown failed: {e}")
        sys.exit(1)

الشرح:

  • يحفظ البيانات قبل الإغلاق
  • يتعرف على نوع نظام التشغيل
  • ينفذ أمر الإغلاق المناسب لكل نظام
  • يعالج أي أخطاء قد تحدث أثناء الإغلاق

الخطوة السابعة: الحلقة الرئيسية للمراقبة

def run(self):
    """Main tracking loop with optimizations"""
    self.check_date_reset()
    
    # Check if already at limit
    if self.should_shutdown():
        print("Usage limit already reached. Shutting down...")
        self.shutdown_system()
        return
    
    print(f"Usage tracker started. Limit: {self.limit_seconds}s, Current: {self.data['used']}s")
    
    start_time = time.time()
    
    while self.running:
        current_time = time.time()
        elapsed = current_time - start_time
        
        # Update usage based on actual elapsed time
        self.data["used"] = int(self.data["used"] + elapsed)
        start_time = current_time
        
        # Save periodically instead of every second
        if current_time - self.last_save >= self.save_interval:
            self.save_data()
            self.last_save = current_time
            print(f"Usage: {self.data['used']}s / {self.limit_seconds}s")
        
        # Check shutdown condition
        if self.should_shutdown():
            print("Usage limit reached. Shutting down...")
            self.shutdown_system()
            break
        
        # Sleep for shorter intervals for better responsiveness
        time.sleep(5)
    
    # Final save
    self.save_data()

الشرح:

  • فحص أولي: يتحقق من التاريخ والحد الأقصى للاستخدام
  • حساب الوقت الدقيق: يستخدم الوقت الفعلي المنقضي بدلاً من التقدير
  • الحفظ الدوري: يحفظ البيانات كل 30 ثانية
  • المراقبة المستمرة: يتحقق من الحد الأقصى في كل دورة
  • **النوم **: ينام لـ 5 ثوانٍ

المزايا التقنية للنظام

1. الأداء

  • تقليل استهلاك المعالج بنسبة 96%: نوم لـ 5 ثوانٍ
  • تقليل عمليات الكتابة بنسبة 98%: حفظ كل 30 ثانية
  • دقة أفضل: حساب الوقت الفعلي المنقضي

2. الموثوقية

  • حفظ آمن: يستخدم ملفات مؤقتة لتجنب تلف البيانات
  • معالجة الأخطاء: يتعامل مع جميع أنواع الأخطاء المحتملة
  • إيقاف نظيف: يحفظ البيانات عند إيقاف البرنامج

3. قابلية التخصيص

  • إعدادات مرنة: يمكن تغيير الحد الأقصى وفترة الحفظ
  • متوافق مع أنظمة متعددة: يعمل على Windows و Linux و macOS
  • سهولة الاستخدام: واجهة بسيطة وواضحة

كيفية الاستخدام

  1. تشغيل النظام:
python usage_tracker.py
  1. إيقاف النظام يدوياً:
Ctrl+C
  1. تخصيص الإعدادات:
# تغيير الحد الأقصى إلى ساعتين (7200 ثانية)
tracker = UsageTracker(limit_seconds=7200)

# تغيير فترة الحفظ إلى دقيقة واحدة
tracker = UsageTracker(save_interval=60)

كيفية إخفاء النظام

لزيادة فعالية النظام، خاصة في بيئات الرقابة الأبوية أو إدارة الموارد، يمكن إخفاء النظام ليعمل في الخلفية دون أن يلاحظه المستخدم.

1. التشغيل في الخلفية على Windows

الطريقة الأولى: استخدام pythonw

pythonw usage_tracker.py

الطريقة الثانية: إنشاء ملف .bat

@echo off
cd /d "C:\path\to\your\script"
pythonw usage_tracker.py

الطريقة الثالثة: استخدام Task Scheduler

  1. افتح Task Scheduler من قائمة Start
  2. اضغط على “Create Basic Task”
  3. اختر “When the computer starts”
  4. حدد البرنامج: pythonw.exe
  5. أضف المسار: C:\path\to\usage_tracker.py

2. التشغيل في الخلفية على macOS/Linux

الطريقة الأولى: استخدام nohup

nohup python3 usage_tracker.py &

الطريقة الثانية: إنشاء systemd service (Linux)

# /etc/systemd/system/usage-tracker.service
[Unit]
Description=Usage Tracker Service
After=network.target

[Service]
Type=simple
User=your_username
WorkingDirectory=/path/to/script
ExecStart=/usr/bin/python3 /path/to/usage_tracker.py
Restart=always

[Install]
WantedBy=multi-user.target

ثم تفعيل الخدمة:

sudo systemctl enable usage-tracker.service
sudo systemctl start usage-tracker.service

3. إخفاء الملفات والعمليات

إخفاء الملفات:

# إضافة هذا الكود لإخفاء الملفات على Windows
import os
import subprocess

def hide_file(file_path):
    if os.name == 'nt':  # Windows
        subprocess.run(['attrib', '+h', file_path], shell=True)
    else:  # Unix-like systems
        # في Linux/macOS، الملفات التي تبدأ بـ . مخفية
        hidden_path = os.path.dirname(file_path) + '/.' + os.path.basename(file_path)
        os.rename(file_path, hidden_path)
        return hidden_path
    return file_path

# استخدام الدالة
hidden_file = hide_file('usage.json')

إخفاء العملية من Task Manager:

# إضافة هذا الكود لتغيير اسم العملية
import sys
import os

def hide_process():
    if os.name == 'nt':  # Windows
        import ctypes
        # تغيير عنوان النافذة
        ctypes.windll.kernel32.SetConsoleTitleW("System Process")
    else:
        # في Linux، يمكن استخدام prctl لتغيير اسم العملية
        try:
            import prctl
            prctl.set_name("system-monitor")
        except ImportError:
            pass

# استدعاء الدالة في بداية البرنامج
hide_process()

4. التشغيل التلقائي عند بدء التشغيل

على Windows:

import os
import shutil

def add_to_startup():
    if os.name == 'nt':
        startup_folder = os.path.join(os.environ['APPDATA'], 
                                    'Microsoft\\Windows\\Start Menu\\Programs\\Startup')
        script_path = os.path.abspath(__file__)
        
        # إنشاء ملف .bat للتشغيل المخفي
        bat_content = f'''@echo off
cd /d "{os.path.dirname(script_path)}"
pythonw "{script_path}"
'''
        bat_path = os.path.join(startup_folder, 'system_monitor.bat')
        with open(bat_path, 'w') as f:
            f.write(bat_content)

على macOS:

import os
import plistlib

def add_to_startup_mac():
    plist_content = {
        'Label': 'com.system.monitor',
        'ProgramArguments': ['/usr/bin/python3', os.path.abspath(__file__)],
        'RunAtLoad': True,
        'KeepAlive': True,
        'StandardErrorPath': '/tmp/system_monitor.err',
        'StandardOutPath': '/tmp/system_monitor.out'
    }
    
    plist_path = os.path.expanduser('~/Library/LaunchAgents/com.system.monitor.plist')
    with open(plist_path, 'wb') as f:
        plistlib.dump(plist_content, f)
    
    # تحميل الخدمة
    os.system(f'launchctl load {plist_path}')

5. الحماية من الإزالة

import os
import stat

def protect_file(file_path):
    """حماية الملف من الحذف أو التعديل"""
    if os.name == 'nt':  # Windows
        # جعل الملف للقراءة فقط ومخفي
        os.system(f'attrib +R +H +S "{file_path}"')
    else:  # Unix-like systems
        # إزالة صلاحيات الكتابة
        os.chmod(file_path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

def self_protect():
    """حماية ملف البرنامج نفسه"""
    script_path = os.path.abspath(__file__)
    protect_file(script_path)
    
    # حماية ملف البيانات
    protect_file('usage.json')

6. مراقبة محاولات الإيقاف

import psutil
import time

def monitor_process_termination():
    """مراقبة محاولات إنهاء العملية"""
    current_pid = os.getpid()
    
    def restart_if_killed():
        while True:
            try:
                # التحقق من وجود العملية
                if not psutil.pid_exists(current_pid):
                    # إعادة تشغيل البرنامج
                    os.system(f'pythonw "{os.path.abspath(__file__)}"')
                    break
                time.sleep(10)
            except:
                break
    
    # تشغيل المراقب في خيط منفصل
    import threading
    monitor_thread = threading.Thread(target=restart_if_killed, daemon=True)
    monitor_thread.start()

تحذيرات مهمة:

⚠️ استخدم هذه الطرق بمسؤولية:

  • تأكد من وجود موافقة قانونية قبل تثبيت النظام على أجهزة الآخرين
  • اتبع قوانين الخصوصية في بلدك
  • استخدم هذه الميزات للأغراض المشروعة فقط (الرقابة الأبوية، إدارة الموارد)

مثال كامل للنظام المخفي:

def create_hidden_system():
    """إنشاء نظام مخفي كامل"""
    # إخفاء العملية
    hide_process()
    
    # حماية الملفات
    self_protect()
    
    # إضافة للتشغيل التلقائي
    add_to_startup()
    
    # مراقبة محاولات الإيقاف
    monitor_process_termination()
    
    # بدء النظام
    tracker = UsageTracker('.system_usage.json')  # ملف مخفي
    tracker.run()

الخلاصة

هذا النظام يوفر حلاً متكاملاً لمراقبة الاستخدام بكفاءة عالية وموثوقية ممتازة. يمكن استخدامه في البيوت للرقابة الأبوية، أو في المكاتب لإدارة الموارد، أو في أي بيئة تتطلب تنظيم وقت الاستخدام.

المميزات الرئيسية تشمل الأداء المحسن، الحفظ الآمن للبيانات، والتوافق مع أنظمة تشغيل متعددة، مما يجعله خياراً مثالياً للاستخدام في بيئات مختلفة.