Определение страны по номеру телефона в Asterisk
В этой статье будет описано, как решить задачу определения страны по номеру телефона средствами диалплана 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»
- Использовать скрипт можно так:
./process_codes.sh codes_raw >/tmp/countries.csv
Где:
«process_codes.sh» — имя скрипта, «codes_raw» — имя файла с исходной таблицей кодов, «countries.csv» — имя файла, в который будут записаны готовые данные для загрузки в таблицу MySQL.
У всех стран Северной Америки общий номерной план — 11 цифр, первая цифра — 1, по следующим трём цифрам можно определить страну принадлежности номера. Канаде и США соответствует достаточно большое количество трёхзначных кодов, идущих вперемешку друг с другом и с кодами других стран, поэтому коды регионов Канады и США будут обработаны отдельно. Ниже приведено содержимое CSV-файла для загрузки телефонных кодов Канады в таблицу кодов стран (телефонные коды Канады взяты из Википедии )