ساخت ابزار بنچمارک اینترنت و ثبت خودکار در اکسل با پایتون

با این اسکریپت کامل پایتون، پینگ، دانلود و آپلود اینترنت را در بازه‌های زمانی مشخص بسنجید، خودکار در اکسل ثبت کنید و نمودار تغییرات آن را بسازید.

🎧 خلاصه صوتی مقاله (پادکست ۲ دقیقه‌ای):

فرصت مطالعه ندارید؟ چکیده این مطلب را همین‌جا گوش دهید:

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

در این مقاله آموزشی قرار است یک اسکریپت کامل و کاملاً رایگان با زبان برنامه‌نویسی پایتون بسازیم که به صورت خودکار وضعیت شبکه شما را مانیتور کرده، داده‌ها را در قالب فایل اکسل ذخیره نموده و حتی روند تغییرات آن را به کمک نمودار ترسیم کند. اگر به حوزه ابزارهای کاربردی علاقه‌مند هستید، می‌توانید پیش از شروع کدنویسی، نگاهی هم به آموزش ساخت اپلیکیشن چندسکویی با پایتون و فلت (Flet) بیندازید تا با ابعاد بیشتری از قدرت پایتون در توسعه ابزارهای شخصی آشنا شوید.

مسئله اصلی و ضرورت سنجش خودکار کیفیت شبکه

برای گیمرهای آنلاین، فریلنسرهایی که با کارفرمایان خارجی جلسه ویدیویی دارند، یا افرادی که فایل‌های حجیم جابه‌جا می‌کنند، ثبات اتصال (Stability) بسیار مهم‌تر از عدد خام سرعت اسمی است. نوسانات شدید پینگ (Jitter) یا افت ناگهانی پهنای باند در وسط روز می‌تواند تمامی فعالیت‌ها را مختل کند. تست دستی سرعت با سایت‌های مختلف وقت‌گیر است و نمی‌تواند یک روند ۲۴ ساعته را ثبت کند.

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

نصب کتابخانه‌های مورد نیاز

برای انجام این پروژه به چند کتابخانه محبوب و متن‌باز در اکوسیستم پایتون نیاز داریم. کتابخانه speedtest-cli وظیفه ارتباط با سرورهای سنجش سرعت را بر عهده دارد، کتابخانه pandas و openpyxl برای کار با فایل‌های اکسل استفاده می‌شوند و matplotlib برای رسم نمودار روند تغییرات به کار می‌رود.

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

pip install speedtest-cli pandas openpyxl matplotlib

این دستور کتابخانه‌های ذکر شده را از مخزن رسمی پایتون دریافت کرده و آماده استفاده می‌کند. اطمینان حاصل کنید که نسخه پایتون شما ۳.۸ یا بالاتر است.

کد کامل اسکریپت بنچمارک سرعت اینترنت

کد زیر یک اسکریپت یکپارچه و کامل است. این اسکریپت در یک حلقه بی‌نهایت (که می‌توانید آن را مدیریت کنید) در هر بازه زمانی دلخواه (مثلاً هر ۳۰ دقیقه یک‌بار)، سرعت دانلود، آپلود و پینگ را می‌سنجد، زمان دقیق را یادداشت کرده، آن را به یک فایل اکسل اضافه می‌کند و در نهایت یک نمودار تصویری از وضعیت شبکه تولید می‌نماید.

import time
from datetime import datetime
import speedtest
import pandas as pd
import matplotlib.pyplot as plt

# نام فایل اکسل خروجی برای ذخیره نتایج
EXCEL_FILE = "internet_benchmark_log.xlsx"

def measure_speed():
    """تابع اصلی برای سنجش سرعت پینگ، دانلود و آپلود"""
    print("در حال اتصال به سرور تست سرعت...")
    try:
        st = speedtest.Speedtest()
        st.get_best_server()
        
        print("در حال سنجش سرعت دانلود...")
        download_speed = st.download() / 1_000_000 # تبدیل به مگابیت بر ثانیه
        
        print("در حال سنجش سرعت آپلود...")
        upload_speed = st.upload() / 1_000_000     # تبدیل به مگابیت بر ثانیه
        
        ping = st.results.ping
        
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        result_data = {
            "زمان": [current_time],
            "پینگ (ms)": [round(ping, 2)],
            "دانلود (Mbps)": [round(download_speed, 2)],
            "آپلود (Mbps)": [round(upload_speed, 2)]
        }
        
        print(f"[{current_time}] تست موفق: پینگ={ping:.2f}ms | دانلود={download_speed:.2f}Mbps | آپلود={upload_speed:.2f}Mbps")
        return result_data

    except Exception as e:
        print(f"خطا در انجام تست سرعت: {e}")
        return None

def save_to_excel(new_data):
    """ذخیره یا الحاق داده‌های جدید به فایل اکسل"""
    new_df = pd.DataFrame(new_data)
    try:
        # بررسی اینکه آیا فایل از قبل وجود دارد یا خیر
        existing_df = pd.read_excel(EXCEL_FILE)
        updated_df = pd.concat([existing_df, new_df], ignore_index=True)
    except FileNotFoundError:
        updated_df = new_df
        
    updated_df.to_excel(EXCEL_FILE, index=False)
    print("اطلاعات با موفقیت در فایل اکسل ثبت شد.")

def generate_chart():
    """رسم نمودار روند تغییرات سرعت و پینگ بر اساس فایل اکسل"""
    try:
        df = pd.read_excel(EXCEL_FILE)
        if df.empty:
            print("داده‌ای برای رسم نمودار وجود ندارد.")
            return

        plt.figure(figsize=(12, 6))
        
        plt.plot(df['زمان'], df['دانلود (Mbps)'], label='دانلود (Mbps)', marker='o', color='green')
        plt.plot(df['زمان'], df['آپلود (Mbps)'], label='آپلود (Mbps)', marker='s', color='blue')
        plt.plot(df['زمان'], df['پینگ (ms)'], label='پینگ (ms)', marker='^', color='red')
        
        plt.xlabel('زمان سنجش')
        plt.ylabel('مقدار (مگابیت / میلی‌ثانیه)')
        plt.title('روند تغییرات کیفیت اینترنت در طول زمان')
        plt.xticks(rotation=45, ha='right')
        plt.legend()
        plt.tight_layout()
        
        chart_filename = "internet_performance_chart.png"
        plt.savefig(chart_filename)
        plt.close()
        print(f"نمودار جدید با نام {chart_filename} ذخیره شد.")
        
    except Exception as e:
        print(f"خطا در رسم نمودار: {e}")

if __name__ == "__main__":
    # تنظیمات بازه زمانی تست (مثلا هر 30 دقیقه یکبار = 1800 ثانیه)
    INTERVAL_SECONDS = 1800 
    
    print("ابزار بنچمارک خودکار اینترنت شروع به کار کرد. برای خروج کلید Ctrl+C را فشار دهید.")
    
    while True:
        data = measure_speed()
        if data:
            save_to_excel(data)
            generate_chart()
            
        print(f"در انتظار تست بعدی تا {INTERVAL_SECONDS / 60} دقیقه دیگر...\n")
        time.sleep(INTERVAL_SECONDS)

توضیح بخش به بخش کد

این اسکریپت به‌گونه‌ای طراحی شده است که کمترین پیچیدگی را داشته باشد اما در عین حال تمام نیازهای مانیتورینگ شما را پوشش دهد:

  • تابع measure_speed: این بخش وظیفه برقراری ارتباط با پکیج speedtest را دارد. بهترین سرور نزدیک به شما را به‌صورت خودکار پیدا کرده و سپس داده‌های خام سرعت دانلود و آپلود را که بر اساس بایت بر ثانیه هستند، به مگابیت بر ثانیه (Mbps) تبدیل می‌کند. میزان تأخیر یا همان پینگ نیز بر حسب میلی‌ثانیه استخراج می‌شود.
  • مدیریت خطا (Exception Handling): از آنجایی که ممکن است اتصال اینترنت در لحظه تست برای چند ثانیه قطع شود، کل فرآیند داخل بلوک try-except قرار گرفته تا در صورت بروز خطا، برنامه متوقف نشود و در چرخه بعدی مجدداً تلاش کند.
  • تابع save_to_excel: با استفاده از کتابخانه pandas بررسی می‌کند که آیا از قبل فایل اکسلی وجود دارد یا خیر. اگر فایل باشد، اطلاعات جدید به انتهای سطرها اضافه می‌شود (Append) و در غیر این صورت فایل جدیدی ساخته خواهد شد.
  • تابع generate_chart: تمامی اطلاعات ثبت‌شده در اکسل را خوانده و با استفاده از کتابخانه matplotlib یک نمودار خطی تمیز با مقادیر مشخص برای دانلود، آپلود و پینگ ترسیم می‌کند و آن را به صورت فایل تصویری ذخیره می‌نماید.
  • حلقه اصلی (Main Loop): برنامه در یک حلقه while True اجرا می‌شود و با استفاده از تابع time.sleep سیستم را وادار می‌کند تا به مدت مشخصی (در اینجا ۳۰ دقیقه) صبر کرده و سپس تست بعدی را انجام دهد.

نحوه اجرا و تست اسکریپت

برای اجرای این اسکریپت کافی است مراحل زیر را دنبال کنید:

  1. کد بالا را کپی کرده و در یک فایل متنی با نام دلخواه (مثلاً speed_monitor.py) ذخیره کنید.
  2. ترمینال یا خط فرمان را در پوشه‌ای که فایل را ذخیره کرده‌اید باز کنید.
  3. دستور زیر را وارد کرده و اینتر بزنید:
python speed_monitor.py

برنامه شروع به کار کرده و اولین تست را بلافاصله انجام می‌دهد. پس از آن، فایل اکسل internet_benchmark_log.xlsx و تصویر نمودار internet_performance_chart.png در کنار اسکریپت ظاهر خواهند شد.

خروجی نمونه و ساختار فایل اکسل

وقتی فایل اکسل تولید شده را باز می‌کنید، با ستون‌های منظم زیر روبه‌رو می‌شوید که به شما امکان تحلیل دقیق داده‌ها را می‌دهد:

زمانپینگ (ms)دانلود (Mbps)آپلود (Mbps)
2026-10-16 10:00:0018.575.422.1
2026-10-16 10:30:0045.240.110.5
2026-10-16 11:00:0019.078.223.0

ایده‌های توسعه و شخصی‌سازی اسکریپت

این اسکریپت پایه بسیار خوبی برای ساخت ابزارهای پیشرفته‌تر است. شما می‌توانید با اعمال تغییرات کوچک قابلیت‌های زیر را به آن اضافه کنید:

  • اعلان خودکار (Notification): می‌توانید کتابخانه plyer را اضافه کنید تا اگر سرعت دانلود از یک حد مشخص (مثلاً ۱۰ مگابیت) کمتر شد یا پینگ از ۱۰۰ میلی‌ثانیه بالاتر رفت، ویندوز یا سیستم‌عامل به شما هشدار دسکتاپ بدهد.
  • ثبت گزارش روزانه در ایمیل: با استفاده از کتابخانه‌های داخلی پایتون برای ایمیل (smtplib)، اسکریپت را تنظیم کنید تا در انتهای هر روز، فایل اکسل و نمودار نهایی را به ایمیل شما ارسال کند.
  • اجرا به عنوان سرویس پس‌زمینه: با استفاده از ابزارهای سیستم‌عامل، اسکریپت را طوری تنظیم کنید که با بالا آمدن سیستم به صورت خودکار و بدون نیاز به باز کردن ترمینال اجرا شود.

خطاهای رایج و راه‌حل‌ها

هنگام اجرای ابزارهای شبکه ممکن است با برخی خطاهای متداول مواجه شوید:

  • خطای عدم دسترسی به سرور (SpeedtestBestServerFailure): این خطا زمانی رخ می‌دهد که کتابخانه نتواند سرور مناسبی پیدا کند. معمولاً با اتصال پایدارتر یا تغییر موقت شبکه مشکل برطرف می‌شود.
  • خطای کمبود حافظه یا قفل بودن فایل اکسل: اگر فایل اکسل internet_benchmark_log.xlsx در نرم‌افزار اکسل باز باشد، پایتون نمی‌تواند اطلاعات جدید را در آن ذخیره کند و خطای دسترسی (Permission Denied) می‌دهد. پیش از اجرای اسکریپت حتماً فایل اکسل را ببندید.
  • خطای عدم شناسایی ماژول‌ها: اگر با خطای ModuleNotFoundError مواجه شدید، یعنی دستور نصب کتابخانه‌ها با موفقیت انجام نشده است. اطمینان حاصل کنید که پکیج‌ها را با همان نسخه‌ای از پایتون که اسکریپت را اجرا می‌کنید، نصب کرده‌اید.
مشخصات ابزارمقدار / وضعیت
زبان برنامه‌نویسیپایتون (Python 3.x)
کتابخانه‌های کلیدیspeedtest-cli, pandas, openpyxl, matplotlib
نوع خروجیفایل اکسل (Excel) و نمودار تصویری (PNG)
وضعیت دسترسی ایراندارای محدودیت منطقه‌ای برای برخی سرورهای تست سرعت خارجی
هزینه۱۰۰٪ رایگان و متن‌باز

پرسش‌های متداول

آیا اجرای مداوم این اسکریپت حجم اینترنت من را تمام می‌کند؟

بله. هر بار که تست سرعت انجام می‌شود، مقداری داده (معمولاً بین ۵۰ تا ۲۰۰ مگابایت بسته به سرعت اتصال شما برای دانلود و آپلود) مصرف می‌شود. اگر اینترنت محدود دارید، فاصله زمانی تست‌ها (INTERVAL_SECONDS) را روی ساعات طولانی‌تر تنظیم کنید تا حجم مصرفی کنترل شود.

چرا پینگ به دست آمده با پینگ سرورهای بازی متفاوت است؟

کتابخانه speedtest-cli بهترین و نزدیک‌ترین سرورها به موقعیت جغرافیایی شما را انتخاب می‌کند. اما سرورهای بازی ممکن است در کشورهای دیگر باشند. برای دقت بیشتر در پینگ گیمینگ، می‌توانید آدرس سرور بازی مورد نظر خود را به صورت دستی در کد جایگزین تست پینگ عمومی کنید.

آیا فایل اکسل هر بار بازنویسی می‌شود یا داده‌ها اضافه می‌شوند؟

طبق کدی که نوشتیم، داده‌ها به انتهای فایل قبلی اضافه می‌شوند (Append). بنابراین شما یک آرشیو کامل و تاریخی از وضعیت اینترنت خود خواهید داشت که با گذشت روزها کامل‌تر می‌شود.

چگونه می‌توانم اجرای خودکار را متوقف کنم؟

کافی است در ترمینالی که اسکریپت در آن در حال اجراست، کلیدهای ترکیبی Ctrl + C را فشار دهید تا حلقه متوقف شود.

جمع‌بندی

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

پاسخی بگذارید

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