خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه با استفاده از پایتون یک سیستم تایید OTP بسازیم

با کمک این راهنما، سیستم تأیید OTP را در برنامه پایتون خود راه اندازی کنید.

حتی اگر رمز عبور شما دزدیده شود، سیستم های تأیید OTP به عنوان یک عامل مهم برای امنیت عمل می کنند. نیاز به به خاطر سپردن رمزهای عبور را از بین می برد، به عنوان یک لایه امنیتی اضافی عمل می کند و خطرات فیشینگ را کاهش می دهد.

آموزش ساخت یک سیستم تأیید OTP با استفاده از پایتون که برای شما یک OTP به شماره موبایل شما ارسال می کند، فقط برای دو دقیقه معتبر است و اگر سه بار متوالی OTP اشتباه وارد کنید حساب شما قفل می شود.

ماژول های Tkinter، Twilio و Random را نصب کنید

Tkinter به شما اجازه می دهد تا برنامه های دسکتاپ ایجاد کنید. ویجت‌های مختلفی مانند دکمه‌ها، برچسب‌ها و جعبه‌های متنی را ارائه می‌دهد که توسعه برنامه‌ها را آسان‌تر می‌کند.

ماژول Twilio به شما کمک می کند تا عملکردهای ارتباطی مانند SMS، MMS، تماس های تلفنی و تأیید را مستقیماً در برنامه خود ادغام کنید. این یک زیرساخت مبتنی بر ابر به همراه ویژگی های شگفت انگیزی مانند تهیه شماره، الگوهای پیام و ضبط تماس دارد.

برای نصب ماژول های Twilio و Tkinter دستور زیر را در ترمینال اجرا کنید:

pip install twilio tk

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

API Twilio را ایجاد کنید و یک شماره تلفن دریافت کنید

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

  1. برای یک حساب کاربری Twilio ثبت نام کنید و از کنسول Twilio دیدن کنید.
  2. به پایین اسکرول کنید و روی دکمه دریافت شماره تلفن کلیک کنید. شماره تلفن تولید شده را کپی کنید.
  3. به قسمت اطلاعات حساب به پایین بروید. شناسه حساب و رمز تأیید را کپی کنید.

یک شماره تلفن از کنسول دریافت کنیداعتبار 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 توسط برنامه تعریف کنید. عنصر والد، متنی که باید نمایش داده شود و سبک های قلمی که باید داشته باشد را تنظیم کنید. به طور مشابه، دو ویجت ورودی برای دریافت ورودی از کاربر ایجاد کنید. عنصر والد، عرض و سبک فونت آن را تنظیم کنید.

مطلب مرتبط:   آیا استفاده از مرورگر وب Maxthon ایمن است؟

سه دکمه برای ارسال 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 بررسی کنید و قبل از انقضا آن را وارد کنید.

مطلب مرتبط:   بهترین VPN رایگان برای رایانه شخصی شما چیست؟

صفحه شروع برنامه تأیید OTP

با وارد کردن OTP صحیح قبل از اتمام تایمر، پیامی دریافت می کنید که برنامه OTP را با موفقیت تأیید کرده است و برنامه خارج می شود. در صورتی که آن را به موقع وارد نکرده باشید، یک جعبه پیام دریافت خواهید کرد که می گوید OTP منقضی شده است. می توانید بر روی دکمه ارسال مجدد OTP کلیک کنید تا یک OTP جدید ایجاد کنید و آن را به تلفن خود ارسال کنید.

OTP را صحیح وارد کنید در برنامه تأیید OTP

اگر OTP را اشتباه وارد کنید، برنامه کادر پیامی را نشان می دهد که OTP مطابقت ندارد.

ورود اشتباه OTP در برنامه تأیید OTP

اگر سه بار OTP را اشتباه وارد کنید، همه فیلدها غیرفعال می شوند و حساب به مدت ده دقیقه قفل می شود.

صفحه قفل حساب در برنامه تأیید OTP

استفاده از Twilio با پایتون

با استفاده از Twilio می توانید یک سیستم اطلاع رسانی پیامکی برای رویدادهای مختلف بسازید. می‌توانید از آن با دستگاه‌های اینترنت اشیا برای راه‌اندازی پیامک زمانی که چیزی بالاتر یا پایین‌تر از یک آستانه مشخص می‌افتد یا زمانی که یک مزاحم را شناسایی می‌کنید، استفاده کنید. می‌توانید سیستم‌های ورود امن را با احراز هویت دو مرحله‌ای بسازید، یک چت بات واتس‌اپ و یک سیستم یادآوری قرار ملاقات بسازید.

جدا از این، می توانید از آن برای تأیید شماره تلفن، کمپین های بازاریابی، ارسال نظرسنجی و جمع آوری بازخورد استفاده کنید. هنگام ساخت هر برنامه ای، همیشه به قیمت گذاری Twilio API توجه داشته باشید تا از هزینه های غیرمنتظره جلوگیری کنید.