Определение страны по номеру телефона в Asterisk

Материал из support.qbpro.ru

В этой статье будет описано, как решить задачу определения страны по номеру телефона средствами диалплана Asterisk.

Определение страны по номеру телефона — важная задача телефонии, решение которой необходимо для реализации таких механизмов, как — запрет/разрешение вызовов в определённые страны — различная маршрутизация входящих вызовов, в зависимости от страны звонящего (проигрывание сообщений на различных языках) — добавление названия страны звонящего к Caller ID Формирование базы кодов стран

  • Для хранения кодов стран будет использоваться следующая таблица MySQL:
CREATE TABLE ‘country_tel_codes’ (
‘country_code’ smallint(6) NOT NULL,
‘region_code’ smallint(6) DEFAULT NULL,
‘country_name’ varchar(255) NOT NULL DEFAULT »,
‘region_name’ varchar(255) NOT NULL DEFAULT »,
KEY ‘country_code’ (‘country_code’),
KEY ‘region_code’ (‘region_code’)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
country_code — телефонный код страны
region_code — телефонный код региона страны
country_name — название страны
region_name — название региона страны
  • Указанных полей вполне достаточно для решения обозначенных задач.

Телефонный код региона и название региона будут использоваться только для различия телефонных номеров США и Канады (из-за особенностей плана нумерации стран Северной Америки).

Информацию для наполнения таблицы можно взять, например, здесь http://www.allareacodes.com/international_dialing_codes.htm, выделите на странице всю таблицу с кодами стран и вставьте её в какой-либо файл. Для внесения информации в таблицу, нужно преобразовать данные в формат CSV, можно сделать это с помощью следующего скрипта:

#!/bin/bash
 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 if [ «$1″ == » ]; then
echo ‘Please specify the codes file’
exit 1
fi
 CODES_FILE=»$1″
if [ ! -r «$CODES_FILE» ]; then
echo «Couldn’t read ‘$CODES_FILE'»
exit 1
fi
 while read -r line; do
COUNTRY_NAME=»${line%% *}»
[ «$COUNTRY_NAME» == ‘Country’ ] && continue
line=»${line#* }»
COUNTRY_CODE=»${line%% *}»
line=»${line#* }»
line=»${line#* }»
line=»${line#* }»
PHONE_FORMAT=»${line%% *}»
 REGION_NAME=
REGION_CODE=
 if ! [[ $PHONE_FORMAT =~ digit ]]; then
continue
fi
if [ «$COUNTRY_NAME» == ‘Canada’ ] || [ «$COUNTRY_NAME» == ‘United States’ ]; then
continue
fi
 if [[ $PHONE_FORMAT == *(* ]]; then
REGION_NAME=»$COUNTRY_NAME»
[[ $COUNTRY_NAME == *,* ]] && COUNTRY_NAME=»»${COUNTRY_NAME}»»
[[ $REGION_NAME == *,* ]] && REGION_NAME=»»${REGION_NAME}»»
REGION_CODES=»${PHONE_FORMAT##*(}»
REGION_CODES=»${REGION_CODES%%)*}»
REGION_CODE=»${REGION_CODES%%/*}»
REGION_CODES=»${REGION_CODES#${REGION_CODE}}»
REGION_CODES=»${REGION_CODES#/}»
 while [ «$REGION_CODE» != » ]; do
echo «${COUNTRY_CODE},${REGION_CODE},${COUNTRY_NAME},${REGION_NAME}»
 REGION_CODE=»${REGION_CODES%%/*}»
REGION_CODES=»${REGION_CODES#${REGION_CODE}}»
REGION_CODES=»${REGION_CODES#/}»
done
else
REGION_NAME=»$COUNTRY_NAME»
[[ $COUNTRY_NAME == *,* ]] && COUNTRY_NAME=»»${COUNTRY_NAME}»»
[[ $REGION_NAME == *,* ]] && REGION_NAME=»»${REGION_NAME}»»
echo «${COUNTRY_CODE},${REGION_CODE},${COUNTRY_NAME},${REGION_NAME}»
fi
done <«$CODES_FILE»