پروژه اول با پایتون : ردیابی شماره موبایل

خب این پروژه چی کاری میکند ؟

این پروژه یک شاهکاری است که با وارد کردن شماره داخل برنامه کشور شماره و ارائه کننده تلفن آن را به شما میدهد .

برنامه هایی که نیاز دارید :

1-خود پایتون

2-کتابخانه messagebox

3-کتابخانه phonenumbers

کتابخانه های نیاز را نصب کنید و کد زیر را در پایتون وارد کنید.

import tkinter as tk
from tkinter import messagebox
# فرض می‌کنیم کتابخانه‌های phonenumbers نصب شده باشند
# اگر نصب نیستند، با دستور pip install phonenumbers در ترمینال نصب کنید.
try:
    from phonenumbers import parse, geocoder, carrier
except ImportError:
ح    print("کتابخانه phonenumbers یافت نشد. لطفاً با دستور pip install phonenumbers آن را نصب کنید.")
    # در اینجا می‌توانید یک پنجره خطا نمایش دهید یا برنامه را متوقف کنید.
    exit()

# --- تابع برای اعتبارسنجی ورود اعداد و علامت + برای کد کشور ---
def validate_country_code_input(P):
    # P: مقدار فعلی فیلد ورودی
    # اجازه ورود عدد، علامت '+' و رشته خالی
    if P.isdigit() or P == "" or P == "+":
        return True
    # اجازه ورود '+' فقط در ابتدای رشته
    elif P.startswith("+") and P[1:].isdigit():
        return True
    else:
        return False

# --- تابع برای اعتبارسنجی ورود اعداد برای شماره تلفن ---
def validate_numeric_input(P):
    if P.isdigit() or P == "":
        return True
    else:
        return False

# --- تابع برای پردازش شماره تلفن ---
def show_phone_info():
    country_code_entry_text = entry_country_code.get().strip()
    phone_number_part = entry_phone_number.get().strip()

    # بررسی ورودی کد کشور
    if not country_code_entry_text:
        messagebox.showwarning("ورودی ناقص", "لطفاً کد کشور را وارد کنید.")
        return
    
    # اطمینان از اینکه کد کشور با '+' شروع می‌شود یا به آن اضافه می‌کنیم
    if not country_code_entry_text.startswith('+'):
        country_code_str = "+" + country_code_entry_text
    else:
        country_code_str = country_code_entry_text
        
    # بررسی عددی بودن قسمت بعد از '+'
    if len(country_code_str) > 1 and not country_code_str[1:].isdigit():
        messagebox.showwarning("ورودی نامعتبر", "کد کشور باید فقط شامل اعداد (و علامت '+' در ابتدا) باشد.")
        return
    if len(country_code_str) == 1 and country_code_str == "+": # فقط '+' وارد شده
        messagebox.showwarning("ورودی نامعتبر", "لطفاً کد کشور را کامل وارد کنید.")
        return

    # بررسی ورودی شماره تلفن
    if not phone_number_part:
        messagebox.showwarning("ورودی ناقص", "لطفاً شماره تلفن را وارد کنید.")
        return
    if not phone_number_part.isdigit():
        messagebox.showwarning("ورودی نامعتبر", "شماره تلفن باید فقط شامل اعداد باشد.")
        return

    full_phone_number_str = country_code_str + phone_number_part

    try:
        parsed_number = parse(full_phone_number_str)
        # برای نمایش موقعیت مکانی و اپراتور به زبان فارسی، می‌توانید از 'fa' استفاده کنید
        # اما کتابخانه phonenumbers ممکن است پشتیبانی کامل فارسی برای این بخش‌ها نداشته باشد.
        # در صورت نیاز به پشتیبانی کامل فارسی، باید از منابع دیگری استفاده کرد.
        location = geocoder.description_for_number(parsed_number, 'en') # 'en' برای سازگاری بهتر
        operator = carrier.name_for_number(parsed_number, 'en') # 'en' برای سازگاری بهتر

        location_display = location if location else "موقعیت مکانی یافت نشد"
        operator_display = operator if operator else "اپراتور یافت نشد"
        
        # نمایش نتیجه به فارسی
        result_text = f"شماره کامل: {full_phone_number_str}\n" \
                      f"موقعیت مکانی: {location_display}\n" \
                      f"اپراتور: {operator_display}"
        label_result.config(text=result_text, fg="blue")

        # غیرفعال کردن فیلدها و دکمه نمایش
        entry_country_code.config(state=tk.DISABLED)
        entry_phone_number.config(state=tk.DISABLED)
        button_show_info.config(state=tk.DISABLED)
        button_enter_new.config(state=tk.NORMAL) # فعال کردن دکمه ورود مجدد

    except Exception as e:
        # نمایش خطا به فارسی
        messagebox.showerror("خطا", f"خطا در پردازش شماره: {e}\nلطفاً فرمت شماره را بررسی کنید.")
        label_result.config(text="خطا در پردازش.", fg="red")

# --- تابع برای ورود مجدد اطلاعات ---
def enter_new_number():
    label_result.config(text="", fg="black")

    # فعال کردن فیلدها و دکمه نمایش
    entry_country_code.config(state=tk.NORMAL)
    entry_phone_number.config(state=tk.NORMAL)
    button_show_info.config(state=tk.NORMAL)
    button_enter_new.config(state=tk.DISABLED) # غیرفعال کردن دکمه ورود مجدد

    # پاک کردن ورودی‌ها
    entry_country_code.delete(0, tk.END)
    entry_phone_number.delete(0, tk.END)

# --- تنظیمات پنجره اصلی ---
root = tk.Tk()
root.title("بررسی اطلاعات شماره تلفن")
root.geometry("400x350") # کمی بلندتر برای جا دادن ورودی کد کشور
root.resizable(False, False)

# --- فریم اصلی ---
main_frame = tk.Frame(root, padx=10, pady=10)
main_frame.pack(expand=True, fill=tk.BOTH)

# --- بخش کد کشور ---
label_country_code = tk.Label(main_frame, text="کد کشور:", font=('Arial', 10, 'bold'))
label_country_code.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)

# فیلد ورودی برای کد کشور - استفاده از تابع اعتبارسنجی جدید
vcmd_country = (root.register(validate_country_code_input), '%P')
entry_country_code = tk.Entry(main_frame, width=10, font=('Arial', 10), validate='key', validatecommand=vcmd_country)
entry_country_code.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W) # چسبیده به چپ

# --- فیلد شماره تلفن ---
label_phone_number = tk.Label(main_frame, text="شماره تلفن:", font=('Arial', 10, 'bold'))
label_phone_number.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)

# فیلد ورودی برای شماره تلفن
vcmd_phone = (root.register(validate_numeric_input), '%P')
entry_phone_number = tk.Entry(main_frame, width=25, font=('Arial', 10), validate='key', validatecommand=vcmd_phone)
entry_phone_number.grid(row=1, column=1, padx=5, pady=5, sticky=tk.W) # چسبیده به چپ

# --- دکمه ها ---
button_show_info = tk.Button(main_frame, text="نمایش اطلاعات", command=show_phone_info, font=('Arial', 10, 'bold'), bg='#4CAF50', fg='white')
button_show_info.grid(row=2, column=0, columnspan=2, padx=5, pady=10, sticky="ew")

button_enter_new = tk.Button(main_frame, text="ورود مجدد اطلاعات", command=enter_new_number, state=tk.DISABLED, font=('Arial', 10), bg='#2196F3', fg='white')
button_enter_new.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew")

# --- لیبل نمایش نتیجه ---
label_result = tk.Label(main_frame, text="", justify=tk.LEFT, wraplength=350, font=('Arial', 11, 'italic'))
label_result.grid(row=4, column=0, columnspan=2, padx=5, pady=10, sticky=tk.W)

# تنظیمات grid برای چیدمان بهتر
main_frame.grid_rowconfigure(0, weight=1)
main_frame.grid_rowconfigure(1, weight=1)
main_frame.grid_rowconfigure(2, weight=1)
main_frame.grid_rowconfigure(3, weight=1)
main_frame.grid_rowconfigure(4, weight=2)

main_frame.grid_columnconfigure(0, weight=1)
main_frame.grid_columnconfigure(1, weight=2)

root.mainloop()
فایل اجرایی
فایل اجرایی

خب کد را اجرا کنید و صفحه بالا را میبینید الان اگر اطلاعات را وارد کنید عکس زیر را میبینید .

کد اجرا شده
کد اجرا شده

دیدید که زد مال ایران هست و اپراتور ایرانسل هست .

برای دانلود همین پایتون یا فایل تبدیل شده به برنامه روی نوشته لینک بزنید و 15ثانیه صبر کنید و فایل را دریافت کنید .

اگر ایده یا پروژه ای دیگری میخواهید در نظر ها بنویسید .