Quantcast
Channel: IP АТС Asterisk
Viewing all articles
Browse latest Browse all 1041

Asterisk Автообзвон - Autodialer

$
0
0

Asterisk Автообзвон - Autodialer

Примеры реализации автообзвона (autodialer) на Asterisk.

Автообзвон при помощи Call File

Реализация автоматического обзвона абонентов (автодозвона) при помощи Asterisk и call файлов. Bash скрипт генерирует 'Call File' на основании списка номеров из текстового файла и копирует в директорию /var/spool/asterisk/outgoing. Asterisk вызывает номер на основании информации из 'call file' и отправляет на обработку в заданный контекст или приложение плана набора.
Все очень просто и эффективно.

Синтаксис Call File:

Логика 'Call File' такая же, как и команды originate.
Сначала инициируется 'Channel', если заданный в данном параметре номер отвечает,
вызывается 'Extension' или 'Application' и соединяются с 'Channel'.
Если 'Channel' не отвечает в течении 'WaitTime', а параметр 'MaxRetries' больше нуля,
предпринимается заданное кол-во попыток 'MaxRetries' с интервалом 'RetryTime'.

Параметры канала
  • Channel: <channel>: инициируемый канал (например Local/${number}/from-autodial )
  • CallerID: «name» <number> Caller ID, требуемый формат: CallerID: «Имя» <1234>
  • MaxRetries: <number> Кол-во попыток набора на каждый номер в списке (По умолчанию 0. Если установлено '0', будет совершена одна попытка, если '1' то две)
  • RetryTime: <number> Время в секундах между попытками. (Seconds between retries, Don't hammer an unavailable phone. По умолчанию 300 (5 min).)
  • WaitTime: <number> Время посылки вызова. (По умолчанию 45.)
  • Account: Аккаунт для вызова.
Параметры расширения:
  • Context: <context-name> Контекст для приема вызова, когда абонент ответил (extensions.conf)
  • Extension: <ext> Extension (расширение например:exten⇒ s,…) в контексте (extensions.conf)
  • Priority: <priority> Приоритет в контексте.
  • Set: Установить переменную канала для вызова (example: file1=/tmp/to );
  • Application: Приложение Asterisk (используется вместо context, extension, priority)
  • Data: Данные приложения (например: PlayBack(data))
  • AlwaysDelete: Yes/No - Удалять файлы по завершении.
  • Archive: Yes/No - Перемещать выполненные файлы в директорию outgoing_doneс указанием статуса с которым завершилось задание «Status: value», где возможны значения
    • Completed - Успешно.
    • Expired - Просрочено.
    • Failed - Неудачно.

Expired или Failed отличаются по статусу вызова. Если вызов удался, но на него не ответили в заданное время вызова и кол-во попыток, то Expired. Если вызов не удалось инициировать вообще, то Failed.

пример архивного файла

пример архивного файла

Channel: Local/00089XXXXXXXXX@from-fs-alarm
Callerid:
MaxRetries: 0
RetryTime: 20
WaitTime: 30
Context: alert_mob
Extension: s
Priority: 1
Archive: yes

StartRetry: 3426 1 (1479384177)

DelayedRetry: 3426 0 (1479384177)
Status: Completed

Autodial: пример 1

Вызываются номера по списку и проигрывается сообщение из контекста [outboundmsg1].

dialplan

/etc/asterisk/extensions.conf

/etc/asterisk/extensions.conf

[outboundmsg1]
exten => s,1,Wait(2)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/you_call_your_friends_are_collectors)
exten => s,n,Hangup
bash script

/var/spool/asterisk/call_list.sh

/var/spool/asterisk/call_list.sh

#!/bin/sh

while read number; do

cat <<EOF  >  /var/spool/asterisk/$number

Channel: SIP/voip_trunk/$number
Callerid: $number
MaxRetries: 200
RetryTime: 20
WaitTime: 30
Context: outboundmsg1
Extension: s
Priority: 1

EOF

    chown asterisk:asterisk /var/spool/asterisk/$number
    mv /var/spool/asterisk/$number  /var/spool/asterisk/outgoing

    echo "$number"

    number=`expr $number + 1`

    while [ "$?" -eq "0" ]

    do
count_files ()

{

    count_f=`ls /var/spool/asterisk/outgoing | wc -l`

        if [ "$count_f" -eq "30" ]; then

            sleep 10

            return 0

        else

            return 1

        fi

}

    count_files

    done

done < /var/spool/asterisk/list.txt

exit 0

Примечания к скрипту:

  • Channel: SIP/voip_trunk/$number - voip_trunkтранк через который совершаются вызовы.
  • if [ «$count_f» -eq «30» ]; then - 30кол-во одновременных вызовов. (фактически это кол-во файлов создаваемых скриптом за один раз, следующие по списку файлы, будут созданы, только по завершению обработки первой группы)

/var/spool/asterisk/list.txt - список обзвона, каждый номер в новой строке.

   101
   102
пример predictive dialer

Автообзвон абонентов из базы данных средствами диалплана.

extconfig.conf

 autodial=>odbc,sql2,autodial

БД

> select * from autodial;
+------+--------+--------+-------+
| id   | number | status | count |
+------+--------+--------+-------+
| 1    | 2666   | new    | 0     |
| 2    | 2667   | new    | 0     |
| 3    | 2668   | new    | 0     |
+------+--------+--------+-------+

func_odbc.conf

[SQL]
dsn=sql2
mode=multirow
readsql=SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}

extensions.conf

[autodial]
exten => s,1,Noop
same => n,Set(_i=${ODBC_FETCH(${ODBC_SQL(1)})})  ;получаем id = SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}
  same => n,While($[${REALTIME_FIELD(autodial,id,${i},count)} <= 3])                            ; старт цикла
  same => n,Set(REALTIME(autodial,id,${i},status)=inuse)                                        ; статус вызова
  same => n,Dial(PJSIP/${REALTIME_FIELD(autodial,id,${i},number)}@fs_pjsip,5,U(sub-answer^s^1)) ; набор номера, с подпрограммой диалплана
                                                                                                ; sub-answer, выполняется, если вызываемый номер
                                                                                                ; ответил на вызов.
																								; ответил.
  same => n,Goto(s-${DIALSTATUS}) ; определяем действия в зависимости от статуса вызова
same => n(s-ANSWER),hangup  
same => n(s-NOANSWER),goto(s,loop) ; направим неотвеченные вызовы на приоритет loop
same => n(s-BUSY),goto(s,loop) 
same => n(s-CANCEL),Set(REALTIME(autodial,id,${i},status)=cancel)
same => n(s-CANCEL),hangup
  same => n(loop),set(count=${REALTIME_FIELD(autodial,id,${i},count)})                          ; приоритет для неотвеченных вызовов
  same => n,Set(REALTIME(autodial,id,${i},count)=$[${count} + 1])                               ; счетчик неотвеченных вызовов
  same => n,GotoIf($[${REALTIME_FIELD(autodial,id,${i},count)} >= 3]?no-answer,s,1)             ; если значение счетчика >= 3 
  same => n,ODBCFinish                                                                                              ; устанавливаем статус noanswer
  same => n,EndWhile
[sub-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=answer)
;exten => s,n,System(asterisk -rx 'channel  originate Local/s@autodial application queue queuename1')
; или
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))
  same => n,return
[no-answer]
exten => s,1,Set(REALTIME(autodial,id,${i},status)=noanswer)
exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))

Активация

originate Local/s@autodial application queue <queuename>

или

originate Local/s@autodial application playback <playback_name>

и т.д.

originate Local/s@autodial application confbridge <conference_name>

и т.п.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

<?php
$strHost = "127.0.0.1";
$strUser = "AMI User";
$strSecret = "AMI password";
$strChannel = "Local/s@autodial";
$strWaitTime = "60000";
$strApplication = $_POST['app'];
$strData = $_POST['data'];
$strVariable = "dst1=$strData";
$timeout1 = $_POST['timeout1'];
$strVariable = "timeout1=$timeout1";
$length = strlen($strData);

if ($length == 4 && is_numeric($strData))
{
$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die("Connection to host failed");
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Events: on\r\n");
fputs($oSocket, "Username: $strUser\r\n");
fputs($oSocket, "Secret: $strSecret\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $strChannel\r\n");
fputs($oSocket, "Timeout: $strWaitTime\r\n");
fputs($oSocket, "Application: $strApplication\r\n");
fputs($oSocket, "Data: $strData\r\n");
fputs($oSocket, "Variable: $strVariable\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep (1);
fclose($oSocket,128);

?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,georgia" color="#630000">Кампания активирована!<br><a href="<?php echo $_SERVER['PHP_SELF'] ?>">Ещё раз</a></td></tr></table></p><?php
}
else
{
?><p><table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0"><tr><td><font size="2" face="verdana,arial,georgia" color="#630000">Таймаут, Приложение и имя</font><form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"><input type="text" size="20" maxlength="12" name="timeout1" Value="sec"><p></p><input type="text" size="20" maxlength="12" name="app" Value="application"><p></p><input type="text" size="20" maxlength="12" name="data" Value="data"><p></p><input type="submit" value="Start"></form></td></tr></table></p><?php
}
?>

БД после завершения автообзвона

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+
2016/11/26

Tips&Tricks

Если установить параметры файла atimeи mtime (access time и modifity time соответственно) в будущем, файл помещенный в директорию outgoingбудет выполнен только по наступлении заданного времени.

Изменение меток времени файла командой touch

Изменение меток времени файла командой touch

Модификация time stamp при помощи опций -t и -d

The format for specifying -t is [[CC]YY]MMDDhhmm[.SS]

 $ touch -t [[CC]YY]MMDDhhmm[.SS]

формат:

  • CC – Первые две цифры года.
  • YY – Последние две цифры года CC - 19, YY -16 = 2016
  • MM – Месяц
  • DD – День
  • hh – Часы
  • mm – Минуты
  • SS – Секунды

пример:

 $ touch -a -m -t 203801181205.09 tgs.txt

Viewing all articles
Browse latest Browse all 1041

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>