Звонок через нужный транк с учетом номеров, переведенных к другим операторам

Материал из Mindsellers
Перейти к: навигация, поиск

Python

Недавно я писал о том, как звонить через нужный транк: мы получали реестр номеров, выгружали его в базу и потом делали к базе запрос. Однако, выгружаемая база РосСвязьНадзора учитывает только выделение пулов, но не учитывает перевод номеров от одного оператора к другому. Сегодня скрипт гораздо проще, но сразу предупрежу, он не подходит для использования на высоконагруженных системах, потому что мы будем использовать API мегафона(которое и позволяет по номеру телефона точно определить оператора), официального описания условий использования я так и не нашел, но заметил, что мегафон вводит принудительную задержку длительностью в 1 секунду, и я уже разок умудрился словить бан - 403 ошибку начала отдавать API.

Суть API простая - GET-запросом отдаем номер, в ответ получаем json, содержащий название оператора, его ID, название региона и его ID. Нас, по понятным причинам, будет интересовать только ID оператора номера, которые бывают 1 и 2 знака в длину

Давайте сразу посмотрим скрипт

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import requests

def main(number):
	if len(number)==10 and number.isdigit(): #если длина номера 10 знаков и это цифры
		r=requests.get('http://www.megafon.ru/api/mfn/info?msisdn='+number) #выполняем запрос
		try:
			return str(dict(r.json())['operator_id']).zfill(2) #пытаемся вернуть id оператора, добавив при необходимости 0 в начало
		except:
			return '00' #возвращаем 00, если не удалось
	else:
		return '00' #возвращаем 00, если номер не соответствует параметрам


if __name__=='__main__': #если скрипт запущен сам по себе
	try:
		number=sys.argv[1] #извлекаем первый аргумент
		print(main(number),end='') #передаем его функции
	except:
		print('00',end='') #если не удалось, возвращаем 00


Из открытых источников мне удалось получить таблицу соответствия кодов и операторов. Из реально действующих:

МТС - 01

Мегафон - 02 или 14

Смартс - 07

Скартел - 11

TELE2 - 20, 03, 05

Ростелеком - 39

МТТ - 42

Билайн - 99

Именно эти коды и нужно обрабатывать в маршрутах, которые будут построены на основе выполнения моего скрипта. Давайте вновь посмотрим пример диалплана:

[from-internal-custom]
exten => _89X.,1,Set(prefix=00)
exten => _89X.,n,Set(prefix=${SHELL(/opt/def/nummeg.py ${EXTEN:1})})
;скрипту передаем номер в 10-значном формате
exten => _89X.,n,Noop(${prefix})
exten => _89X.,n,Goto(from-internal,${prefix}${EXTEN},1)
;дописываем префикс и возвращаем звонок на стандартную логику FreePBX

Естественно, скрипт, листинг которого вы видели выше, должен лежать по адресу /opt/def/nummeg.py и быть доступен на исполнение пользователю, от которого работает asterisk.


Шаблоны для маршрутов в таком случае должны выглядеть примерно так:

02 | 89XXXXXXXXX

14 | 89XXXXXXXXX

для мегафона;

99 | 89XXXXXXXXX

для билайна, и так далее. Последним должен идти маршрут для тех номеров, которые не удалось определить, или они не входят в перечень основных, с которыми мы должны работать:

XX | 89XXXXXXXXX

то есть, мы просто удаляем первые 2 цифры номера(а они будут в любом случае добавлены на основании включения в from-internal)

На этом настройка будет закончена