Ikki faktorli autentifikatsiya va telefon raqamini tasdiqlash kodlari odatda SMS orqali yuboriladi. Lekin mobil telefon o’rniga shahar telefon raqamini tasdiqlashingiz kerak bo’lsa-chi? Shahar telefoni SMS xabarlarni qabul qila olmaydi, shuning uchun yagona variant — ovozli qo’ng’iroq.
Tasodifiy raqamlardan qo’ng’iroqlar amalga oshiriladigan va foydalanuvchidan ushbu raqamning oxirgi bir nechta raqamlarini kiritish talab qilinadigan misollar mavjud. Biroq, bu usul raqamlarni soxtalashtirish qobiliyatini yoki har safar tasodifiy chiquvchi CIDni olish uchun katta pulni talab qiladi. Afsuski, bu hamma uchun ham mavjud emas. Shunday qilib, bizning holatimizda biz shunchaki «robot»ga kerakli kodni ovoz chiqarib o’qishini ta’minlaymiz.
Hissiy chekinish
Yaqinda men aynan shu xususiyatlarga ega buyurtma oldim. Ammo, afsuski, mijoz unchalik samimiy emasligi ma’lum bo’ldi. U allaqachon kelishilgan xususiyatlarni darhol o’zgartira boshladi, ortiqcha va mantiqsiz talablarni qo’shdi. Men bu haqda shikoyat qilganimda, u «Men xo’jayinman, men eng yaxshisini bilaman» degan munosabat bilan javob berdi. Ishning aksariyati allaqachon namoyish stendi sifatida bajarilgan bo’lsa-da, men mag’rurligimni ko’rsatishga qaror qildim va hamma narsani o’zim bilan olib, ishdan bosh tortdim. :) Va endi men o’z ishimni siz, aziz o’quvchilarim bilan baham ko’rishga qaror qildim! Aks holda, bu vaqtni behuda sarflash bo’lardi… Va agar ushbu material tufayli ba’zilaringiz kichik bir banka qora ikra uchun yetarli pul topsangiz, men chin dildan xursand bo’lardim. ;)
Mashq qilish
Ushbu qo’llanmani o’qishni boshlashdan oldin, sizda allaqachon sozlangan Asterisk serveri va unga ulangan telefon tarmog’iga kirish nuqtasi mavjud deb taxmin qilinadi.
- Keling, raqamlarning ovozli tarjimasi va bu raqamlarning nima ekanligi haqida e’lon bilan arxivni yuklab olishni boshlaylik… Ovozli tarjimani amalga oshirmoqchi bo’lganlar uchun o’zbek tilida Siz ayniqsa omadlisiz, chunki men buni siz uchun allaqachon qilganman. Arxivni bu yerdan yuklab oling va keyin uning tarkibini Asterisk tovushlarni qidirishi kerak bo’lgan joyga joylashtiring. Mening holatimda, bu /var/lib/asterisk/sounds/custom/ katalogi.
- Biz qilishimiz kerak bo’lgan deyarli barcha narsalar to’g’ridan-to’g’ri kontekstda sodir bo’ladi. Biz ushbu kontekstni /etc/asterisk/extensions_custom.conf fayliga quyidagi tarkib bilan qo’shamiz:
[confirm-code]
exten => s,1,Answer()
exten => s,n,Playback(custom/uzcode)
exten => s,n,Playback(custom/uz${N1})
exten => s,n,Playback(custom/uz${N2})
exten => s,n,Playback(custom/uz${N3})
exten => s,n,Playback(custom/uz${N4})
exten => s,n,Playback(custom/confirmcode)
exten => s,n,Playback(custom/ru${N1})
exten => s,n,Playback(custom/ru${N2})
exten => s,n,Playback(custom/ru${N3})
exten => s,n,Playback(custom/ru${N4})
exten => s,n,Hangup() Bu yerda hech narsani tushuntirishga hojat yo’q, lekin har ehtimolga qarshi, javob boshlanishini va undan keyin ikki tilda ovozli fayllar ketma-ket ijro etilishini aytaman. Mening holatimda, kod to’rt xonali raqam bo’lishi kerak. Shunga ko’ra, kontekstda tasdiqlash kodi bo’linadigan o’zgaruvchilarga ega to’rtta qatorni ko’rasiz. Siz ko’proq yoki kamroq qilishingiz, nusxa ko’chirish-joylashtirish takrorlashini qo’shishingiz yoki hatto hamma narsani almashtirishingiz mumkin, bu hammani chalkashtirib yuborishi va hamma narsani ishlashi uchun…
3. Bizga tashqi dasturiy ta’minot foydalanuvchiga kod bilan qo’ng’iroqni boshlashi mumkin bo’lgan interfeys kerak. Biz buni eng oddiy qo’ng’iroq qilish usuli, ya’ni qo’ng’iroq fayllari yordamida PHP skripti sifatida amalga oshiramiz.
1 && $_REQUEST['p'] <= 999999999){
$phone = $_REQUEST['p'];
} else {
$result['status'] = "ERROR";
$result['msg'] = "INCORRECT_PHONE_NUMBER";
print(json_encode($result));
die();
}
if(preg_match('/^[0-9]{4}$/',$_REQUEST['c'])){
for($i=0; $i<4; $i++){
$num[] = substr($_REQUEST['c'],$i,1);
}
} else {
$result['status'] = "ERROR";
$result['msg'] = "INCORRECT_CODE";
print(json_encode($result));
die();
}
$callpid = substr(md5(time().rand(5, 5)),0,$callidlen);
$body="
Channel: Local/".$phone."@from-internal
CallerID: Robot <40> // Можно поменять на что-то своё.
MaxRetries: 0
RetryTime: 10
WaitTime: 10
Context: confirm-code
Extension: s
Priority: 1
AlwaysDelete Yes
Setvar: CPID=".$callpid."
Setvar: N1=".$num[0]."
Setvar: N2=".$num[1]."
Setvar: N3=".$num[2]."
Setvar: N4=".$num[3];
if(file_put_contents("/var/spool/asterisk/outgoing/".md5(time()).".call",$body)){
$result['status'] = "SUCCESS";
$result['msg'] = "CALL_SENT_TO_QUEUE";
$result['callid'] = $callpid;
print(json_encode($result));
} else {
$result['status'] = "ERROR";
$result['msg'] = "Can't create call file.";
}
?> Iltimos, «B» raqamini tekshirishga e’tibor bering. Mening skriptim to’liq ishlamaydi, chunki u ichki raqamlarni o’z ichiga olgan holda sinov maqsadlarida yaratilgan, shuning uchun uni sizning ehtiyojlaringizga mos ravishda qayta yozishni tavsiya qilaman.
Shuningdek, skriptni ishga tushirayotgan foydalanuvchi /var/spool/asterisk/outgoing/ katalogiga yozish huquqiga ega ekanligiga ishonch hosil qiling. Asterisk ushbu katalogda chaqiruv faylini ko’rgandan so’ng, uni qayta ishlashga harakat qiladi va darhol o’chiradi. Qayta ishlash vaqti va har qanday xatolar Asterisk nosozliklarni tuzatish konsolida aniq ko’rinadi.
Agar hamma narsa to’g’ri bajarilgan bo’lsa, http://your.pbx.addr/call.php?p=number&c=1234 kabi qatorni chaqirish serveringizni kerakli qo’ng’iroqni amalga oshirishga majbur qiladi.
