Друг, как было бы полезно знать, откуда тебе приходит звонок? На базе этих данных можно маршрутизировать клиента (например, оператор №1 для Москвы, оператор №2 для Новосибирска, оператор №3 для Владивостока, англоязычный оператор №4 для заграничных звонков), или, например, делать различные голосовые приветствия для разной категории городов, например: «Здравствуйте! Вы позвонили в компанию «COMPANY_NAME». В Екатеринбурге сегодня +2, а мы соединяем Вас с оператором». Круто, не правда ли?
Кстати, сделать такое приветствие не сложно. Почитайте наш материал про синтез речи на Asterisk по этой ссылке :)
Содержать и постоянно актуализировать базу данных с телефонными префиксами задача весьма нетривиальная. Что делать в таком случае? Конечно использовать внешний API. А еще лучше, если он будет бесплатным. И да, у нас такой есть :)
Для определения географической принадлежности номера мы будем использовать сервис numverify. У него есть отличный и простой API, а самое главное, сервис бесплатен при ограничении не более 250 запросов к API в месяц (12 – 13 запросов в рабочий день). Переходим по этой ссылке и регистрируемся на бесплатном тарифе:
Нажимаем Sign Up на нужном тарифе, заполняем форму (оставляем контактные данные) и получаем API – ключик:
Копируем API – ключ и переходим к настройке скрипта в Asterisk.
Перед продолжение настройки, создаем Telegram – бота. О том, как это сделать читайте по кнопке (получаем API – токен и ID - чата):
На этом этапе у нас должен быть API – токен от Telegram бота и ID группового чата. Мы будем выполнять AGI – скрипт из диалплана при входящем звонке и отправлять данные в Telegram :) Переходим к самому скрипту:
#!/usr/bin/php -q
<?php
#парсим callerid
require('phpagi.php'); 
$agi = new AGI(); 
$cid = $agi->request['agi_callerid'];
#данные для подключения к Telegram
$token = "ваш_api_от_Telegram";
$chat_id = "ID_чата";
#укажите ваш api - ключ от numverify
$apikey = "api_ключ_от_numverify";
#вырезаем 10 цифр справа от номера и подставляем 7ку сначала (для приведения к требуемому формату)
$phone_loc = substr($cid, -10);
$phone_loc = "7$phone_loc";
#обращаемся к API и обрабатываем результат
$numverify_url = "http://apilayer.net/api/validate?access_key=$apikey&number=$phone_loc";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$numverify_url);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$numverify = curl_exec ($ch);
curl_close($ch);
#декодируем JSON
$numverify_o = json_decode($numverify, true);
print_r ($numverify_o);
#формируем массив для отправки данных в Telegram
$arr = array(
'Коллеги, нам звонит:' => $cid,
'Код страны:' => $numverify_o['country_code'],
'Название страны:' => $numverify_o['country_name'],
'Локация:' => $numverify_o['location'],
'Тип линии (городской/мобильный):' => $numverify_o['line_type'],
);
foreach($arr as $key => $value) {
$txt .= "".$key." ".$value."%0A";
};
#отправляем данные в сторону API Telegram
fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");
?>
В случае скачивания, поменяйте расширение файла с .txt на .php
Огонь! Сохраняем этот скрипт как numverify.php и загружаем его в папку /var/lib/asterisk/agi-bin. Это можно сделать с  помощью WinSCP, например. Далее, в консоли через SSH доступ на сервер Asterisk дайте следующие команды:
dos2unix /var/lib/asterisk/agi-bin/numverify.php chown asterisk:asterisk /var/lib/asterisk/agi-bin/numverify.php chmod 775 /var/lib/asterisk/agi-bin/numverify.php
Поправим диалплан. Сделайте исполнение этого скрипта в транке, например:
exten => _.,n,AGI(numverify.php)
Перезагружаем диалплан командой:
dialplan reload
Итак, давайте проверим, что у нас получилось. Позвоним с номера 4996491913:
Тип линии landline - городской номер, mobile - мобильный и так далее. Более подробно можно почитать в документации numverify
Работает! А если нам позвонят из Владивостока? :)
Отлично. В зависимости от города звонящего, вы можете делать маршрутизацию вызова. Например, для Москвы возвращать в диалплан переменную со значением 1, для Новосибирска 2, для Владивостока 3 и так далее. А в зависимости от этого делать маршрутизацию вызова. Пример можно посмотреть в этой статье: