Callback atau “Meningkatkan loyalitas pelanggan”

Ada asterisk, sekelompok operator (3-5 orang) dengan muatan besar (waktu tunggu rata-rata> 2 menit)

Tugasnya adalah untuk pelanggan dengan geografi tertentu untuk memberikan kesempatan untuk tidak menunggu sampai operator bebas, dan dengan menekan 0 mendengar "Terima kasih atas panggilan. Kami pasti akan menghubungi Anda kembali ”, putuskan sambungan dan dengan tenang menunggu panggilan dari operator, baik atau pada orang biasa dengan Callback cerdas

Buat tabel
CREATE TABLE asterisk.callback (
id int (11) BUKAN NULL AUTO_INCREMENT,
stempel waktu dt DEFAULT CURRENT_TIMESTAMP,
cid varchar (32) DEFAULT NULL,
dst varchar (32) DEFAULT NULL,
status smallint (6) NOT NULL DEFAULT 0,
tot_calls int (11) TIDAK NULL DEFAULT 0,
last_call timestamp DEFAULT '0000-00-00 00:00:00',
stempel waktu compl_dt DEFAULT '0000-00-00 00:00:00',
uniqueid varchar (32) DEFAULT NULL,
queue varchar (255) DEFAULT NULL,
KUNCI UTAMA (ID)
)
ENGINE = INNODB

CREATE TABLE asterisk.callback_log (
id int (11) BUKAN NULL AUTO_INCREMENT,
callback_id int (11) TIDAK NULL,
stempel waktu dt DEFAULT CURRENT_TIMESTAMP PADA PEMBARUAN CURRENT_TIMESTAMP,
status varchar (32) DEFAULT NULL,
params varchar (2048) DEFAULT NULL,
KUNCI UTAMA (id),
CONSTRAINT callback_log_fk1 FOREIGN KEY (callback_id)
DAFTAR PUSTAKA asterisk.callback (id) DI DELETE CASCADE ON UPDATE CASCADE
)
ENGINE = INNODB

Mengedit extensions.conf

 exten => 88142590067, s, 1
     same => n, GotoIf ($ ["$ {CALLERID (num): 0: 4}" = "8814"]? ekstra);  jika nomornya adalah lokal, maka izinkan PANGGILAN
 .... Anda dapat memasukkan lebih banyak cek di sini ...
     same => n, Goto (panggilan)
     same => n (ekstra), NoOp (Izinkan panggilan balik untuk $ {CALLERID (num)})
     sama => n, Set (ALLOW_CALLBACK = 1)
     sama => n, Set (CALLBACK_QUEUE = operator)
     sama => n, Latar Belakang (vse / press0-to-callback)

     same => n (panggilan), NoOp (Minta operator. GROUP_COUNT = $ {GROUP_COUNT (operator)})
     sama => n, antrian (operator, tThH)
     sama => n, Hangup

 termasuk => main_menu_press

 [main_menu_press]
 exten => 0,1, NoOp ('-------------------- $ {CALLERID (num)} TOMBOL PRESS $ {EXTEN}. ALLOW_CALLBACK = $ {ALLOW_CALLBACK} ')
     same => n, GotoIf ($ [$ {ALLOW_CALLBACK} = 1]? callback, s, 1: i, 1)

 [panggilan balik]
 exten => s, 1, NoOp (CALLBACK)
     same => n, Putar ulang (terima kasih atas panggilan & vse / my-vam-perezvonim)
     sama => n, Hangup

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

 [do-callback]
 exten => _X., 1, NoOp (Coba panggil ke antrian ($ {CALLBACK_QUEUE}) dan panggil balik ke $ {CALLBACK_NUM})
     sama => n, Set (__ DST = "?")
     same => n, Set (CALLERID (num) = $ {CALLBACK_NUM})
     same => n (panggilan), antrian ($ {CALLBACK_QUEUE}, tT)
     same => n, NoOp (CALLBACK QUEUESTATUS = $ {QUEUESTATUS})

 [makro-antrian-jawab];  Kami tiba di sini ketika operator menjawab. 
 exten => s, 1, NoOp (Anggota antrian menjawab uniq = $ {UNIQUEID} cid = $ {CALLERID (num)} chan = $ {CHANNEL} callback_id = $ {CALLBACK_ID} callback_num = $ {CALLBACK_NU
     same => n, GotoIf ($ ["$ {CALLBACK_ID} x" = "x"]? lewati)
     sama => n, Set (DST = $ {CHANNEL})
     sama => n, Set (CALLERID (num) = 067)
     same => n, Playback (percobaan pribadi);  Operator bermain "Tunggu koneksi"
     same => n, agi (callback.php, antrian, $ {CALLBACK_ID}, $ {CHANNEL}, $ {UNIQUEID})
     same => n, Putar (Lokal / $ {CALLBACK_NUM} @from_office_new)
     same => n, NoOp (timeout tunggu [makro-antrian-jawab])
     sama => n (lewati), NoOp ()

 exten => h, 1, NoOp (hang-dial dial)
     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, hang--queue-answering, $ {CALLBACK_ID}, $ {CHANNEL}, $ {UNIQUEID})
     sama => n (akhir), NoOp

 [panggilan balik selesai]
 exten => s, 1, NoOp (Callback selesai. 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})


File Queues.conf
 [operator]
     ringinuse = tidak
     strategi = rrmemory
     music = default
     member => SIP / 321
     member => SIP / 322
     member => SIP / 323
     member => SIP / 324
     member => SIP / 325
     anggota => Agen / 1
     anggota => Agen / 2
     anggota => Agen / 3
     anggota => Agen / 4
     anggota => Agen / 5
     context = main_menu_press
     batas waktu = 0
     Umumkan-posisi = ya
     mengumumkan frekuensi = 60
     periodic-announce-frequency = 30
     queue-youarenext = antrian-youarenext
     membermacro = antrian-jawab


Sebenarnya skrip (PHP terdeteksi)

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; // **************************************** ?> 


Dan kami menempatkan satu file callback-regen.php lagi untuk regenerasi file panggilan dalam mahkota setiap 5 menit antara pukul 8 pagi dan 8 malam.
Dengan setiap upaya, waktu panggilan yang diulang bertambah 5 menit. Setelah 10 upaya untuk mengejek operator, berhenti
 #!/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/id471500/


All Articles