Покрените ОТП систем верификације у вашој Питхон апликацији уз помоћ овог водича.

Чак и ако вам се лозинка украде, ОТП системи верификације служе као кључни фактор за безбедност. Он елиминише потребу за памћењем лозинки, служи као додатни слој безбедности и смањује ризике од крађе идентитета.

Научите да направите ОТП систем верификације користећи Питхон који вам шаље ОТП на ваш број мобилног телефона, је важи само два минута и ваш налог се закључава ако унесете погрешан ОТП три пута у а ред.

Инсталирајте Ткинтер, Твилио и Рандом модуле

Ткинтер вам омогућава да креирајте десктоп апликације. Нуди разне виџете попут дугмади, налепница и оквира за текст који олакшавају развој апликација.

Твилио модул вам помаже да интегришу комуникацијске функционалности попут СМС-а, ММС, телефонски позиви и верификација директно у вашу апликацију. Има инфраструктуру засновану на облаку, заједно са невероватним функцијама као што су обезбеђивање бројева, шаблони порука и снимање позива.

Да бисте инсталирали Твилио и Ткинтер модуле, покрените следећу команду у терминалу:

instagram viewer
pip install twilio tk

Рандом модул је уграђени Питхон модул који се користи за генерисање псеудослучајних бројева. Помоћу овога можете генерисати насумичне бројеве, бирати насумичне елементе са листе, мешати садржај листе и још много тога. Можете га користити за прављење симулације бацања матрице, мешања листе или а генератор случајних лозинки.

Генеришите Твилио АПИ и добијте број телефона

Да бисте користили Твилио и слали ОТП захтеве на свој мобилни телефон, потребни су вам акредитиви за аутентификацију заједно са Твилио телефонским бројем. Да би се постигло ово:

  1. Пријавите се за Твилио налог и посетите Твилио конзола.
  2. Померите се надоле и кликните на Узмите број телефона дугме. Копирајте генерисани број телефона.
  3. Померите се надоле до Информације о налогу одељак. Копирај СИД налога анд тхе Аутх Токен.

Изградња структуре апликације

Овде можете пронаћи цео изворни код за изградњу ОТП система за верификацију користећи Питхон ГитХуб спремиште.

Увезите потребне модуле и поставите акредитиве за аутентификацију. Иницијализујте Твилио клијента да се аутентификује и буде улазна тачка за АПИ позиве. Подесите време истека на два минута.

Дефинишите класу, ОТПВерифицатион, и иницијализовати конструктор да постави подразумеване вредности променљивих заједно са иницијализацијом основног прозора и подешавањем наслова и димензија апликације.

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

classOTPVerification:
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

Дефинишите три ознаке за тражење броја мобилног телефона и ОТП-а и за приказ тајмера након што програм пошаље ОТП. Подесите родитељски елемент, текст који треба да прикаже и стилове фонта које треба да поседује. Слично томе, направите два виџета за унос да бисте добили унос од корисника. Подесите његов родитељски елемент, његову ширину и стилове фонта.

Направите три дугмета за слање ОТП-а, поновно слање ОТП-а и Верификуј ОТП. Подесите његов надређени елемент, текст који треба да прикаже, команду коју треба да изврши када се кликне и стилове фонта. Организујте ове елементе користећи паковање методом.

 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()

Изградња функционалности апликације

Дефинишите метод, старт_тимер() који тече тимер_цоунтдовн у посебној нити.

defstart_timer(self):
self.timer_thread = threading.Thread(target=self.timer_countdown)
self.timer_thread.start()

Дефинишите метод, тимер_цоунтдовн(). Забележите време почетка и покрените бесконачну петљу која узима тренутно време и израчунава протекло и преостало време. Ако стоп_тимер је тачно, прекинути петљу. Ако је преостало време мање или једнако нули, прикажите оквир са поруком о грешци у којој пише да је ОТП истекао.

Активирајте дугме за поновно слање ОТП-а, поставите ОТП на ниједан и завршите. У супротном, израчунајте преостале минуте и секунде, прикажите их на налепници тајмера и спавајте једну секунду.

deftimer_countdown(self):
start_time = time.time()
whileTrue:
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)

Дефинишите метод, сенд_отп(). Ако закључан је тачно, прикажите одговарајућу поруку. У супротном, издвојите број телефона, потврдите га и генеришите насумични ОТП. Проследите мобилни телефон који сте раније добили и користите клијент да пошаљете ОТП на свој број телефона. Прикажите оквир са поруком, покрените тајмер, онемогућите дугмад и потпуно обришите унос.

defsend_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
ifnot 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)

Дефинишите метод, ресенд_отп(). Ако је закључано, прикажите одговарајућу поруку. У супротном, узмите број телефона, потврдите га, поново генеришете насумични ОТП, поново пошаљите ОТП, прикажите оквир са поруком, покрените тајмер и онемогућите дугме за поновно слање ОТП-а.

defresend_otp(self):
if self.locked:
messagebox.showinfo('Account Locked', 'Your account is locked. Try again later.')
return
mobile_number = self.mobile_number_entry.get()
ifnot 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)

Дефинишите метод, верифи_отп(). Узмите ОТП и проверите да ли корисник није ништа унео. Ако је сачувани ОТП Ниједан, замолите корисника да прво генерише ОТП. Ако се ОТП који је корисник унео подудара са сачуваним, прикажите поруку о успешној ОТП верификацији, зауставите тајмер и изађите из програма. У супротном, проверите да ли постоје погрешни покушаји. Ако погрешна покушаја премашују три, закључајте налог.

defverify_otp(self):
user_otp = self.otp_entry.get()
ifnot user_otp:
messagebox.showerror('Error', 'Please enter OTP.')
return
if self.otp isNone:
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.')

Дефинишите метод, лоцк_аццоунт(). Поставите закључан статус на тачно и прикажите ознаку као Налог закључан. Онемогућите све ознаке, уносе и дугмад. Зауставите постојећи тајмер и покрените нови на десет минута.

deflock_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)

Дефинишите метод старт_цоунтдовн(). Ако је преостало време мање или једнако нули, ресетујте налог. У супротном, прикажите да је програм закључао налог и покушајте поново за преостало време користећи повратни позив.

defstart_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)

Дефинишите функцију, ресет_аццоунт(). Ресетујте статус свих виџета и променљивих као и раније.

defreset_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

Креирајте основни прозор, инстанцу класе и покрените Ткинтер апликацију.

if __name__ == '__main__':
root = tk.Tk()
otp_verification = OTPVerification(root)
root.mainloop()

Пример излаза верификације помоћу ОТП-а

Када покренете програм за верификацију ОТП-а, добићете прозор у којем се од вас тражи да унесете свој број мобилног телефона. Унесите га заједно са позивним бројем земље и притисните Пошаљи ОТП дугме. Добићете поруку да је програм успешно послао ОТП и дугме се деактивира на два минута. Проверите да ли на телефону постоји ОТП и унесите га пре него што истекне.

Када унесете исправан ОТП пре него што тајмер истекне, добићете поруку да је програм успешно верификовао ОТП и програм излази. У случају да га нисте унели на време, добићете оквир са поруком да је ОТП истекао. Можете кликнути на Поново пошаљи ОТП дугме да бисте генерисали нови ОТП и послали га на свој телефон.

Ако унесете погрешан ОТП, програм ће приказати оквир са поруком ОТП се не подудара.

Ако три пута унесете погрешан ОТП, сва поља се онемогућују и налог се закључава на десет минута.

Коришћење Твилио-а са Питхон-ом

Користећи Твилио, можете изградити систем СМС обавештења за различите догађаје. Можете га користити са ИоТ уређајима да покренете СМС када нешто падне изнад или испод одређеног прага или када откријете уљеза. Можете да направите безбедне системе за пријаву са двофакторском аутентификацијом, направите ВхатсАпп цхат бот и систем подсетника за састанке.

Осим тога, можете га користити за верификацију броја телефона, маркетиншке кампање, слање анкета и прикупљање повратних информација. Док правите било коју апликацију, увек водите рачуна о ценама Твилио АПИ-ја да бисте избегли неочекиване трошкове.