Поддержание жизни номера

tСуть статьи — написание скрипта который проверяет когда последний раз был совершён платный звонок из транка. И если это было больше 40 дней назад совершает платный вызов.

Для чего это надо? Я уже описывал создание транков на основе номеров мегафона с использованием услуги мультифон. Так вот, если не совершать какие-либо платные действия  номером в течении 60 дней оператор начинает списывать деньги со счёта, а в последствии блокирует номер. Что бы этого избежать мы будем совершать один платный звонок раз в 40 дней.

Сбор информации

Что нам для этого потребуется? Знание bash и запросов mysql. Естественно скрипт который я опубликую ниже будет работать с FreePBX и врядли заработает с чем-либо ещё.

Сперва нам нужно будет определить каким образом выловить исходящий звонок, заходим через ssh на mysql, команда выглядит как-то так:

логин пароль для доступа к mysql прописан в /etc/asterisk/cdr_mysql.conf, после того как мы зашли смотрим какие у нас есть базы.

получаем что то вроде такого

Нас интересует только база asteriskcdrdb, переходим в неё — use asteriskcdrdb; и смотрим какие таблицы внутри —  show tables;

Получаем две таблицы. Разобравшись немножко становится ясно что первая таблица cdr хранит только основную информацию о звонках. В то время как cel более подробную информацию по каждому звонку. Именно в cel указано с использованием какого транка прошёл звонок. Пробуем посмотреть в каком виде хранятся данные в обеих таблицах. Сначала cdr — SELECT * FROM  asteriskcdrdb.cdr limit 5;

Крайне сложно тут что-то понять. Но нас интересует соответствие полей в веб форме, соответствию полей в базе. Забегая вперёд скажу что сложно по cdr определить направление звонка, нас ведь только исходящие интересуют. Зато направление звонка сложно, но можно вычислить по таблице cel. По таблице cdr мы можем узнать был ли ответ в канале, и продолжительность звонка. Посмотреть что творится в таблице cel можно командой SELECT * FROM  asteriskcdrdb.cel limit 5;

Мне удалось выяснить некоторые моменты. Например при исходящем звонке в поле cnam обязательно присутствует CID, а в поле app — AppDial. Ну и при ответе, а нас только платные звонки интересуют, в поле event — answer. Так же в таблице cel за транк отвечает поле channame.

Таким образом мы можем по таблице cel сформировать звонки которые потом проверим на продолжительность по таблице cdr, связывают эти таблицы поле uniqueid в таблице cdr и поле linkedid в таблице cel.

таким образом нам нужно два запроса, первый по таблице cel второй по таблице cdr

этим запросом мы соберём все linkedid где встречается нужный нам транк, с полями как у исходящего звонка за последние 40 дней.

— этот запрос выбирает записи с нужным нам uniqueid и продолжительностью звонка больше 16. Я поставил значение 16. Потому что в среднем у меня астериск тратит 13 секунда на то что бы начать звонить. Не говоря уже про то что могут трубку не сразу взять итп, а в cdr записывается продолжительность не с момента соединения, а с момента отправки вызова. Предполагаю что идеальный случай вообще секунд 30 поставить, главное что бы тестовый звонок генерируемый скриптом занимал не меньше времени.

теперь нам надо написать bash скрипт, который если не находит нужные записи в mysql совершает звонок.

Скрипт

Для работы скрипта надо будет создать что-то в 5005. У меня там ivr с записью на 10 секунд. Напоминаю, что звонки менее 3х секунд не тарифицируются. Так же совершать звонок лучше на номер мегафон, тогда будет более низкая цена.

Пару нюансов:

  • во-первых: добавим цикл для перебора транков, у меня их несколько;
  • во-вторых: этот скрипт не может выловить в таблице mysql звонок который сгенерирован скриптом. Как следствие в callerID и запихнул уникальное значение.

Добавлю что номер 79282099831 у меня также завязан на астериск и на все звонки отвечает в канал, сам скрипт с помощью webmin я поставил в планировщик на ночь, когда работает голосовая почта, что бы мне сами звонки не мешали.