وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

اعتبار سنجی و قالب بندی شماره تلفن در پایتون با شماره تلفن

0 135
زمان لازم برای مطالعه: 8 دقیقه


معرفی

اعتبارسنجی شماره تلفن می تواند یک کار بسیار چالش برانگیز باشد. فرمت شماره تلفن می تواند از کشوری به کشور دیگر متفاوت باشد. هک، همچنین می تواند در همان کشور متفاوت باشد! برخی از کشورها از یک کد کشور مشترک استفاده می کنند، در حالی که برخی از کشورها از بیش از یک کد کشور استفاده می کنند. با توجه به مثالی از گوگل libphonenumber مخزن GitHub، ایالات متحده آمریکا، کانادا، و جزایر کارائیب، همه یک کد کشور دارند (+1). از سوی دیگر، تماس با شماره تلفن های کوزوو با استفاده از کد کشورهای صربستان، اسلوونی و مراکش امکان پذیر است.

اینها تنها تعدادی از چالش های موجود در شناسایی یا اعتبارسنجی شماره تلفن ها هستند. در نگاه اول، حداقل می توان کد کشور یک شماره تلفن را با یک RegEx تایید کرد. با این حال، این بدان معنی است که شما باید یک قانون RegEx سفارشی برای هر کشور در جهان بنویسید، فقط برای تأیید یک کد کشور. علاوه بر این، برخی از اپراتورهای تلفن همراه قوانین خاص خود را دارند (به عنوان مثال، ارقام خاص فقط می توانند از محدوده خاصی از اعداد استفاده کنند). می بینید که همه چیز می تواند به سرعت از کنترل خارج شود و اعتبارسنجی ورودی شماره تلفن توسط خودمان را تقریباً غیرممکن کند.

خوشبختانه، یک کتابخانه پایتون وجود دارد که می تواند به ما کمک کند تا اعتبارسنجی را انجام دهیم process به راحتی و کارآمد. پایتون phonenumbers کتابخانه از گوگل گرفته شده است libphonenumber کتابخانه ای که برای سایر زبان های برنامه نویسی مانند C++، Java و JavaScript نیز موجود است.

در این آموزش، روش تجزیه، اعتبارسنجی و استخراج شماره تلفن و همچنین روش استخراج اطلاعات اضافی از شماره(های) تلفن مانند اطلاعات شرکت مخابراتی، منطقه زمانی یا ژئوکدکننده را خواهیم آموخت.

استفاده از کتابخانه بسیار ساده است و معمولاً به صورت زیر استفاده می شود:

import phonenumbers
from phonenumbers import carrier, timezone, geocoder

my_number = phonenumbers.parse("+447986123456", "GB")

print(phonenumbers.is_valid_number(my_number))
print(carrier.name_for_number(my_number, "en"))
print(timezone.time_zones_for_number(my_number))
print(geocoder.description_for_number(my_number, 'en'))

و این هم خروجی:

True
EE
('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London')
United Kingdom

بیایید با راه اندازی محیط خود و نصب کتابخانه شروع کنیم.

در حال نصب شماره تلفن ها

ابتدا بیایید محیط مجازی خود را ایجاد و فعال کنیم:

$ mkdir phonenumbers && cd phonenumbers
$ python3 -m venv venv
$ . venv/bin/active 

سپس کتابخانه Python Phonenumbers را نصب می کنیم:

$ pip3 install Phonenumbers

این آموزش از نسخه کتابخانه شماره تلفن استفاده خواهد کرد 8.12.19.

اکنون ما آماده هستیم تا کتابخانه Phonenumbers را کشف کنیم.

تجزیه شماره تلفن با پایتون شماره تلفن ها

چه ورودی کاربر را از فرم وب یا منابع دیگر دریافت کنید، مانند استخراج از متن (بیشتر روی که در ادامه این آموزش)، شماره تلفن ورودی به احتمال زیاد یک رشته خواهد بود. به عنوان اولین قدم، باید آن را با استفاده از تجزیه و تحلیل کنیم phonenumbers، و آن را به یک تبدیل کنید PhoneNumber به عنوان مثال تا بتوانیم از آن برای اعتبارسنجی و سایر عملکردها استفاده کنیم.

می توانیم شماره تلفن را با استفاده از آن تجزیه کنیم parse() روش:

import phonenumbers

my_string_number = "+40721234567"
my_number = phonenumbers.parse(my_string_number)

این phonenumbers.parse() متد یک رشته شماره تلفن را به عنوان آرگومان مورد نیاز می گیرد. همچنین می توانید اطلاعات کشور را در قالب ISO Alpha-2 به عنوان یک آرگومان اختیاری ارسال کنید. برای مثال کد زیر را در نظر بگیرید:

my_number = phonenumbers.parse(my_string_number, "RO")

“RO” مخفف Romania در قالب ISO Alpha-2 است. می توانید سایر کدهای کشور آلفا-2 و عددی را از اینجا بررسی کنید این وب سایت. در این آموزش، برای سادگی، کد کشور ISO Alpha-2 را برای اکثر موارد حذف می‌کنم و فقط در مواقع ضروری آن را درج می‌کنم.

این phonenumbers.parse() روش قبلاً دارای برخی از قوانین اعتبار سنجی اساسی داخلی است مانند طول رشته اعداد یا بررسی یک صفر ابتدایی یا برای یک + امضا کردن. توجه داشته باشید که زمانی که هر یک از قوانین مورد نیاز اجرا نشود، این روش یک استثنا ایجاد می کند. پس به یاد داشته باشید از آن در یک بلوک try/catch در برنامه خود استفاده کنید.

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

اعتبار سنجی شماره تلفن با شماره تلفن پایتون

Phonenumbers دو روش برای بررسی اعتبار یک شماره تلفن دارد. تفاوت اصلی این روش ها سرعت و دقت است.

برای توضیح بیشتر، اجازه دهید با شروع is_possible_number():

import phonenumbers

my_string_number = "+40021234567"
my_number = phonenumbers.parse(my_string_number)
print(phonenumbers.is_possible_number(my_number))

و خروجی این خواهد بود:

True

حالا بیایید از همان عدد استفاده کنیم، اما با is_valid_number() روش این بار:

import phonenumbers

my_string_number = "+40021234567"
my_number = phonenumbers.parse(my_string_number)
print(phonenumbers.is_valid_number(my_number))

حتی اگر ورودی یکسان بود، نتیجه متفاوت خواهد بود:

False

دلیل آن این است که is_possible_number() روش یک حدس سریع ایجاد می کند روی اعتبار شماره تلفن با بررسی طول شماره تجزیه شده، در حالی که is_valid_number() روش با بررسی طول، پیشوند شماره تلفن و منطقه، یک اعتبارسنجی کامل را اجرا می کند.

هنگام تکرار بر روی یک لیست بزرگ از شماره تلفن، با استفاده از phonenumbers.is_possible_number() نتایج سریع تری را در مقایسه با phonenumbers.is_valid_number(). اما همانطور که در اینجا می بینیم، این نتایج ممکن است همیشه دقیق نباشند. حذف سریع شماره تلفن هایی که با طول مطابقت ندارند می تواند مفید باشد. بنابراین با مسئولیت خود از آن استفاده کنید.

شماره تلفن ها را با شماره تلفن پایتون استخراج و قالب بندی کنید

ورودی کاربر تنها راه دریافت یا جمع آوری شماره تلفن نیست. به عنوان مثال، ممکن است یک عنکبوت/خزنده داشته باشید که صفحات خاصی را از یک وب سایت یا یک سند می خواند و شماره تلفن ها را از بلوک های متنی استخراج می کند. مشکلی چالش برانگیز به نظر می رسد، اما خوشبختانه، کتابخانه Phonenumbers فقط عملکرد مورد نیاز ما را با PhoneNumberMatcher(text, region) روش.

PhoneNumberMatcher یک بلوک متنی و یک منطقه را به عنوان آرگومان می گیرد و سپس دوباره تکرار می شود تا نتایج مطابق را به عنوان برگرداند PhoneNumberMatch اشیاء.

استفاده کنیم PhoneNumberMatcher با متن تصادفی:

import phonenumbers

text_block = "Our services will cost about 2,200 USD and we will deliver the product by 10.10.2021. For more information, you can call us at +44 7986 123456 or send an email to (email protected)"

for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"):
    print(match)

این اراده print شماره تلفن منطبق به همراه فهرست آنها در رشته:

PhoneNumberMatch (131,146) +44 7986 123456

شاید متوجه شده باشید که شماره ما در قالب استاندارد بین المللی فرمت شده و بر فاصله ها تقسیم شده است. این ممکن است همیشه در سناریوهای زندگی واقعی صدق نکند. شما ممکن است شماره خود را در قالب های دیگری دریافت کنید، مانند تقسیم بر خط تیره یا قالب بندی شده به قالب ملی (به جای بین المللی).

بیایید قرار دهیم PhoneNumberMatcher() روش آزمایش با سایر فرمت‌های شماره تلفن:

import phonenumbers

text_block = "Our services will cost about 2,200 USD and we will deliver the product by 10.10.2021. For more information you can call us at +44-7986-123456 or 020 8366 1177 send an email to (email protected)"

for match in phonenumbers.PhoneNumberMatcher(text_block, "GB"):
    print(match)

این خروجی خواهد داشت:

PhoneNumberMatch (130,145) +44-7986-123456
PhoneNumberMatch (149,162) 020 8366 1177

حتی اگر شماره تلفن ها با فرمت های مختلف با شماره های دیگر عمیقاً در متن جاسازی شده اند، PhoneNumberMatcher با موفقیت شماره تلفن ها را با دقت عالی برمی گرداند.

به غیر از استخراج داده ها از متن، ممکن است بخواهیم ارقام را یکی یکی از کاربر دریافت کنیم. تصور کنید که رابط کاربری برنامه شما شبیه به تلفن‌های همراه مدرن کار می‌کند و شماره تلفن‌ها را هنگام تایپ فرمت می‌کند. به عنوان مثال، روی وب شما page، ممکن است بخواهید با هر کدام داده ها را به API خود منتقل کنید onkeyup رویداد و استفاده AsYouTypeFormatter() برای فرمت شماره تلفن با هر رقم ورودی.

از آنجایی که بخش UI خارج از محدوده این مقاله است، از یک مثال اساسی برای آن استفاده می کنیم AsYouTypeFormatter. برای شبیه سازی onقالب بندی -the-fly، بیایید وارد مفسر پایتون شویم:

>>> import phonenumbers
>>> formatter = phonenumbers.AsYouTypeFormatter("TR")
>>> formatter.input_digit("3")
'3'
>>> formatter.input_digit("9")
'39'
>>> formatter.input_digit("2")
'392'
>>> formatter.input_digit("2")
'392 2'
>>> formatter.input_digit("2")
'392 22'
>>> formatter.input_digit("1")
'392 221'
>>> formatter.input_digit("2")
'392 221 2'
>>> formatter.input_digit("3")
'392 221 23'
>>> formatter.input_digit("4")
'392 221 23 4'
>>> formatter.input_digit("5")
'392 221 23 45'

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

کتابخانه شماره تلفن ما را در اینجا نیز تحت پوشش قرار داد format_number() روش. این روش به ما امکان می دهد شماره تلفن ها را به سه فرمت معروف و استاندارد قالب بندی کنیم. ملی، بین المللی و E164. فرمت‌های ملی و بین‌المللی کاملاً گویا هستند، در حالی که فرمت E164 یک قالب شماره تلفن بین‌المللی است که تضمین می‌کند شماره‌های تلفن با 15 رقم محدود شده و قالب‌بندی شده‌اند. {+}{country code}{number with area code}. برای اطلاعات بیشتر روی E164، می توانید بررسی کنید این ویکی پدیا page.

بیایید با قالب بندی ملی شروع کنیم:

import phonenumbers

my_number = phonenumbers.parse("+40721234567")
national_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.NATIONAL)
print(national_f)

این یک رشته شماره تلفن با فاصله خوب با فرمت ملی را برمی گرداند:

0721 234 567

اکنون بیایید سعی کنیم شماره ملی را به صورت بین المللی قالب بندی کنیم:

import phonenumbers

my_number = phonenumbers.parse("0721234567", "RO")  
international_f = phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
print(international_f)

کد بالا یک رشته شماره تلفن با فاصله خوب را برمی گرداند:

+40 721 234 567

توجه کنید که گذشتیم "RO" به عنوان پارامتر دوم به parse() روش. از آنجایی که شماره ورودی یک شماره ملی است، هیچ پیشوند کد کشوری برای اشاره به کشور ندارد. در این موارد باید کشور را با کد ISO Alpha-2 آن مشخص کنیم تا به نتیجه دقیقی برسیم. حذف کدهای عددی و ISO Alpha-2 کشور، باعث استثناء می شود NumberParseException: (0) Missing or invalid default region..

حالا بیایید امتحان کنیم E164 گزینه قالب بندی یک رشته ملی را به عنوان ورودی ارسال می کنیم:

import phonenumbers

my_number = phonenumbers.parse("0721234567", "RO")
e164_f=phonenumbers.format_number(my_number, phonenumbers.PhoneNumberFormat.E164)
print(e164_f)

خروجی بسیار شبیه به خواهد بود PhoneNumberFormat.INTERNATIONAL، به جز با فاصله های:

+40721234567

وقتی می‌خواهید شماره را به یک API پس‌زمینه منتقل کنید، این بسیار مفید است. غیر معمول نیست که APIها انتظار داشته باشند که شماره تلفن ها رشته های بدون فاصله باشد.

دریافت اطلاعات تکمیلی روی شماره تلفن

یک شماره تلفن با داده های مربوط به یک کاربر بارگیری می شود که می تواند برای شما جالب باشد. ممکن است بخواهید بسته به API های مختلف یا نقاط پایانی API استفاده کنید روی حامل شماره تلفن خاص، زیرا این در هزینه محصول نقش دارد. بسته به اینکه ممکن است بخواهید اعلان های تبلیغاتی خود را ارسال کنید روی منطقه زمانی مشتری (شماره تلفن) خود را به طوری که شما برای آنها پیامی در نیمه شب ارسال نکنید. یا ممکن است بخواهید اطلاعاتی در مورد موقعیت مکانی شماره تلفن دریافت کنید تا بتوانید اطلاعات مربوطه را ارائه دهید. کتابخانه Phonenumbers ابزارهای لازم را برای برآوردن این نیازها فراهم می کند.

برای شروع با مکان، از آن استفاده خواهیم کرد description_for_number() روش از geocoder کلاس این روش یک شماره تلفن تجزیه شده و یک نام زبان کوتاه را به عنوان پارامتر در نظر می گیرد.

بیایید این را با شماره جعلی قبلی خود امتحان کنیم:

import phonenumbers
from phonenumbers import geocoder

my_number = phonenumbers.parse("+447986123456")
print(geocoder.description_for_number(my_number, "en"))

این اراده print کشور مبدا شماره تلفن را خارج کنید:

United Kingdom

نام های کوتاه زبان بسیار شهودی هستند. بیایید سعی کنیم خروجی را به زبان روسی دریافت کنیم:

import phonenumbers
from phonenumbers import geocoder

my_number = phonenumbers.parse("+447986123456")
print(geocoder.description_for_number(my_number, "ru"))

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

Соединенное Королевство

می توانید آن را با سایر زبان های دلخواه خود مانند “de”، “fr”، “zh” و غیره امتحان کنید.

همانطور که قبلاً ذکر شد، ممکن است بخواهید شماره تلفن های خود را بر اساس شرکت های مخابراتی آنها گروه بندی کنید، زیرا در بیشتر موارد تأثیر خواهد داشت. روی هزینه. برای روشن‌تر شدن، احتمالاً کتابخانه Phonenumbers اکثر نام‌های حامل را به طور دقیق ارائه می‌کند، اما نه 100%.

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

ما استفاده خواهیم کرد name_for_number() روش از carrier کلاس:

import phonenumbers
from phonenumbers import carrier

my_number = phonenumbers.parse("+40721234567")
print(carrier.name_for_number(my_number, "en"))

در صورت امکان، حامل اصلی شماره تلفن را نشان می دهد:

Vodafone

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

یکی دیگر از اطلاعات مهم در مورد شماره تلفن، منطقه زمانی آن است. این time_zones_for_number() متد لیستی از مناطق زمانی را که شماره به آنها تعلق دارد، برمی گرداند. خوب import آن را از phonenumbers.timezone :

import phonenumbers
from phonenumbers import timezone

my_number = phonenumbers.parse("+447986123456")
print(timezone.time_zones_for_number(my_number))

این اراده print مناطق زمانی زیر:

('Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London')

این آموزش ما را به پایان می رساند روی شماره تلفن پایتون

نتیجه

ما یاد گرفتیم که چگونه شماره تلفن ها را با آن تجزیه کنیم parse() روش، استخراج اعداد از بلوک های متنی با PhoneNumberMatcher()، شماره تلفن ها را رقم به رقم دریافت کرده و با آن فرمت کنید AsYouTypeFormatter()، از روش های اعتبارسنجی مختلف استفاده کنید is_possible_number() و is_possible_number()، اعداد را با استفاده از فرمت NATIONAL، INTERNATIONAL، و E164 روش های قالب بندی، و استخراج اطلاعات اضافی از شماره تلفن با استفاده از geocoder، carrier، و timezone کلاس ها.

به یاد داشته باشید که بررسی کنید مخزن اصلی GitHub کتابخانه Phonenumbers. همچنین اگر سوالی در ذهن دارید، در زیر نظر دهید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-11 21:18:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید