Как анализировать параметры мобильного USSD, переданные в виде http GET-запросов

Я пытаюсь создать веб-API, который будет обрабатывать данные, предоставленные сервером USSD от оператора мобильной сети (MNO). Ниже приведен фрагмент того, как этот вид взаимодействия работает с внешней системой, являющейся моим приложением.

Иллюстрация приложения USSD

Для каждого запроса я должен определить, на каком уровне находится пользователь, и ответить соответствующим меню. Оператор мобильной связи отправит мне что-то вроде http://my_app_url?*123*#. Поскольку между последним * и # ничего нет, я определяю, что это запрос корневого меню, и я могу ответить пользователю меню, например. 1. Зарегистрируйтесь, 2. Проверьте баланс, 3. Запросите PIN-код. Предполагая, что пользователь хочет проверить баланс, он выберет Меню 2 на своем мобильном телефоне, и оператор мобильной связи отправит мне http://my_app_url?*123*2#. Я отвечаю: 1. Введите номер счета, 2. Запросите обратный звонок. Пользователь решает ввести номер счета, и оператор мобильной связи отправит http://my_app_url?*123*2*1#, который сообщит мне, где находится пользователь.

Хотя все меню не длинное, его можно запутать, поскольку у меня может быть следующая комбинация. http://my_app_url?*123*1*2*3*1# или http://my_app_url?*123*1*1*3# или http://my_app_url?*123*2*1*3*1# и т.д.

Еще немного информации:

  1. Каждый запрос, отправляемый оператором мобильной связи, содержит номер мобильного телефона пользователя, идентификатор сеанса USSD, созданный оператором мобильной связи, который будет оставаться до завершения сеанса USSD, и параметры USSD, т. е. от первого * до # в приведенных выше примерах.

  2. Я сохранил меню для приложения USSD в базе данных (sql fiddle), поэтому в зависимости на уровне, на котором находится пользователь, я могу знать, какое меню ему обслуживать, например если его корневой запрос, я могу предоставить пользователю все меню, родительское_меню которых равно 1. Если это запрос проверки баланса, я отвечу всеми меню, родительское меню которых равно 2 и т. д. и т. д.

Мой текущий подход к определению того, какой запрос делает пользователь, состоит в том, чтобы написать несколько операторов if else, но посередине я теряю след и это усложняется. В глубине души я чувствую, что должен быть более элегантный способ анализировать запросы, отправленные пользователем, и определять, на каком уровне находится запрос, и знать, что их обслуживать. Можете ли вы предложить лучший подход? А еще лучше, есть ли у вас опыт создания такого типа приложений, и не могли бы вы поделиться своей логикой перемещения по меню?


person lukik    schedule 21.12.2014    source источник


Ответы (2)


У меня была аналогичная проблема несколько месяцев назад. Для меня я использовал регулярные выражения для обработки строки USSD, то есть *123*3*3#. Но вам все равно понадобятся операторы if else. В зависимости от вашей системы вам нужно будет разделить код на классы.

Пример способа обработки с использованием Regex:

ussd_string=123*2
if bool(re.match(r"^(\d+)[*]2",self.ussd_string)):
     #this will match 123*2 so process here
person Morfat Mosoti    schedule 03.04.2015

Вы можете создать дополнительные столбцы для таблицы пользователей ussd, чтобы отслеживать текущий уровень пользователя и использовать что-то вроде прогресса. Если вам это все еще нужно, я был бы рад сообщить вам больше.

person sam    schedule 07.03.2017