Dr. Tariff: История о том, как создавалось приложение по оптимизации мобильных затрат

от автора

Сегодня я расскажу вам, как создавалось бесплатное приложение Доктор Тариф (Dr.Tariff). Это ассистент, который анализирует статистику разговоров пользователя и подбирает идеальный тарифный план. За одну неделю мы своими силами попали в ТОП-10 бесплатных приложений в рубрике «Финансы».

Идея

Все началось с того утра, когда я проснулся и, взглянув на отрицательный баланс на счету, понял, что за последнюю неделю потратил около 1000 рублей разговоры. «Как-то уж слишком лихо» — подумал я и решил, что пора перейти на новый тариф. До этого мне уже приходилось дважды подбирать тариф на сайтах операторов. Несмотря на математический склад ума, мне пришлось довольно долго просчитывать, на какой тариф перейти. В этот момент у меня появился вопрос — а почему нет приложения, которое могло бы сделать это за меня и к тому же вывести всю аналитику о разговорах в виде инфографики.

Попросил друга набросать первый дизайн интерфейса:

У меня уже дважды умирала Nokia N8, и я выбирал между iOS и Android. На одной стороне простота и утонченный дизайн, на другой — виджеты, больший набор функций и множество бесплатных приложений. Я предпочел Android и не ошибся. Это единственная мобильная операционная система, которая дает полный доступ к данным пользователя, а значит получится реализовать весь задуманный функционал.

Исследования

Много времени ушло на изучение того, как можно реализовать все мои задумки. К примеру, было 4 варианта определения региона пользователя. В первую очередь мы хотели считать эту информацию с SIM-карты, но в них зашит только оператор и страна (да и то не всегда). Второй был основан на данных GPS, но готовой карты разбиения РФ по регионам мы не нашли. Да и расположение в конкретный момент времени напрямую не связано с регионом SIM-карты, а, значит, и расценками на связь. Третий вариант — использовать идентификаторы сотовых GSM или Wi-Fi вышек. Оказалось, что полной базы не существует и они постоянно «мигрируют».

Оставался четвертый способ — определять регион по телефонному коду (первые N цифр после +79), который однозначно связан с регионом и оператором. Но для этого нужно было как-то изловчиться определять телефон абонента. Отдельной задачей стало найти все запросы и точные ответы мобильных операторов в различных регионах. И тут нас ждали новые сюрпризы: Мегафон, к примеру, разделен на 7 филиалов, каждый из которых имеет свою систему запросов/ответов. Благо хоть *100# работает по всей России. У МТС *100# вызывает на некоторых устройствах каскады входящих SMS с балансом, оказалось что #100# решает проблему.

Вскоре стало понятно, что нам необходимо научиться считывать всплывающие USSD-ответы операторов для работы с Билайном и Теле2. Быстрый обзор этой задачи показал, что API для этой функции нет. А на официальном форуме разработчиков этот вопрос остается открытым на протяжении 4 лет.

Мы уже решили урезать эту часть, но наш новый Android разработчик, Дмитрий, все-таки отыскал способ, как можно решить эту задачу (небезызвестный способ утянул отсюда; к сожалению, не сильно надежный, но за неимением лучшей альтернативы пришлось использовать его). Позже выяснилось, что конкурирующие приложения с виджетами баланса MobileFox и USSD checker используют тот же способ, только в нарушение рекомендаций Google они выставили максимально возможный приоритет 2147483647 (вместо рекомендуемой 1000). Из-за этого наше приложение с чтением USSD всегда пролетало мимо кассы.

С приоритетами вообще было забавно – эти же конкуренты ставили аналогичный приоритет и на получение SMS, и было бы все ничего, если бы при получении они вручную не добавляли их во входящие и не прерывали оповещение. В связи с этим части пользователей непрерывно падали SMS во входящие после каждого действия.

А зачастую был и цепной эффект: запрос на SMS отправлялся, SMS добавлялась во входящие минуя наше приложение, приложение обнаруживало новую входящую SMS и повторно отправляло запрос. Благо мы начали с тестирования на бета-версии приложения 🙂

Оптимизатор тарифов

То, чем мы действительно гордимся, – это оптимизатор тарифов. Задумка была в том, чтобы всего один клик отделял пользователя от наиболее выгодного для него тарифа. Но за этим кликом стоит большая кропотливая работа.

Для расчета стоимости исходящего звонка или SMS нужно знать, какой регион и оператор у собеседника. Если абонент находится в другом регионе, не в том, где он зарегистрирован, то за роуминг будет платить он, а для вас стоимость останется неизменной. Номера телефона достаточно для расчета стоимости звонка/SMS практически на всех тарифах. Исключение составляют тарифы, где отдельно указана цена для звонков абонентам, у которых определенный тарифный план.

Информация о стоимости звонков/SMS составляется вручную для каждого тарифа, исходя из описания с сайтов операторов, и сохраняется в текстовом файле. Далее она переводится в подходящий для расчетов вид.

Для сохранения анонимности номера звонков/SMS пересылаются в обрезанном виде. Для начала обрезалось 5 цифр и это в большинстве случаев работало. Более детальный анализ показал, что некоторые звонки так не определяются и информация об операторе или регионе содержится в последних цифрах, поэтому протокол был изменен, и сейчас обрезаются 3 последние цифры.

Однажды, анализируя логи, я заметил, что у одного клиента изменилась модель телефона на какую-то малоизвестную, причем производитель остался неизменным (Samsung). Идентификация абонента происходила по значению MD5-хеша от его IMEI (международный идентификатор мобильного оборудования), а так как он уникальный, то данные привязываются к строго одному устройству.

Так я думал… Но оказалось, что это не совсем так. Поддержание уникальности IMEI возлагается на плечи производителей, а на уровне государства контролируется только для сертифицированных устройств. В Европе или США за этим пристально следят. В России существует огромный рынок так называемых серых устройств, которые предназначены для другой страны и ввозятся нелегально. Причина этого явления проста: не нужно платить пошлину, в результате чего стоимость аппарата уменьшается на несколько тысяч.

Вследствие этого вполне возможно одновременное существование несколько устройств с одним IMEI. Коллизия была обнаружена, когда в базе было менее 1000 пользователей, поэтому проблема достаточно актуальна. Оба устройства (GT-I9003, SHV-E150S) произвел Samsung, но первая модель международная, а вторая предназначена для азиатского рынка. Похоже, что Samsung просто решил сэкономить выделенные номера и создает устройства с одинаковыми IMEI для различных стран.

Проблема была решена изменением идентификатора на значение MD5 от IMEI + модель аппарата. Будем надеяться, что производители не будут выпускать одну и ту же модель с одинаковыми IMEI.

Сервер написан на Python. Первое время работал под Windows 7 на домашнем компьютере. При написании многопроцессорного (вспомним GIL) сервера возникла проблема с передачей сокета в другой процесс из-за ограничений операционной системы. Сейчас сервер запущен на отдельном сервере под управлением Ubuntu. В качестве базы данных используется PostgreSQL.

Несколько интересных фактов:

  • расчет затрат по всем тарифам региона занимает от 0,5 до 1,5 секунды в зависимости от количества звонков/SMS;
  • самый длинный разговор длился 6,5 часов;
  • у одного абонента в телефоне хранилось более 8700 SMS.

Послесловие

Приятным дополнением в Dr. Tariff являются графики. Можно узнать с кем пользователь больше всего разговаривает, а с кем больше переписывается по SMS. Чаще звонит на МТС или Билайн. Помимо этого есть гибкие виджеты с текущим балансом и статистикой затрат. При каждом звонке Доктор Тариф сообщает об операторе и регионе. В настройках можно изменить местоположение окна, либо отключить эту функцию.

Сейчас активно собираем отзывы и уже работаем над редизайном приложения с учетом стандартов Android 4. По многочисленным заявкам пользователей iPhone планируется выпуск приложения для iOS (в случае успеха с Adnroid). Из-за закрытости операционной системы данные можно получить только из личного кабинета, что приведет к некоторым трудностям, но это актуально по причине отсутствия альтернатив.

ссылка на оригинал статьи http://habrahabr.ru/post/179177/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *