Alea jacta est. Юлий Цезарь 44 г. до н.э. (Жребий брошен)

Дальше

 

Часто, по разным причинам, возникает необходимость обзвонить определенны номера абонентов и проинформировать их о чем-либо. С такой задачей легко справится Astrisk. Для этого разработчики предусмотрели несколько вариантов, я хочу рассказать как это сделал используя незамысловатую логику в скрипте и call файлы.

И так начнем с исходного: Имеется Asterisk 11 + Freepbx 2.11 на ОС Debian 7. Разумеется все работает :)

.call файл - это текстовые файлы, которые при помещении их в определенную директорию (по умолчанию /var/spool/asterisk/outgoing/) заставляют Asterisk совершить исходящий вызов.

Для начала создадим такой файл, я назвал его osnova.call и вот его содержимое:

Channel: Local/123456@from-internal
Callerid: Asterisk 11 <Ваш DID>
MaxRetries: 5
RetryTime: 10
WaitTime: 15
Account: obzvon
Context: from-obzvon
Extension: obzvon
Archive: Yes

Пояснилка:

Channel: : Канал, который будет использоваться для исходящего вызова.- если у вас freepbx то вместо 123456 указывайте номер на который собираетесь звонить. В результате такой хитрой строчке вы сможете наблюдать человеческие записи в CDR и да же их прослушивать при необходимости.

CallerID: Name - ваш номер телефона, с которого осуществяется обзвон

MaxRetries: Количество попыток перед тем, как вызов будет считаться неудачным (не включая первую попытку, т.е. 0 = означает совершить 1 попытку вызова). Значение по умолчанию: 0.

RetryTime: Количество секунд между попытками вызова, не стоит очень часто ломиться на недоступный телефон. Значение по умолчанию: 300 (5 минут)

WaitTime: Количество секунд для ожидания ответа на вызов. Значение по умолчанию: 45.

Account: Установка поля “account code”для записи в CDR

Context: Контекст в файле extensions.conf - не забываем что у нас freepbx, а это значит что запись надо искать тут /etc/asterisk/extensions_custom.conf

Extension: Название екстеншена в extensions.conf - не забываем что у нас freepbx, а это значит что запись надо искать тут /etc/asterisk/extensions_custom.conf

Archive: Yes/No – Переносить или нет .call файл в поддиректорию "outgoing_done" с установленным значением поля "Status: значение", где значение может быть: Completed, Expired или Failed.

Вся необходимая информация мною была взята тут.

Ну все, с самим call файлом разобрались, теперь добавляем в /etc/asterisk/extensions_custom.conf следующее:

[from-obzvon]
exten => obzvon,1,Answer()
exten => obzvon,n,Playback(hello-world)
exten => obzvon,n,Wait(3)
exten => obzvon,n,Playback(vm-goodbye)
exten => obzvon,n,Hangup()

В моем случаи астер будет звонить, ждать когда поднимут трубку, воспроизводить фразу hello-world, ждать 3 секунды, воспроизводить фразу vm-goodbye и ложить трубку. Вы можете в этом контексте наворотить что угодно вплоть до голосового меню и пере адресацией на другой номер. Дело за вами.

И не забываем сделать релоуд астеру. Готова, проверяем берем наш файл osnova.call, заменяем в нем номер на тестовый и Внимание делаем mv(а не cp)

mv osnova.call /var/spool/asterisk/outgoing/

Важно: владелец файл должен быть пользователь аналогичный тому от имени которого работает сам астериск.

Берем трубку и слушаем hello-world и vm-goodby.

Хочу обратить внимание, что использовалась команда mv, т.к. астериск с разницей в доли секунд начинает обработку файлов из директории outgoing, а команда cp и mv работают по разному. Видимо cp копирует как-то побайтно байт за байтом создавая файл в директории назначения, в то время как mv сначала переносит всю информацию в директорию, а потом публикует файл там. В общем это рекомендации разработчиков и к ним стоит прислушаться.

После окончания звонка, астер переместит файл в директорию /var/spool/asterisk/outgoing_done и можно будет просмотреть статус выполнения, если конечно вам мало CDR записи.

Если до этого момента у вас все получилось переходим к созданию скрипта. Для начала создадим файл number.txt, где в каждой строчке напишем номера телефонов, ктр нужно обзвонить. Затем создадим сам скрипт с таким содержимым:

#!/bin/bash

number=`cat number.txt`

#find /var/spool/asterisk/outgoing_done/ -ctime +62 -type f -exec rm -f {} \;

echo "Start parsing file number.txt `date "+%T %D"`"

for a in $number
do
SED=s/123456/$a/
DATA=`date +%N`
cat osnova.call | sed $SED > "$a"_"$DATA".call
chown asterisk. $PWD
echo "Zvonyu na $a `date "+%T %D"`"
mv "$a"_"$DATA".call /var/spool/asterisk/outgoing/
sleep 60
done

echo "Finish parsing file number.txt `date "+%T %D"`"

exit 0

Обратите внимание на sleep 60, это делается для того, что бы напроч не забить внешнии каналы и не повесить астериск нагрухо.

У меня в файле number.txt около 60 номеров, все работает как часы. Нужно лишь либо запустить скрипт в ручную либо добавить задание в планировщик и периодически наблюдать как астер домогается до выбранных вами номеров телефонов :)