Часто, по разным причинам, возникает необходимость обзвонить определенны номера абонентов и проинформировать их о чем-либо. С такой задачей легко справится 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 номеров, все работает как часы. Нужно лишь либо запустить скрипт в ручную либо добавить задание в планировщик и периодически наблюдать как астер домогается до выбранных вами номеров телефонов