رد الاتصال أو "زيادة ولاء العملاء"

هناك علامة النجمة ، مجموعة من المشغلين (3-5 أشخاص) مع حمولة كبيرة (متوسط ​​وقت الانتظار> دقيقتان)

تتمثل المهمة للمشتركين الذين لديهم جغرافيا معينة في إعطاء الفرصة لعدم الانتظار حتى يصبح المشغل مجانيًا ، والضغط على 0 يسمع "شكرًا لك على المكالمة. سنعاود الاتصال بك بالتأكيد "، قطع الاتصال والانتظار بهدوء لمكالمة من المشغل ، جيدًا أو من عامة الناس عبر Callback الذكي

إنشاء الجداول
إنشاء جدول asterisk.callback (
المعرف int (11) NOT NULL AUTO_INCREMENT ،
dt الطابع الزمني DEFAULT CURRENT_TIMESTAMP ،
cid varchar (32) DEFAULT NULL ،
التوقيت الصيفي (32) DEFAULT NULL ،
حالة صغيرة (6) غير فارغة 0 ،
tot_calls int (11) NOT NULL DEFAULT 0،
الطابع الزمني last_call DEFAULT "0000-00-00 00:00:00" ،
compl_dt الطابع الزمني DEFAULT "0000-00-00 00:00:00" ،
uniqueid varchar (32) DEFAULT NULL ،
قائمة الانتظار varchar (255) DEFAULT NULL ،
مفتاح أساسي (ID)
)
المحرك = INNODB

إنشاء جدول asterisk.callback_log (
المعرف int (11) NOT NULL AUTO_INCREMENT ،
callback_id int (11) ليس فارغًا ،
الطابع الزمني dt DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ،
varchar الحالة (32) DEFAULT NULL ،
params varchar (2048) DEFAULT NULL ،
مفتاح رئيسي (معرف) ،
CONSTRAINT callback_log_fk1 FOREIGN KEY (callback_id)
المراجع asterisk.callback (id) على DELETE CASCADE ON UPDATE CASCADE
)
المحرك = INNODB

تحرير extensions.conf

 exten => 88142590067، s، 1
     same => n، GotoIf ($ ["$ {CALLERID (num): 0: 4}" = "8814"]؟ extra)؛  إذا كان الرقم محليًا ، فاسمح بـ CALLBACK
 .... يمكنك إدراج المزيد من الشيكات هنا ...
     same => n، Goto (call)
     same => n (إضافي) ، NoOp (السماح باستدعاء $ {CALLERID (num)})
     same => n ، تعيين (ALLOW_CALLBACK = 1)
     same => n ، تعيين (CALLBACK_QUEUE = العوامل)
     same => n ، الخلفية (vse / press0-to-callback)

     same => n (استدعاء) ، NoOp (اسأل عن المشغلين. GROUP_COUNT = $ {GROUP_COUNT (عوامل تشغيل)})
     نفسه => n ، قائمة الانتظار (العوامل ، tThH)
     نفسه => ن ، Hangup

 تشمل => main_menu_press

 [Main_menu_press]
 exten => 0.1 ، NoOp ('-------------------- $ {CALLERID (num)} PRESS BUTTON $ {EXTEN}. ALLOW_CALLBACK = $ {ALLOW_CALLBACK} ')
     same => n ، GotoIf ($ [$ {ALLOW_CALLBACK} = 1]؟ رد اتصال ، s ، 1: i ، 1)

 [استدعاء]
 exten => s، 1، NoOp (CALLBACK)
     same => n ، تشغيل (شكرا لك على الاتصال & vse / my-vam-perezvonim)
     نفسه => ن ، Hangup

 exten => h، 1، agi (callback.php، gen، 0، $ {CALLBACK_QUEUE})

 [إفعل رد]
 exten => _X. ، 1 ، NoOp (حاول الاتصال بقائمة الانتظار ($ {CALLBACK_QUEUE}) وإعادة الاتصال بـ $ {CALLBACK_NUM})
     same => n ، Set (__ DST = "؟")
     same => n ، Set (CALLERID (num) = $ {CALLBACK_NUM})
     same => n (call) ، قائمة الانتظار ($ {CALLBACK_QUEUE} ، tT)
     same => n ، NoOp (CALLBACK QUEUESTATUS = $ {QUEUESTATUS})

 [ماكرو-طابور answ].  وصلنا إلى هنا عندما أجاب المشغل. 
 exten => s ، 1 ، NoOp (أجاب عضو قائمة الانتظار uniq = $ {UNIQUEID} cid = $ {CALLERID (num)} chan = $ {CHANNEL} callback_id = $ {CALLBACK_ID} callback_num = $ {CALLBACK_NU
     same => n، GotoIf ($ ["$ {CALLBACK_ID} x" = "x"]؟ skip)
     same => n ، Set (DST = $ {CHANNEL})
     same => n ، Set (CALLERID (num) = 067)
     same => n ، التشغيل (تجربة خاصة) ؛  تشغيل المشغل "انتظر الاتصال"
     same => n ، agi (callback.php ، قائمة انتظار الإجابة ، $ {CALLBACK_ID} ، $ {CHANNEL} ، $ {UNIQUEID})
     same => n ، Dial (Local / $ {CALLBACK_NUM}from_office_new)
     same => n ، NoOp ([مهلة قائمة انتظار الماكرو - إجابة] مهلة الطلب)
     same => n (تخطي) ، NoOp ()

 exten => h، 1، NoOp ([طلب قائمة انتظار الماكرو])
     same => n، GotoIf ($ ["$ {CALLBACK_ID} x" = "x"]؟ end)
     same => n ، NoOp (dialstatus = $ {DIALSTATUS} hangupcause = $ {HANGUPCAUSE} queuestatus = $ {QUEUESTATUS})
     same => n ، NoOp (my_dialstatus = $ {MY_DIALSTATUS} my_hangupcause = $ {MY_HANGUPCAUSE})
     same => n، agi (callback.php، hangup-queue-answering، $ {CALLBACK_ID}، $ {CHANNEL}، $ {UNIQUEID})
     نفسه => ن (النهاية) ، NoOp

 [استدعاء-كاملة]
 exten => s ، 1 ، NoOp (رد الاتصال مكتمل. CALLBACK_ID = $ {CALLBACK_ID} ، uniq = $ {UNIQUEID} ، dst = $ {DST} chan = $ {CHANNEL})
     same => n ، NoOp (dialstatus = $ {DIALSTATUS} hangupcause = $ {HANGUPCAUSE} queuestatus = $ {QUEUESTATUS})
     same => n ، NoOp (my_dialstatus = $ {MY_DIALSTATUS} my_hangupcause = $ {MY_HANGUPCAUSE})


ملف Queues.conf
 [مشغلي]
     ringinuse = لا
     استراتيجية = rrmemory
     الموسيقى = الافتراضي
     عضو => SIP / 321
     عضو => SIP / 322
     عضو => SIP / 323
     عضو => SIP / 324
     عضو => SIP / 325
     عضو => وكيل / 1
     عضو => وكيل / 2
     عضو => وكيل / 3
     عضو => وكيل / 4
     عضو => وكيل / 5
     السياق = main_menu_press
     مهلة = 0
     أعلن موقف = نعم
     يعلن تردد = 60
     إعلان دوري التردد = 30
     قائمة الانتظار - youarenext = قائمة الانتظار - youarenext
     membermacro = قائمة انتظار الإجابة


حسنًا ، البرامج النصية (تم اكتشاف PHP)

ملف config.php
<?php ob_implicit_flush(true); set_time_limit(6); date_default_timezone_set('Europe/Moscow'); mysql_connect("localhost","asterisk","***") or die('Mysql connect error'); mysql_select_db("asterisk"); // ******************************* function genCallbackFile($id,$cid,$queue) { $fname='/var/spool/asterisk/outgoing/callback-'.$id; if (file_exists($fname)) return; $callfile="Channel: Local/".$cid."@do-callback\n". "WaitTime: 60\n". "MaxRetries: 1\n"."RetryTime: 120\n". "Context: callback-complete\n". "Extension: s\n". "Set: __CALLBACK_ID=$id\n". "Set: __CALLBACK_QUEUE=$queue\n". "Set: __CALLBACK_NUM=$cid\n"; $fp=fopen($fname,'w+');fputs($fp,$callfile);fclose($fp); } ?> 


callback.php
 #!/usr/bin/php <? $arg=$_SERVER["argv"]; $a=$arg[1]; $id=abs($arg[2]); include('/var/lib/asterisk/agi-bin/config.php'); $in = fopen("php://stdin","r"); $stdlog = fopen("/var/log/asterisk/callback.log", "a+"); // toggle debugging output (more verbose) $debug = false; // parse agi headers into array while ($env=read()) { $s = split(": ",$env); $agi[str_replace("agi_","",$s[0])] = trim($s[1]); if (($env == "") || ($env == "\n")) { break; } } // main program ************************ $dt=date('dmY H:i:s'); $cid=$agi[callerid]; switch ($a) { case 'cid-answ' : { // -    $stmt='select * from callback where id='.$id; $result=mysql_query($stmt); $row=mysql_fetch_object($result); $cid=$row->cid; $stmt="select * from callback where id=$id or (dt>(now()-interval 24 hour) and cid='$cid' and STATUS<>2)"; $result=mysql_query($stmt); while ($row=mysql_fetch_object($result)) { $id=$row->id; $stmt="update callback set status=2,compl_dt=now() where id=$id"; $result=mysql_query($stmt); rename('/var/spool/asterisk/outgoing/callback-'.$id,'/tmp/callback-'.$id); } break; } case 'queue-answ' : { //     .       $dst=$arg[3]; $stmt=sprintf('update callback set status=1,last_call=now(),tot_calls=tot_calls+1,dst="%s",uniqueid="%s" where id=%d",$dst,$agi[uniqueid],$id); $result=mysql_query($stmt); break; } case 'complete' : { //  ,        ,   callfile  $id=abs($arg[2]); $stmt='select * from callback where id='.$id; $result=mysql_query($stmt); $row=mysql_fetch_object($result); if ($row->status!=2) genCallBackFile($id,$row->cid,$row->queue); break; } case 'gen': { //        $qname=trim($arg[3]); if (!$qname) $qname='operators'; //        0, ,    .      $stmt=sprintf('select * from callback where cid="%s" and queue="%s" status<>2 and dt>now()-interval 24 hour',$cid,$qname); $result=mysql_query($stmt); if (!$row=mysql_fetch_object($result)) { $stmt="insert into callback (cid,queue) values ('$cid','$qname')"; $result=mysql_query($stmt); $id=mysql_insert_id(); fputs($stdlog,"$dt|$stmt\n"); } else { $log_status='cid '.$cid.' already in spool '.$qname; } genCallBackFile($id,$cid,$qname); break; } } $stmt=sprintf('insert into callback_log (callback_id,status) values (%d,"%s -> %s")',$id,$a,$log_status); $result=mysql_query($stmt); $log_id=mysql_insert_id(); // clean up file handlers etc. fclose($in); fclose($stdlog); exit; // **************************************** ?> 


ونضع ملف callback-regen.php واحدًا لتجديد ملفات الاتصال في تيجان كل 5 دقائق بين 8 صباحًا و 8 مساءً.
مع كل محاولة ، يتم زيادة وقت المكالمة المتكررة بنسبة 5 دقائق. بعد 10 محاولات للسخرية من المشغل ، توقف
 #!/usr/bin/php <? include('/var/lib/asterisk/agi-bin/config.php'); $stmt='select * from callback where status<>2 and dt>now()-interval 24 hour and tot_calls<=10 '. ' and last_call<now()-interval tot_calls*5 minute '. ' group by cid,queue'; $result=mysql_query($stmt); while ($row=mysql_fetch_object($result)) { genCallBackFile($row->id,$row->cid,$row->queue); } // **************************************** ?> 

Source: https://habr.com/ru/post/ar471500/


All Articles