Урок 21 Web-запросы

Материал из Oktell
Версия от 13:09, 30 декабря 2014; Oktell Support (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Наверх К предыдущему уроку К следующему уроку

В этом уроке рассказывается про использование компонентов "Web-запрос" и "Парсер".


Урок21-006.png


Введение

Часто при обработке звонка возникает необходимость обращения к внешним сервисам с целью получения дополнительной информации по абоненту. Например, это может быть запросом в Российский план нумерации для того, чтобы узнать из какого региона звонит клиент. Или обращение в CRM-систему для получения имени ответственного менеджера. Описанные задачи решаются с помощью запросов к соответствующим web-системам. Подобным образом решается также интересная задача по распознаванию речи абонента в момент звонка и выполнение, так называемой, голосовой маршрутизации для составления заявок.

Web-запросы могут выполняться не только при звонке абонента. Это может быть каким-либо служебным действием, например один раз в час Oktell может выполнять запрос на получение курса доллара по отношению к рублю или в сервис прогноза погоды для получения информации о температуре на улице в ближайший час. С помощью web-сервисов можно также отправлять SMS-сообщения, запрашивать баланс счета и проводить другие операции.

Внешняя система, получив запрос, выполняет необходимые действия и возвращает обратно сообщение с результатом. Получив такой ответ от внешней системы, возникает потребность в его разборе. Синтаксический анализ полученных сообщений и выделение нужной информации называется парсингом. В Oktell для этого предназначен отдельный компонент "Парсер", который может анализировать XML или JSON структуры, а также использовать язык "Регулярных выражений".


Методика поиска внешнего сервиса

Шаг 1. Если вам нужно найти какой-либо сервис воспользуйтесь поисковой системой в интернете и поищите по ключевому слову "API". Например, "API курс доллара". Как правило, проверить сервис можно просто перейдя по ссылке в браузере.

Например, перейдя по ссылке http://www.cbr.ru/scripts/XML_daily.asp?date_req=02/03/2002&d=1 вы получите XML-структуру с курсами валют. Если нужная информация присутствует в списке - используйте данный сервис в сценариях Oktell


Шаг 2. Если API у сервиса не существует, но есть сайты, на которых вы получаете нужную информацию вы можете воспользоваться захватом пакетов в браузере и получать HTML-страницы. HTML-страницы можно будет автоматически анализировать и получать нужные данные.

  • Для захвата пакетов в браузере Google Chrome нажмите кнопку F12.
  • Перейдите на вкладку Network и выполните действия на сайте.
  • Среди всех запросов найдите нужный и просмотрите тело запроса. Таким образом вы узнаете запрос и необходимые параметры для получения вашей информации.


Урок21-008.png


В теле запроса (вкладка Headers) вы сможете найти URL запроса, все необходимые заголовки (content-type, дополнительные заголовки). Передаваемые параметры находятся в разделе Form Data. Ответное сообщение от сервера вы сможете посмотреть на вкладке Response.


Урок21-007.png


Использование Web-запросов в сценариях

Разберемся подробнее с работой web-запросов на примере.

Задача: При входящем звонке по номеру телефона определить из какого региона звонит абонент и маршрутизировать звонок в соответствии с полученной информацией.

Пользуясь вышепредложенными методами был определен сервис Россвязи http://www.rossvyaz.ru/activity/num_resurs/registerNum/. Для получения информации по телефону абонента требуется передать следующие параметры act=search&abcdef=495&number=2294989. После получения информации можно будет произвести анализ страницы и найти нужную информацию о регионе абонента.

Сценарий выглядит следующим образом:


Урок21-001.png


Разберем компоненты сценария поподробнее.

  • Компонент "CallerID" . Определяет телефонный номер абонента и записывает его в переменную num. В компоненте переменной "num(строковая)" присваивается значение функции "Номер абонента (CallerId)".
  • Компонент "Запрос в Россвязь". Отправляет Web-запрос в сервис Россвязи для определения региона по номеру абонента.
  • В поле "Подключение" введите адрес сервиса, при необходимости укажите прокси-сервер и базовую авторизацию.


Урок21-002.png


  • В поле "Тип контента" вводится заголовок contenttype, которая подставляется в запрос. По умолчанию, используется application/x-www-form-urlencoded.
  • В поле "Метод" вы можете выбрать HTTP-метод передачи запроса.

Запрос GET передает данные серверу, используя URL. Все необходимые параметры перечисляются непосредственно в строке подключения через знак вопроса "?". Для разделения параметров используется символ "&". Длина URL ограничена 1024 символами, это и будет верхним ограничением для данных, которые можно отослать с помощью GET.

ВНИМАНИЕ: Строка Подключения (URL) в компоненте всегда отправляется в формате UTF-8.

Пример GET-запроса (передача параметров param1 и param2, имеющих значения value1 и value2 соответственно):

http://www.oktell.ru?param1=value1&param2=value2

Запрос POST передает данные серверу, используя тело HTTP запроса. POST может отправлять гораздо большие объемы данных. Лимит устанавливается веб-сервером и обычно равен около 2MB. Все необходимые параметры перечисляются в поле "Запрос", для разделения параметров используются используется символ "&".

ВНИМАНИЕ: Если указать в поле "Тип запроса" - XML, то возможна передача XML-структуры. Передача XML недоступна для метода GET.

В отличии, от метода GET, POST может отправлять данные не только в кодировке UTF-8. В поле "Кодировка запроса" вы можете выбрать Windows-1251, Unicode и другие форматы.

Несмотря на то, что передача данных методом GET проходит быстрее, передача данных методом POST более безопасна, так как секретные данные (например пароль) не отображаются напрямую для пользователя (в отличии от URL, который виден почти всегда).

Для большей наглядности, на следующем рисунке показан пример настройки компонента для отправки запроса с помощью методов GET и POST. В примере, на сервер http://www.oktell.ru отправляются два параметра param1 и param2 со значениями value1 и value2 соответственно:

Урок21-003.png

Методы PUT, HEAD, DELETE применяются редко и в данном уроке не рассматриваются.

  • В поле "Дополнительные заголовки" вы всегда можете добавить один или несколько заголовков запроса. Для разделения заголовков используйте перенос строки, например,
HeaderName1: Value1
HeaderName2: Value2

Аналогично заполняется поле "Дополнительные cookie".

  • Настройка "Режим работы" позволяет установить один из четырех вариантов: Ожидание результата, Асинхронный запуск, Обрыв по таймауту или Выход по таймауту.

Для задачи определения региона по номеру абонента используется режим "Ожидание результата", так как сценарий не должен переходить к следующим компонентам без определения региона. Однако может случиться ситуация, когда сервер Россвязи будет перегружен. В таком случае, запросы могут обрабатываться длительное время (например, 10-20 секунд), что скажется отрицательно на качестве обслуживания. Решением проблемы будет установить режим "Выход по таймауту" с переключением на менеджеров по остальным регионам.

  • Получив ответ от внешней системы, можно указать переменную, в которую он будет сохранен. Переменная указывается в поле "Ответ в переменную". Также вы можете указать кодировку, в которой ожидаете получить сообщение. По умолчанию, кодировка выбирается автоматически (опция "Авто (метаданные, заголовок)").
  • Также вы можете указать переменную для хранения кода ошибки в поле "Код ошибки в переменную". Переменную можно проанализировать в случае, если сценарий перешел по ветке "Переход, неудача".


В сценарии компонент "Запрос в Россвязь" имеет следуюшие настройки:

  • Подключение: http://www.rossvyaz.ru/activity/num_resurs/registerNum/
  • Тип контента: application/x-www-form-urlencoded
  • Метод: POST
  • Тип запроса: Аргумент
  • Запрос: выражение, в которое подставляется код города и семизначный номер телефона абонента. Данные получаются с помощью операции substr (получение части строки), применяемой над переменной num (номером телефона абонента).
'act=search&abcdef='+substr([num],1,3)+'&number='+substr([num],4,7) 

В результате запроса:

  • в параметр act подставляется значение search
  • в параметр abcdef подставляется код города (3 символа, начиная с первого)
  • в параметр number подставляется семизначный номер телефона (7 символов, начиная с четвертого)
  • Кодировка запроса: UTF-8
  • Режим работы: Ожидание результата
  • Тип ответа: Текст
  • Ответ в переменную: переменная "ответ" (строковая)


Урок21-004.png


  • Компонент "Парсер региона". Выделяет регион абонента из полученного сообщения. Если поставить уведомление после компонента "Запрос в Россвязь" и вывести на экран переменную "ответ", то вы увидите, что в ней содержится целая HTML-страница. Цель компонента - найти в тексте сообщения нужные данные (выделено красным на рисунке)


Урок21-005.png


  • В поле "Документ" необходимо определить структуру, которая подлежит разбору. В примере данного урока, это переменная "ответ".
  • В поле "Алгоритм" необходимо выбрать метод анализа документа. Oktell позволяет разбирать XML (опция "Язык OQuery для HTML") или JSON-структуры (опция "Парсер JSON"), а также использовать алгоритм регулярных выражений (опция "Регулярные выражения").

Так как в переменной ответ храниться HTML-страница, будет использоваться метод "Язык OQuery для HTML"

  • "Поисковый запрос" - tr[class=clmn1]>td:eq(5)

В запросе определяются все теги tr с атрибутом class равным clmn1 (tr[class=clmn1]). Далее у этих тегов ищется пятый тег td (>td:eq(5)).

ВНИМАНИЕ: Прочитать подробнее о синтаксисе OQuery вы можете в статье Компонент Парсер или в технической документации Общие компоненты сценариев. Парсер

  • В поле Функция вы можете указать возвращаемое значение. В примере, указана опция "Содержимое". Если парсер находит несколько тегов, то в компоненте можно указать номер элемента, который вы будете использовать. В примере номер элемента не указан, а значит будет браться нулевой тег (нумерация начинается с нуля).
  • В поле "Результат в переменную" указывается переменная сценария, в которую будет сохранено найденное значение. В примере, переменная "ответ".


  • Компонент "Ошибка". Выводит на экран администратору системы сообщение о том, что произошла ошибка в парсере или web-запросе.


  • Компонент "Ответ". Отладочное уведомление, выводит на экран найденное значение (переменную "ответ") с помощью компонента Парсер.


Урок21-009.png


  • Компонент "Москва и Московская область?". Маршрутизирует звонок в зависимости от полученного значения региона в переменной "ответ". В данном компоненте сравнения определяется - есть ли слово "Москва" в полученном регионе.
  • Аргумент 1: выражение indexof([ответ],'Москва')
  • Аргумент 2: строка "-1"
  • Тип сравнения: "!="

Выражение indexof ищет подстроку "Москва" в переменной "ответ" и возвращает номер позиции. Если строка не найдена, то функция вернет значение "-1".

ВНИМАНИЕ: Напоминаем, что ознакомиться с полным списком выражений можно в технической документации Выражения


  • Компонент "По Москве". В случае, если абонент из Московской области происходит переключение на соответствующую ответственную группу менеджеров.


  • Компонент "Татарстан?". Аналогично предыдущему компоненту сравнения, ищет подстроку "Татарстан" в переменной "ответ".
  • Аргумент 1: выражение indexof([ответ],'Татарстан')
  • Аргумент 2: строка "-1"
  • Тип сравнения: "!="


Урок21-010.png


  • Компонент "По Татарстану". Переключает абонента на ответственную группу менеджеров по Татарстану.


  • Компонент "По остальным регионам". Маршрутизирует абонента на операторов по остальным регионам.

ВНИМАНИЕ: В данном уроке не рассматривается обработка неудачного соединения. Читателю предлагается самостоятельно доработать сценарий.


Скачать сценарий: Урок21.oscr

Поздравляем! Вы научились обращаться к внешним сервисам с помощью компонентов сценария. Можете переходить к следующему уроку.

Техническая документация: Общие компоненты сценариев и Компоненты сценариев IVR


Вопросы и задания

  • Каким методом GET или POST стоит отправлять Web-запросы? От чего это может зависеть?
  • Прочитайте статью Компонент Парсер. Ознакомьтесь с возможностями компонента.
  • Реализуйте IVR сценарий при звонке на который будет проговариваться курс доллара по отношению к рублю на текущий момент.
  • Реализуйте IVR сценарий, который будет проговаривать погоду в вашем городе на текущий момент. Воспользуйтесь следующими сервисами:


Наверх К предыдущему уроку К следующему уроку