Определение страны и города звонящего в Asterisk

Друг, как было бы полезно знать, откуда тебе приходит звонок? На базе этих данных можно маршрутизировать клиента (например, оператор №1 для Москвы, оператор №2 для Новосибирска, оператор №3 для Владивостока, англоязычный оператор №4 для заграничных звонков), или, например, делать различные голосовые приветствия для разной категории городов, например: «Здравствуйте! Вы позвонили в компанию «COMPANY_NAME». В Екатеринбурге сегодня +2, а мы соединяем Вас с оператором». Круто, не правда ли?

Кстати, сделать такое приветствие не сложно. Почитайте наш материал про синтез речи на Asterisk по этой ссылке :)

Содержать и постоянно актуализировать базу данных с телефонными префиксами задача весьма нетривиальная. Что делать в таком случае? Конечно использовать внешний API. А еще лучше, если он будет бесплатным. И да, у нас такой есть :)

Обучайся в Merion Academy

Пройди курс по
Asterisk

Начать

Пошаговое видео


numverify.com

Для определения географической принадлежности номера мы будем использовать сервис numverify. У него есть отличный и простой API, а самое главное, сервис бесплатен при ограничении не более 250 запросов к API в месяц (12 – 13 запросов в рабочий день). Переходим по этой ссылке и регистрируемся на бесплатном тарифе:

Регистрация в сервисе numverify

Нажимаем Sign Up на нужном тарифе, заполняем форму (оставляем контактные данные) и получаем API – ключик:

Получение API

Копируем API – ключ и переходим к настройке скрипта в Asterisk.


Telegram - бот

Перед продолжение настройки, создаем Telegram – бота. О том, как это сделать читайте по кнопке (получаем API – токен и ID - чата):


Скрипт AGI

На этом этапе у нас должен быть 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

Работает! А если нам позвонят из Владивостока? :)

Определение страны и города звонящего в Asterisk

Отлично. В зависимости от города звонящего, вы можете делать маршрутизацию вызова. Например, для Москвы возвращать в диалплан переменную со значением 1, для Новосибирска 2, для Владивостока 3 и так далее. А в зависимости от этого делать маршрутизацию вызова. Пример можно посмотреть в этой статье:

Who's online

There are currently 1 user and 1 guest online.