Перейти к содержимому
Калькуляторы

Выкладываю диалплан и скрипт проверки принадлежности номера сотовому оператору по данным сайтов.

 

Моё ТЗ выглядело примерно так:

1) Сайты для проверки

2) Номер астериском передается без 8-ки и +7 (в формате 9ХХХХХХХХХ)

3) Номер передается в правильном федеральном формате, число цифр строго 10, скрипт не проверяет правильность формата номера (это делает астериск)

4) Если один из сайтов не доступен или результат вывода не то что надо, то отправляем смс на мой номер.

5) Если результат вывода разный по сайтам то тоже отправляем смс с указанием в нем номера

6) Если оба сайта доступны и результат их работы корректный то:

6.1) Если, по обеим сайтам, region_id равен (76 - это мой домашний регион) И operator_id равен (1 или 2 или 99) то устанавливаем переменные:

ch_mejgorod=0 # признак междугороднего канала 0- не межгород (через симки), 1 -межгород (платный вызов)

operator_id=1 # ID оператора сотовой связи (1-МТС, 2-Мегафон, 99-Билайн)

region_id=76 # Регион регистрации (принадлежности) сотового номера (Внимание! Регионы сотовых операторов зачастую не совпадают с номерами автомобильных кодов регионов)

6.2) В остальных случаях, если region_id не равен 76 ИЛИ operator_id не равен (1 или 2 или 99):

ch_mejgorod=1 #признак междугороднего канала

operator_id=04

region_id=33

 

Скрипт:

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__ = 'Andrey Smirnov'
__email__ = 'mail@ansmirnov.ru'

import requests
import datetime
import json
import sys

from requests.auth import HTTPBasicAuth


def check1(phone):
   try:
       res = requests.get('http://mnp.tele2.ru/gateway.php?%s' % phone).json()
       return (int(res['response']['geocode']['code']), int(res['response']['mnc']['code']))
   except:
       return None


def check2(phone):
   try:
       res = requests.get('http://moscow.shop.megafon.ru/get_ajax_page.php?action=getMsisdnInfo&msisdn=7%s' % phone).json()
       return (int(res['region_id']), int(res['operator_id']))
   except:
       return None


def write_log(logname, msg):
   f = open(logname, 'a')
   f.write(msg)
   f.close()


def send_sms(msg, number='89202223344'):
   auth = HTTPBasicAuth('admin', 'adminpass')
   data = {
       'smscontent': msg,
       'telnum': number,
       'action': 'SMS',
       'line': '7',
       'smskey': '0000000e',
       'send': 'Send'
   }
   requests.post('http://192.168.1.1/default/en_US/sms_info.html', auth=auth, data=data)


def run(ph):
   c1, c2 = check1(ph), check2(ph)
   log1, log2, log3 = '/home/check_oper_id/sot_unlim.log', '/home/check_oper_id/mejgorod.log', '/home/check_oper_id/err.log',
   Currtime=datetime.datetime.now().strftime('%d %b %Y %H:%M:%S')

   if c1 != c2:
       msg = "Разный результат проверки. "+str(Currtime)+"  Номер: "+sys.argv[1]+"\n"
       send_sms(msg)
       write_log(log3, msg)
       return

   if c1 is None:
       msg = "Сайты недоступны. "+str(Currtime)+"  Номер: "+sys.argv[1]+"\n"
       send_sms(msg)
       write_log(log3, msg)
       return

   reg, op = c1

   if reg == 76 and int(op) in (1, 2, 99):
       print ('SET VARIABLE ch_mejgorod 0')
       print ('SET VARIABLE region_id %d' % reg)
       print ('SET VARIABLE operator_id %d' % op)
       strLog=str(Currtime)+" "+sys.argv[1]+" 0 "+str(c1)+"\n"
       write_log(log1, strLog)
       return

   print ('SET VARIABLE ch_mejgorod 1')
   print ('SET VARIABLE region_id %d' % reg)
   print ('SET VARIABLE operator_id %d' % op)
   strLog=str(Currtime)+" "+sys.argv[1]+" 1 "+str(c1)+"\n"
   write_log(log2, strLog)

run(sys.argv[1])

 

Диалплан:

exten => _89XXXXXXXXX,1,Set(ch_mejgorod=1)                                       ; inicializiruem ch_mejgorod=1
exten => _89XXXXXXXXX,n,AGI(/home/check_oper_id/check_oper_id.py,${EXTEN:1},)    ; peredaem ckriptu sot. nomer telefona
exten => _89XXXXXXXXX,n,NoOP(${ch_mejgorod})
exten => _89XXXXXXXXX,n,NoOP(${operator_id})
exten => _89XXXXXXXXX,n,NoOP(${region_id})
exten => _89XXXXXXXXX,n,GotoIf($["${ch_mejgorod}" = "1"]?mejgorod:)              ; esli mejgorod=1 to prigaem na mejgorod, ina4e idem vniz
exten => _89XXXXXXXXX,n,Goto(sotoper${operator_id})                              ; prigaem na metku sot. operatora (sotoper1, sotoper2,sotoper99)
exten => _89XXXXXXXXX,n(sotoper1),Set(TimeN=${STRFTIME(%b_%d_%H_%M)})            ; zvonok 4erez SIM-ki MTS
тут звоним через МТС
exten => _89XXXXXXXXX,n,Hangup()
exten => _89XXXXXXXXX,n(sotoper2),Set(TimeN=${STRFTIME(%b_%d_%H_%M)})            ; zvonok 4erez SIM-ki Megafon
тут звоним через Мегафон)
exten => _89XXXXXXXXX,n,Hangup()
exten => _89XXXXXXXXX,n(sotoper99),Set(TimeN=${STRFTIME(%b_%d_%H_%M)})             ; zvonok 4erez SIM-ki Beeline
тут звоним через Билайн
exten => _89XXXXXXXXX,n,Hangup()
exten => _89XXXXXXXXX,n(mejgorod),Playback(/usr/share/asterisk/sounds/mejgor)      ; proigrivaem 4to nomer platniy
тут звоним через междугороднего провайдера
exten => _89XXXXXXXXX,n,Hangup()

 

 

P/S/ Отдельное большущее спасибо разработчикам скрипта

Найденные ошибки и критика приветствуется.

Изменено пользователем goba

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вопрос в том, как быстро Теле2 и Мегафон забанят по IP, а потом и капчу введут ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

IvanShishkin

 

Уважаемый , как в воду глядели.

http://moscow.shop.megafon.ru/get_ajax_page.php?action=getMsisdnInfo&msisdn=79202224523

 

перестал работать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

NortH21 Да нет. Вчера в обед мне стали смс-ки кучей сыпаться , что разный результат проверки по сайтам.

 

Я проверил, сайт мегафона через tcping пинговался с потерями большими. Их досили походу, видать на дос они среагировали ну и попутно всю лишнюю нагрузку на сайт забанили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Смысл базы ЦНИИС в том виде, в котором она у них ведется, скоро пропадет, ибо опять Россия...

Каждые 2 часа формируется новый файл с новыми перенесенными номерами. И каждые 2 часа он аккумулируется к одному большому файлу. Беда в том, что в большом файле фиксируются и те номера, которые вернулись к родительскому оператору.

У меня сейчас в таблице диапазонов 4 с небольшим тысячи записей DEF-диапазонов (по сути, выписка россвязи). В файле ЦНИИС более 2 миллионов записей. Нафига, спрашивается, хранить там вернувшиеся домой номера???

Мне кажется это нужно для того, чтобы определить какому оператору в день "Х" приналдежал номер "У", абонента "Й". Для органов то есть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я согласен, что для истории нужно. Но в этом огромном файле нет информации о дате перехода. Для этого нужно искать в инкрементных файлах интересующий номер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

virus_net спасибо.

 

Кто использует rosreestr.subnets.ru подскажите, если номер менял оператора один раз, то добавляется поле 'moved2operator'.

А если номер менял оператора несколько раз, то будут поля 'moved3operator' 'moved42operator' и т.д. Или текущий, последний смененный оператор, всегда идет в поле 'moved2operator'?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

дык напишите virus_net - это их разработка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, приветствую!

 

Также нуждаюсь в базе. Но - в локальной реализации, ибо интернет очень дохлый и нестабильный.

Готов создать такую реализацию для Астериска (freepbx) и сделать свободной, общедоступной.

 

1) Попытки обновления базы раз в сутки, при неудаче - откладывается на 10 минут. Скачивание файла, хостинг готов предоставить

2) Локальное API для определения реального оператора и региона по номеру

3) Диаплан и AGI (внедряется в штатный FreePBX легко) для добавления префикса к номер (1*, 2*..) для дальнейшего выбора транка в Outbound Routes.

 

Все это я сделаю - нужен доступ к базе. Будем полезны друг другу?

 

скайп whoim2, почта whoim@mail.ru

 

У меня сейчас в таблице диапазонов 4 с небольшим тысячи записей DEF-диапазонов (по сути, выписка россвязи). В файле ЦНИИС более 2 миллионов записей. Нафига, спрашивается, хранить там вернувшиеся домой номера???

Скоро этот файл будет содержать всю выписку с тупым перечислением ВСЕХ DEF-номеров.

 

Спасибо, интересная инфа. Думаю, я смогу сделать обработку так, чтобы в субд (используемой api) оставлять только перенесенные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Также интересует база перенесённых номеров, непровайдеру реально получить доступ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас