با کمک این راهنما، سیستم تأیید OTP را در برنامه پایتون خود راه اندازی کنید.
حتی اگر رمز عبور شما دزدیده شود، سیستم های تأیید OTP به عنوان یک عامل مهم برای امنیت عمل می کنند. نیاز به به خاطر سپردن رمزهای عبور را از بین می برد، به عنوان یک لایه امنیتی اضافی عمل می کند و خطرات فیشینگ را کاهش می دهد.
آموزش ساخت یک سیستم تأیید OTP با استفاده از پایتون که برای شما یک OTP به شماره موبایل شما ارسال می کند، فقط برای دو دقیقه معتبر است و اگر سه بار متوالی OTP اشتباه وارد کنید حساب شما قفل می شود.
ماژول های Tkinter، Twilio و Random را نصب کنید
Tkinter به شما اجازه می دهد تا برنامه های دسکتاپ ایجاد کنید. ویجتهای مختلفی مانند دکمهها، برچسبها و جعبههای متنی را ارائه میدهد که توسعه برنامهها را آسانتر میکند.
ماژول Twilio به شما کمک می کند تا عملکردهای ارتباطی مانند SMS، MMS، تماس های تلفنی و تأیید را مستقیماً در برنامه خود ادغام کنید. این یک زیرساخت مبتنی بر ابر به همراه ویژگی های شگفت انگیزی مانند تهیه شماره، الگوهای پیام و ضبط تماس دارد.
برای نصب ماژول های Twilio و Tkinter دستور زیر را در ترمینال اجرا کنید:
pip install twilio tk
ماژول تصادفی یک ماژول داخلی پایتون است که برای تولید اعداد شبه تصادفی استفاده می شود. با این کار، می توانید اعداد تصادفی تولید کنید، عناصر تصادفی را از یک لیست انتخاب کنید، محتویات یک لیست را به هم بزنید و موارد دیگر. میتوانید از آن برای ساختن یک شبیهسازی رول قالب، یک لیستساز یا یک تولیدکننده رمز عبور تصادفی استفاده کنید.
API Twilio را ایجاد کنید و یک شماره تلفن دریافت کنید
برای استفاده از Twilio و ارسال درخواست های OTP به تلفن همراه خود، به اعتبارنامه احراز هویت به همراه یک شماره تلفن Twilio نیاز دارید. برای رسیدن به این هدف:
- برای یک حساب کاربری Twilio ثبت نام کنید و از کنسول Twilio دیدن کنید.
- به پایین اسکرول کنید و روی دکمه دریافت شماره تلفن کلیک کنید. شماره تلفن تولید شده را کپی کنید.
- به قسمت اطلاعات حساب به پایین بروید. شناسه حساب و رمز تأیید را کپی کنید.
ساخت ساختار برنامه
میتوانید کل کد منبع برای ساختن یک سیستم تأیید OTP با استفاده از پایتون را در این مخزن GitHub پیدا کنید.
ماژول های لازم را وارد کنید و اعتبارنامه های احراز هویت را تنظیم کنید. کلاینت Twilio را راه اندازی کنید تا احراز هویت شود و نقطه ورودی تماس های API باشد. زمان انقضا را روی دو دقیقه تنظیم کنید.
یک کلاس تعریف کنید، OTPVerification، و سازنده را مقداردهی اولیه کنید تا مقادیر پیشفرض متغیرها را همراه با مقداردهی اولیه پنجره ریشه، تنظیم عنوان و ابعاد برنامه تنظیم کنید.
import tkinter as tk
from tkinter import messagebox
from twilio.rest import Client
import random
import threading
import time
account_sid = "YOUR_ACCOUNT_SID"
auth_token = "YOUR_AUTH_TOKEN"
client = Client(account_sid, auth_token)
expiration_time = 120
class OTPVerification:
def __init__(self, master):
self.master = master
self.master.title('OTP Verification')
self.master.geometry("600x275")
self.otp = None
self.timer_thread = None
self.resend_timer = None
self.wrong_attempts = 0
self.locked = False
self.stop_timer = False
سه برچسب برای درخواست شماره موبایل و OTP و نمایش تایمر پس از ارسال یک OTP توسط برنامه تعریف کنید. عنصر والد، متنی که باید نمایش داده شود و سبک های قلمی که باید داشته باشد را تنظیم کنید. به طور مشابه، دو ویجت ورودی برای دریافت ورودی از کاربر ایجاد کنید. عنصر والد، عرض و سبک فونت آن را تنظیم کنید.
سه دکمه برای ارسال OTP، ارسال مجدد OTP و تأیید OTP ایجاد کنید. عنصر والد آن، متنی که باید نمایش داده شود، فرمانی که باید هنگام کلیک اجرا شود و سبک های فونت آن را تنظیم کنید. این عناصر را با استفاده از روش بسته سازماندهی کنید.
self.label1 = tk.Label(self.master,
text='Enter your mobile number:',
font=('Arial', 14))
self.label1.pack()
self.mobile_number_entry = tk.Entry(self.master,
width=20,
font=('Arial', 14))
self.mobile_number_entry.pack()
self.send_otp_button = tk.Button(self.master,
text='Send OTP',
command=self.send_otp,
font=('Arial', 14))
self.send_otp_button.pack()
self.timer_label = tk.Label(self.master,
text='',
font=('Arial', 12, 'bold'))
self.timer_label.pack()
self.resend_otp_button = tk.Button(self.master,
text='Resend OTP',
state=tk.DISABLED,
command=self.resend_otp,
font=('Arial', 14))
self.resend_otp_button.pack()
self.label2 = tk.Label(self.master,
text='Enter OTP sent to your mobile:',
font=('Arial', 14))
self.label2.pack()
self.otp_entry = tk.Entry(self.master,
width=20,
font=('Arial', 14))
self.otp_entry.pack()
self.verify_otp_button = tk.Button(self.master,
text='Verify OTP',
command=self.verify_otp,
font=('Arial', 14))
self.verify_otp_button.pack()
ساختن عملکرد برنامه
یک متد به نام start_timer() تعریف کنید که timer_countdown را در یک رشته جداگانه اجرا کند.
def start_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()
یک متد تعریف کنید، timer_countdown(). زمان شروع را ضبط کنید و یک حلقه بی نهایت اجرا کنید که زمان فعلی را می گیرد و زمان سپری شده و باقی مانده را محاسبه می کند. اگر stop_timer درست است، حلقه را خاتمه دهید. اگر زمان باقیمانده کمتر یا مساوی صفر است، یک کادر پیام خطا نشان دهید که OTP منقضی شده است.
دکمه ارسال مجدد OTP را فعال کنید، OTP را روی none تنظیم کنید و خاتمه دهید. در غیر این صورت، دقیقه و ثانیه باقیمانده را محاسبه کنید، آن را روی برچسب تایمر نمایش دهید و یک ثانیه بخوابید.
def timer_countdown(self):
start_time = time.time()
while True:
current_time = time.time()
elapsed_time = current_time - start_time
remaining_time = expiration_time - elapsed_time
if self.stop_timer:
break
if remaining_time <= 0:
messagebox.showerror('Error', 'OTP has expired.')
self.resend_otp_button.config(state=tk.NORMAL)
self.otp = None
break
minutes = int(remaining_time // 60)
seconds = int(remaining_time % 60)
timer_label = f'Time Remaining: {minutes:02d}:{seconds:02d}'
self.timer_label.config(text=timer_label)
time.sleep(1)
یک متد تعریف کنید، send_otp(). اگر قفل شده درست است، پیام مناسب را نمایش دهید. در غیر این صورت، شماره تلفن را استخراج کنید، آن را تأیید کنید و یک OTP تصادفی ایجاد کنید. تلفن همراهی را که قبلاً دریافت کردهاید پاس کنید و از مشتری برای ارسال OTP به شماره تلفن خود استفاده کنید. یک جعبه پیام را نمایش دهید، تایمر را راه اندازی کنید، دکمه ها را غیرفعال کنید و ورودی را به طور کامل پاک کنید.
def send_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
if not mobile_number:
messagebox.showerror('Error', 'Please enter your mobile number.')
return
self.otp = random.randint(1000, 9999)
message = client.messages.create(
body=f'Your OTP is {self.otp}.',
from_='TWILIO_MOBILE_NUMBER',
to=mobile_number
)
messagebox.showinfo('OTP Sent', f'OTP has been sent to {mobile_number}.')
self.start_timer()
self.send_otp_button.config(state=tk.DISABLED)
self.resend_otp_button.config(state=tk.DISABLED)
self.otp_entry.delete(0, tk.END)
یک متد تعریف کنید، resend_otp(). اگر قفل است، پیام مناسب را نمایش دهید. در غیر این صورت، شماره تلفن را دریافت کنید، آن را تأیید کنید، یک OTP تصادفی ایجاد کنید، OTP را دوباره ارسال کنید، کادر پیام را نمایش دهید، تایمر را شروع کنید و دکمه ارسال مجدد OTP را غیرفعال کنید.
def resend_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
if not mobile_number:
messagebox.showerror('Error', 'Please enter your mobile number.')
return
self.otp = random.randint(1000, 9999)
message = client.messages.create(
body=f'Your OTP is {self.otp}.',
from_='TWILIO_MOBILE_NUMBER',
to=mobile_number
)
messagebox.showinfo('OTP Sent', f'New OTP has been sent to {mobile_number}.')
self.start_timer()
self.resend_otp_button.config(state=tk.DISABLED)
یک متد تعریف کنید، verify_otp(). OTP را دریافت کنید و بررسی کنید که آیا کاربر چیزی وارد نکرده است. اگر OTP ذخیره شده None است، از کاربر بخواهید ابتدا OTP را ایجاد کند. اگر OTP وارد شده توسط کاربر با ذخیره شده مطابقت دارد، پیام تأیید موفقیت آمیز OTP را نمایش دهید، تایمر را متوقف کنید و از برنامه خارج شوید. در غیر این صورت، تلاش های اشتباه را بررسی کنید. اگر تلاش اشتباه بیش از سه باشد، حساب را قفل کنید.
def verify_otp(self):
user_otp = self.otp_entry.get()
if not user_otp:
messagebox.showerror('Error', 'Please enter OTP.')
return
if self.otp is None:
messagebox.showerror('Error', 'Please generate OTP first.')
return
if int(user_otp) == self.otp:
messagebox.showinfo('Success', 'OTP verified successfully.')
self.stop_timer = True
exit()
else:
self.wrong_attempts += 1
if self.wrong_attempts == 3:
self.lock_account()
else:
messagebox.showerror('Error', 'OTP does not match.')
یک متد تعریف کنید، lock_account(). وضعیت قفل را روی true تنظیم کنید و برچسب را به عنوان Account Locked نمایش دهید. همه برچسبها، ورودیها و دکمهها را غیرفعال کنید. تایمر موجود را متوقف کنید و تایمر جدیدی را برای ده دقیقه شروع کنید.
def lock_account(self):
self.locked = True
self.label1.config(text='Account Locked')
self.mobile_number_entry.config(state=tk.DISABLED)
self.send_otp_button.config(state=tk.DISABLED)
self.timer_label.config(text='')
self.resend_otp_button.config(state=tk.DISABLED)
self.label2.config(text='')
self.otp_entry.config(state=tk.DISABLED)
self.verify_otp_button.config(state=tk.DISABLED)
self.stop_timer = True
countdown_time = 10 * 60
self.start_countdown(countdown_time)
یک متد ()start_countdown تعریف کنید. اگر زمان باقیمانده کمتر یا مساوی صفر است، حساب را ریست کنید. در غیر این صورت نمایش دهید که برنامه حساب را قفل کرده است و در مدت زمان باقیمانده با استفاده از تماس برگشتی دوباره امتحان کنید.
def start_countdown(self, remaining_time):
if remaining_time <= 0:
self.reset_account()
return
minutes = int(remaining_time // 60)
seconds = int(remaining_time % 60)
timer_label = f'Account Locked. Try again in: {minutes:02d}:{seconds:02d}'
self.timer_label.config(text=timer_label)
self.master.after(1000, self.start_countdown, remaining_time - 1)
یک تابع تعریف کنید، reset_account(). وضعیت تمام ویجت ها و متغیرها را مانند قبل بازنشانی کنید.
def reset_account(self):
self.locked = False
self.wrong_attempts = 0
self.label1.config(text='Enter your mobile number:')
self.mobile_number_entry.config(state=tk.NORMAL)
self.send_otp_button.config(state=tk.NORMAL)
self.timer_label.config(text='')
self.resend_otp_button.config(state=tk.DISABLED)
self.label2.config(text='Enter OTP sent to your mobile:')
self.otp_entry.config(state=tk.NORMAL)
self.verify_otp_button.config(state=tk.NORMAL)
self.stop_timer = False
پنجره ریشه، نمونه ای از کلاس را ایجاد کنید و برنامه Tkinter را اجرا کنید.
if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()
نمونه خروجی تأیید با استفاده از OTP
هنگام اجرای برنامه تأیید OTP، پنجره ای دریافت می کنید که از شما می خواهد شماره موبایل خود را وارد کنید. آن را به همراه کد کشور خود وارد کنید و دکمه Send OTP را بزنید. پیامی دریافت می کنید که برنامه OTP را با موفقیت ارسال کرده است و دکمه به مدت دو دقیقه غیرفعال می شود. گوشی خود را از نظر OTP بررسی کنید و قبل از انقضا آن را وارد کنید.
با وارد کردن OTP صحیح قبل از اتمام تایمر، پیامی دریافت می کنید که برنامه OTP را با موفقیت تأیید کرده است و برنامه خارج می شود. در صورتی که آن را به موقع وارد نکرده باشید، یک جعبه پیام دریافت خواهید کرد که می گوید OTP منقضی شده است. می توانید بر روی دکمه ارسال مجدد OTP کلیک کنید تا یک OTP جدید ایجاد کنید و آن را به تلفن خود ارسال کنید.
اگر OTP را اشتباه وارد کنید، برنامه کادر پیامی را نشان می دهد که OTP مطابقت ندارد.
اگر سه بار OTP را اشتباه وارد کنید، همه فیلدها غیرفعال می شوند و حساب به مدت ده دقیقه قفل می شود.
استفاده از Twilio با پایتون
با استفاده از Twilio می توانید یک سیستم اطلاع رسانی پیامکی برای رویدادهای مختلف بسازید. میتوانید از آن با دستگاههای اینترنت اشیا برای راهاندازی پیامک زمانی که چیزی بالاتر یا پایینتر از یک آستانه مشخص میافتد یا زمانی که یک مزاحم را شناسایی میکنید، استفاده کنید. میتوانید سیستمهای ورود امن را با احراز هویت دو مرحلهای بسازید، یک چت بات واتساپ و یک سیستم یادآوری قرار ملاقات بسازید.
جدا از این، می توانید از آن برای تأیید شماره تلفن، کمپین های بازاریابی، ارسال نظرسنجی و جمع آوری بازخورد استفاده کنید. هنگام ساخت هر برنامه ای، همیشه به قیمت گذاری Twilio API توجه داشته باشید تا از هزینه های غیرمنتظره جلوگیری کنید.