Определение страны по номеру телефона в Asterisk: различия между версиями

Материал из support.qbpro.ru
imported>Vix
Нет описания правки
imported>Vix
Нет описания правки
Строка 89: Строка 89:
У всех стран Северной Америки общий номерной план — 11 цифр, первая цифра — 1, по следующим трём цифрам можно определить страну принадлежности номера. Канаде и США соответствует достаточно большое количество трёхзначных кодов, идущих вперемешку друг с другом и с кодами других стран, поэтому коды регионов Канады и США будут обработаны отдельно.
У всех стран Северной Америки общий номерной план — 11 цифр, первая цифра — 1, по следующим трём цифрам можно определить страну принадлежности номера. Канаде и США соответствует достаточно большое количество трёхзначных кодов, идущих вперемешку друг с другом и с кодами других стран, поэтому коды регионов Канады и США будут обработаны отдельно.
Ниже приведено содержимое CSV-файла для загрузки телефонных кодов Канады в таблицу кодов стран (телефонные коды Канады взяты из [https://en.wikipedia.org/wiki/Telephone_numbers_in_Canada Википедии] )
Ниже приведено содержимое CSV-файла для загрузки телефонных кодов Канады в таблицу кодов стран (телефонные коды Канады взяты из [https://en.wikipedia.org/wiki/Telephone_numbers_in_Canada Википедии] )
<syntaxhighlight lang="shell" line='line'>
cat <<«EOF123» >/tmp/canada.csv
1,204,Canada,Manitoba
1,226,Canada,Ontario
1,236,Canada,British Columbia
1,249,Canada,Ontario
1,250,Canada,British Columbia
1,289,Canada,Ontario
1,306,Canada,Saskatchewan
1,343,Canada,Ontario
1,365,Canada,Ontario
1,403,Canada,Alberta
1,416,Canada,Ontario
1,418,Canada,Quebec
1,431,Canada,Manitoba
1,437,Canada,Ontario
1,438,Canada,Quebec
1,450,Canada,Quebec
1,506,Canada,New Brunswick
1,514,Canada,Quebec
1,519,Canada,Ontario
1,579,Canada,Quebec
1,581,Canada,Quebec
1,587,Canada,Alberta
1,600,Canada,Specialized Telecom Services
1,604,Canada,British Columbia
1,613,Canada,Ontario
1,639,Canada,Saskatchewan
1,647,Canada,Ontario
1,705,Canada,Ontario
1,709,Canada,Newfoundland and Labrador
1,778,Canada,British Columbia
1,780,Canada,Alberta
1,782,Canada,Nova Scotia and Prince Edward Island
1,807,Canada,Ontario
1,819,Canada,Quebec
1,867,Canada,»Yukon, Northwest Territories and Nunavut»
1,873,Canada,Quebec
1,902,Canada,Nova Scotia and Prince Edward Island
1,905,Canada,Ontario
EOF123
</syntaxhighlight>

Версия от 15:09, 13 октября 2020

В этой статье будет описано, как решить задачу определения страны по номеру телефона средствами диалплана 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-файла для загрузки телефонных кодов Канады в таблицу кодов стран (телефонные коды Канады взяты из Википедии )

cat <<«EOF123» >/tmp/canada.csv
1,204,Canada,Manitoba
1,226,Canada,Ontario
1,236,Canada,British Columbia
1,249,Canada,Ontario
1,250,Canada,British Columbia
1,289,Canada,Ontario
1,306,Canada,Saskatchewan
1,343,Canada,Ontario
1,365,Canada,Ontario
1,403,Canada,Alberta
1,416,Canada,Ontario
1,418,Canada,Quebec
1,431,Canada,Manitoba
1,437,Canada,Ontario
1,438,Canada,Quebec
1,450,Canada,Quebec
1,506,Canada,New Brunswick
1,514,Canada,Quebec
1,519,Canada,Ontario
1,579,Canada,Quebec
1,581,Canada,Quebec
1,587,Canada,Alberta
1,600,Canada,Specialized Telecom Services
1,604,Canada,British Columbia
1,613,Canada,Ontario
1,639,Canada,Saskatchewan
1,647,Canada,Ontario
1,705,Canada,Ontario
1,709,Canada,Newfoundland and Labrador
1,778,Canada,British Columbia
1,780,Canada,Alberta
1,782,Canada,Nova Scotia and Prince Edward Island
1,807,Canada,Ontario
1,819,Canada,Quebec
1,867,Canada,»Yukon, Northwest Territories and Nunavut»
1,873,Canada,Quebec
1,902,Canada,Nova Scotia and Prince Edward Island
1,905,Canada,Ontario
EOF123