Xác thực số điện thoại có thể là một nhiệm vụ rất khó khăn. Định dạng của số điện thoại có thể khác nhau giữa các quốc gia. Heck, nó cũng có thể khác nhau trong cùng một quốc gia. Một số quốc gia chia sẻ cùng một mã quốc gia, trong khi một số quốc gia khác sử dụng nhiều mã quốc gia. Theo một ví dụ từ kho lưu trữ GitHub
$ pip3 install Phonenumbers
7 của Google, Hoa Kỳ, Canada và các đảo Caribe, tất cả đều có chung mã quốc gia [$ pip3 install Phonenumbers
8]. Mặt khác, có thể gọi các số điện thoại từ Kosovo bằng mã quốc gia của Serbia, Slovenia và Ma-rốcĐây chỉ là một vài thách thức trong việc xác định hoặc xác thực số điện thoại. Thoạt nhìn, ít nhất người ta có thể xác thực mã quốc gia của một số điện thoại bằng RegEx. Tuy nhiên, điều này có nghĩa là bạn sẽ phải viết quy tắc RegEx tùy chỉnh cho mọi quốc gia trên thế giới, chỉ để xác thực mã quốc gia. Ngoài ra, một số nhà cung cấp dịch vụ điện thoại di động có quy tắc riêng của họ [ví dụ: một số chữ số nhất định chỉ có thể sử dụng một dãy số nhất định]. Bạn có thể thấy rằng mọi thứ có thể nhanh chóng vượt quá tầm kiểm soát và khiến chúng tôi gần như không thể tự mình xác thực số điện thoại nhập vào
May mắn thay, có một thư viện Python có thể giúp chúng ta vượt qua quá trình xác thực một cách dễ dàng và hiệu quả. Thư viện Số điện thoại Python có nguồn gốc từ thư viện
$ pip3 install Phonenumbers
7 của Google, thư viện này cũng có sẵn cho các ngôn ngữ lập trình khác như C++, Java và JavaScriptTrong hướng dẫn này, chúng ta sẽ tìm hiểu cách phân tích cú pháp, xác thực và trích xuất số điện thoại, cũng như cách trích xuất thông tin bổ sung từ [các] số điện thoại như chi tiết về nhà mạng, múi giờ hoặc trình mã hóa địa lý
Việc sử dụng thư viện rất đơn giản và nó thường được sử dụng như thế này
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']]
Và đây là đầu ra
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
Hãy bắt đầu bằng cách thiết lập môi trường của chúng tôi và cài đặt thư viện
Cài đặt số điện thoại
Trước tiên, hãy tạo và kích hoạt môi trường ảo của chúng ta
Sau đó, chúng tôi cài đặt thư viện Python Phonenumbers
$ pip3 install Phonenumbers
Hướng dẫn này sẽ sử dụng phiên bản thư viện Phonenumbers của
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
0Bây giờ chúng ta đã sẵn sàng bắt đầu khám phá thư viện Số điện thoại
Phân tích số điện thoại bằng Python phonenumbers
Cho dù bạn nhận đầu vào của người dùng từ biểu mẫu web hay các nguồn khác, chẳng hạn như trích xuất từ một số văn bản [thêm về điều đó sau trong hướng dẫn này], số điện thoại đầu vào rất có thể sẽ là một chuỗi. Ở bước đầu tiên, chúng tôi sẽ cần phân tích cú pháp bằng cách sử dụng
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
1 và biến nó thành một phiên bản import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
2 để chúng tôi có thể sử dụng nó để xác thực và thực hiện các chức năng khácChúng tôi có thể phân tích cú pháp số điện thoại bằng phương pháp
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
3import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
Phương thức
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
4 lấy một chuỗi số điện thoại làm đối số bắt buộc. Bạn cũng có thể chuyển thông tin quốc gia ở định dạng ISO Alpha-2 dưới dạng đối số tùy chọn. Lấy ví dụ, xem xét đoạn mã saumy_number = phonenumbers.parse[my_string_number, "RO"]
"RO" là viết tắt của Romania ở định dạng ISO Alpha-2. Bạn có thể kiểm tra các mã quốc gia Alpha-2 và số khác từ trang web này. Trong hướng dẫn này, để đơn giản, tôi sẽ bỏ qua mã quốc gia ISO Alpha-2 trong hầu hết các trường hợp và chỉ đưa mã này vào khi thực sự cần thiết
Phương thức
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
4 đã có một số quy tắc xác thực cơ bản tích hợp sẵn như độ dài của chuỗi số hoặc kiểm tra số 0 đứng đầu hoặc dấu hiệu import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
6. Lưu ý rằng phương pháp này sẽ đưa ra một ngoại lệ khi bất kỳ quy tắc cần thiết nào không được đáp ứng. Vì vậy, hãy nhớ sử dụng nó trong khối thử/bắt trong ứng dụng của bạnBây giờ chúng tôi đã phân tích cú pháp số điện thoại của mình một cách chính xác, hãy tiến hành xác thực
Phonenumbers có hai phương pháp để kiểm tra tính hợp lệ của số điện thoại. Sự khác biệt chính giữa các phương pháp này là tốc độ và độ chính xác
Để giải thích chi tiết, hãy bắt đầu với
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
7import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
Và đầu ra sẽ là
True
Bây giờ, hãy sử dụng cùng một số, nhưng lần này với phương thức
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
8import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_valid_number[my_number]]
Mặc dù đầu vào giống nhau, nhưng kết quả sẽ khác
False
Lý do là phương pháp
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
7 đoán nhanh tính hợp lệ của số điện thoại bằng cách kiểm tra độ dài của số được phân tích cú pháp, trong khi phương pháp import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
8 chạy xác thực đầy đủ bằng cách kiểm tra độ dài, tiền tố số điện thoại và vùngKhi lặp qua một danh sách lớn các số điện thoại, sử dụng
my_number = phonenumbers.parse[my_string_number, "RO"]
1 sẽ cung cấp kết quả nhanh hơn so với my_number = phonenumbers.parse[my_string_number, "RO"]
2. Nhưng như chúng ta thấy ở đây, những kết quả này có thể không phải lúc nào cũng chính xác. Có thể hữu ích để nhanh chóng loại bỏ các số điện thoại không tuân theo độ dài. Vì vậy, sử dụng nó có nguy cơ của riêng bạnTrích xuất và định dạng số điện thoại bằng Python Phonenumbers
Đầu vào của người dùng không phải là cách duy nhất để lấy hoặc thu thập số điện thoại. Chẳng hạn, bạn có thể có một trình thu thập thông tin/trình thu thập dữ liệu sẽ đọc một số trang nhất định từ một trang web hoặc tài liệu và sẽ trích xuất các số điện thoại từ các khối văn bản. Nghe có vẻ là một bài toán khó nhưng may mắn thay, thư viện Số điện thoại chỉ cung cấp cho chúng ta chức năng chúng ta cần, với phương thức
my_number = phonenumbers.parse[my_string_number, "RO"]
3my_number = phonenumbers.parse[my_string_number, "RO"]
4 lấy một khối văn bản và một vùng làm đối số rồi lặp lại để trả về kết quả phù hợp dưới dạng đối tượng my_number = phonenumbers.parse[my_string_number, "RO"]
5Hãy sử dụng
my_number = phonenumbers.parse[my_string_number, "RO"]
4 với một văn bản ngẫu nhiênimport phonenumbers
text_block = "Our services will cost about 2,200 USD and we will deliver the product by the 10.10.2021. For more information, you can call us at +44 7986 123456 or send an e-mail to [email protected]"
for match in phonenumbers.PhoneNumberMatcher[text_block, "GB"]:
print[match]
Điều này sẽ in các số điện thoại phù hợp cùng với chỉ mục của chúng trong chuỗi
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
0Bạn có thể nhận thấy rằng số của chúng tôi được định dạng theo định dạng quốc tế được tiêu chuẩn hóa và chia cho khoảng trắng. Điều này có thể không phải lúc nào cũng đúng trong các tình huống thực tế. Bạn có thể nhận được số của mình ở các định dạng khác, chẳng hạn như chia cho dấu gạch ngang hoặc được định dạng theo định dạng quốc gia [thay vì quốc tế]
Hãy thử nghiệm phương pháp
my_number = phonenumbers.parse[my_string_number, "RO"]
7 với các định dạng số điện thoại khácTrue
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
1Điều này sẽ xuất ra
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
2Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
Mặc dù các số điện thoại được nhúng sâu vào văn bản với nhiều định dạng với các số khác, nhưng
my_number = phonenumbers.parse[my_string_number, "RO"]
4 vẫn trả về thành công các số điện thoại với độ chính xác caoNgoài việc trích xuất dữ liệu từ văn bản, chúng tôi cũng có thể muốn lấy từng chữ số từ người dùng. Hãy tưởng tượng rằng giao diện người dùng của ứng dụng của bạn hoạt động tương tự như điện thoại di động hiện đại và định dạng số điện thoại khi bạn nhập. Chẳng hạn, trên trang web của bạn, bạn có thể muốn chuyển dữ liệu tới API của mình với mỗi sự kiện
my_number = phonenumbers.parse[my_string_number, "RO"]
9 và sử dụng import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
0 để định dạng số điện thoại với mỗi chữ số đếnVì phần giao diện người dùng nằm ngoài phạm vi của bài viết này nên chúng tôi sẽ sử dụng một ví dụ cơ bản cho
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
1. Để mô phỏng định dạng nhanh chóng, hãy chuyển sang trình thông dịch PythonTrue
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
3Không phải tất cả đầu vào của người dùng xảy ra khi họ nhập. Một số biểu mẫu có các trường nhập văn bản đơn giản cho số điện thoại. Tuy nhiên, điều đó không nhất thiết có nghĩa là chúng tôi sẽ nhập dữ liệu ở định dạng chuẩn
Thư viện Số điện thoại cũng giúp chúng tôi trình bày ở đây bằng phương pháp
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
2. Phương pháp này cho phép chúng tôi định dạng số điện thoại thành ba định dạng tiêu chuẩn hóa nổi tiếng. Quốc gia, Quốc tế và E164. Các định dạng Quốc gia và Quốc tế khá dễ hiểu, trong khi định dạng E164 là định dạng số điện thoại quốc tế đảm bảo các số điện thoại được giới hạn ở 15 chữ số và được định dạng {+}{mã quốc gia}{số có mã vùng}. Để biết thêm thông tin về E164, bạn có thể kiểm tra trang Wikipedia nàyHãy bắt đầu với định dạng quốc gia
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
4Điều này sẽ trả về một chuỗi số điện thoại cách đều nhau với định dạng quốc gia
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
5Bây giờ, hãy thử định dạng số quốc gia theo định dạng quốc tế
Đoạn mã trên sẽ trả về một chuỗi số điện thoại cách đều nhau
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
6Lưu ý rằng chúng ta đã chuyển
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
3 làm tham số thứ hai vào phương thức import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
3. Vì số đầu vào là số quốc gia nên nó không có tiền tố mã quốc gia để gợi ý quốc gia. Trong những trường hợp này, chúng tôi cần chỉ định quốc gia có mã ISO Alpha-2 để có kết quả chính xác. Loại trừ mã quốc gia dạng số và mã ISO Alpha-2, sẽ dẫn đến ngoại lệ import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
5Bây giờ, hãy thử tùy chọn định dạng
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
6. Chúng tôi sẽ chuyển một chuỗi quốc gia làm đầu vàoTrue
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
7Đầu ra sẽ rất giống với
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
7, ngoại trừ khoảng trắngTrue
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
8Điều này rất hữu ích khi bạn muốn chuyển số cho API nền. Không có gì lạ khi các API mong đợi số điện thoại là các chuỗi không cách nhau
Nhận thông tin bổ sung về số điện thoại
Một số điện thoại được tải với dữ liệu về người dùng mà bạn có thể quan tâm. Bạn có thể muốn sử dụng các API hoặc điểm cuối API khác nhau tùy thuộc vào nhà cung cấp dịch vụ của số điện thoại cụ thể vì điều này đóng một vai trò trong giá thành sản phẩm. Bạn có thể muốn gửi thông báo khuyến mãi tùy thuộc vào múi giờ [số điện thoại] của khách hàng để bạn không gửi tin nhắn cho họ vào lúc nửa đêm. Hoặc bạn có thể muốn nhận thông tin về vị trí của số điện thoại để bạn có thể cung cấp thông tin liên quan. Thư viện Số điện thoại cung cấp các công cụ cần thiết để đáp ứng những nhu cầu này
Để bắt đầu với địa điểm, chúng ta sẽ sử dụng phương thức
import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
8 từ lớp import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
9. Phương pháp này lấy một số điện thoại được phân tích cú pháp và một tên ngôn ngữ ngắn làm tham sốHãy thử điều này với số giả trước đây của chúng tôi
True
EE
['Europe/Guernsey', 'Europe/Isle_of_Man', 'Europe/Jersey', 'Europe/London']
United Kingdom
9Điều này sẽ in ra nước xuất xứ của số điện thoại
$ pip3 install Phonenumbers
0Tên ngôn ngữ ngắn khá trực quan. Hãy thử để có được đầu ra bằng tiếng Nga
$ pip3 install Phonenumbers
1Và đây là đầu ra cho biết Vương quốc Anh bằng tiếng Nga
$ pip3 install Phonenumbers
2Bạn có thể dùng thử với các ngôn ngữ khác theo sở thích của mình như "de", "fr", "zh", v.v.
Như đã đề cập trước đó, bạn có thể muốn nhóm các số điện thoại của mình theo nhà cung cấp dịch vụ của họ, vì trong hầu hết các trường hợp, điều đó sẽ ảnh hưởng đến chi phí. Để làm rõ, thư viện Số điện thoại có thể sẽ cung cấp chính xác hầu hết các tên nhà mạng, nhưng không phải 100%
Ngày nay, ở hầu hết các quốc gia, bạn có thể lấy số của mình từ một nhà mạng và sau đó chuyển số đó sang nhà mạng khác, để lại số điện thoại giống hệt nhau. Vì Phonenumbers chỉ là một thư viện Python ngoại tuyến nên không thể phát hiện những thay đổi này. Vì vậy, tốt nhất là tiếp cận tên nhà cung cấp dịch vụ như một tài liệu tham khảo, thay vì thực tế
Chúng ta sẽ sử dụng phương thức
True
0 từ lớp True
1$ pip3 install Phonenumbers
3Điều này sẽ hiển thị nhà cung cấp dịch vụ ban đầu của số điện thoại nếu có thể
$ pip3 install Phonenumbers
4Ghi chú. Như được đề cập trong các tài liệu gốc của Số điện thoại Python, thông tin nhà cung cấp dịch vụ có sẵn cho các số điện thoại di động ở một số quốc gia, không phải tất cả
Một thông tin quan trọng khác về số điện thoại là múi giờ của nó. Phương thức
True
2 sẽ trả về danh sách các múi giờ mà số đó thuộc về. Chúng tôi sẽ nhập nó từ True
3$ pip3 install Phonenumbers
5Điều này sẽ in các múi giờ sau
$ pip3 install Phonenumbers
6Điều này kết thúc hướng dẫn của chúng tôi về Số điện thoại Python
Phần kết luận
Chúng tôi đã học cách phân tích cú pháp số điện thoại bằng phương pháp
import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
3, trích xuất số từ khối văn bản bằng my_number = phonenumbers.parse[my_string_number, "RO"]
7, lấy số điện thoại theo từng chữ số và định dạng số đó bằng import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
0, sử dụng các phương pháp xác thực khác với import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
7 và import phonenumbers
my_string_number = "+40721234567"
my_number = phonenumbers.parse[my_string_number]
7, định dạng số bằng cách sử dụng True
9, import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_valid_number[my_number]]
0 và import phonenumbers
my_string_number = "+40021234567"
my_number = phonenumbers.parse[my_string_number]
print[phonenumbers.is_possible_number[my_number]]
6 Hãy nhớ xem repo GitHub gốc của thư viện Số điện thoại. Ngoài ra nếu bạn có bất kỳ câu hỏi nào trong đầu, vui lòng bình luận bên dưới