HTTP-интерфейс сервера

У сервера Октелл есть встроенный веб-сервер. Через него внешняя система обращается к платформе по обычному HTTP: запускает служебные сценарии, узнаёт состояние пользователей и очередей, управляет звонками, скачивает записи разговоров и загружает файлы.

Что делает встроенный веб-сервер

ЗадачаАвторизация
Обрабатывает запросы Web-APIБазовая, под учётной записью пользователя с привилегией исполнения методов Web-API
Выдаёт страницы из папки WWWНе требуется
Обслуживает подключения WebSocket — веб-клиент, решения на Oktell.js, интеграционный протоколПроисходит в рамках интеграционного протокола, под учётной записью одного из пользователей

Служба слушает порты 80 и 4055 — их можно изменить в настройках веб-сервера — и делает это на всех сетевых интерфейсах. Запросы принимаются методами GET и POST; в обоих случаях параметры можно перечислять в URL.

Заведите отдельного пользователя для API Начиная с версии Октелл 2.9 базовая авторизация обязательна. На все запросы, которые её требуют, но не прошли, веб-сервер отвечает 403 Forbidden.

Логином и паролем служат данные любого пользователя с ролевой привилегией исполнения web-api-запросов. Для сервисного доступа создайте отдельную учётную запись: так права легко ограничить, а обращения — отличить от действий живых сотрудников.
http://login:password@192.168.0.1:4055/wp_setuserstate?user=admin&userstateid=5

Запуск служебных сценариев

Основной способ научить платформу чему угодно: сценарий делает работу, HTTP-запрос его вызывает. Код запуска для этого способа — 27.

execsvcscript

ПараметрОписание
nameНазвание служебного сценария; он должен существовать и лежать на сервере в каталоге общих сценариев.
startparam1 … startparam5Стартовые параметры, доступные в сценарии соответствующими функциями.
async0 — синхронно, с ожиданием завершения и возвратом значения; 1 — асинхронно.
timeoutТолько для синхронного режима: предельное время ожидания в секундах. По его истечении ожидание обрывается и ответ возвращается без результата работы сценария.

В синхронном режиме ответом становится значение, присвоенное служебной переменной «Возвращаемое значение 1». Метод оборачивает его в XML.

execsvcscriptplain

То же самое и с теми же параметрами, но ответ сценария размещается в теле HTTP-ответа без искажений — без XML-обёртки. Это делает метод пригодным для отдачи чего угодно: строки, JSON, готовой HTML-страницы.

Служебная переменнаяНазначение
Возвращаемое значение 1Тело ответа.
Возвращаемое значение 2HTTP-ответ; по умолчанию 200. Значение file вернёт ссылку на файл для скачивания.
Возвращаемое значение 3Дополнительные HTTP-заголовки.

Как отдать результат сценария без авторизации

Приём через папку WWW Файлы из папки WWW отдаются без авторизации. Рядом с файлом можно положить одноимённый файл с расширением .execsvcscriptplain — и тогда по тому же адресу вернётся не содержимое файла, а результат работы служебного сценария.

Порядок такой:

  1. Положите в папку WWW рабочего каталога сервера файл test.html с любым содержимым.
  2. Откройте http://server:port/test.html — без пароля должно вернуться содержимое файла.
  3. Рядом создайте файл test.html.execsvcscriptplain, а в его теле разместите строку JSON:
{
  "scriptname": "myscript",
  "timeout": 10,
  "parameter1": "ЧЕРЕЗ WWW"
}
  1. Создайте служебный сценарий myscript, выводящий какое-нибудь уведомление, чтобы было видно, что он запустился.
  2. Выполните тот же запрос — уведомление должно появиться.

Все параметры GET-запроса — или POST с Content-type: application/x-www-form-urlencoded — разбираются и передаются на старт сценария так же, как при вызове execsvcscriptplain: значения параметров, режим исполнения, таймаут ожидания. В служебную переменную выходного значения можно положить любое содержимое, включая HTML-страницу, — оно вернётся в теле ответа без изменений.

Служебные данные запроса внутри сценария

В качестве значения любого из пяти стартовых параметров можно принудительно назначить специальное значение — тогда в сценарий попадут данные самого HTTP-запроса.

ЗначениеЧто передаётся
%parameters%Строка параметров GET в неразобранном виде
%content%Контент запроса
%headers%Все заголовки HTTP-запроса — фактически полный текст запроса без контента
%page%Адрес запрошенной страницы
%requestline%Полный текст строки-запроса
Назначенные значения перекрывают переданные Оригинальные значения, пришедшие в GET-запросе, будут частично или полностью затёрты. В примере ниже параметры 1 и 3 заданы жёстко, а 2, 4 и 5 придут из запроса, если в нём указаны.
{
  "scriptname": "myscript",
  "timeout": 10,
  "parameter1": "Константа",
  "parameter3": "%page%"
}

Плагины

execpluginmethod исполняет метод в серверном плагине, передавая параметры и возвращая результат с выходными значениями.

ПараметрОписание
idmoduleИдентификатор серверного плагина.
idformИдентификатор исполняемого метода — формы.
inputparamsНабор входных значений строкой JSON.
inputparamsb64То же, закодированное в base64.

Ответом возвращается строка с содержимым JSON.

Состояние системы

МетодЧто возвращает
tst_getuserstateXML-структуру с текущим состоянием указанного пользователя.
tst_getintnumberreadyusersДля внутреннего стандартного номера — количество свободных и занятых пользователей и список свободных в виде прямых внутренних номеров, по которым их можно вызвать. Параметр number.
gettotalqueueinfoИнформацию обо всех очередях на текущий момент: внутренние номера и список абонентов у каждого. В представлении JSON.
getversionВерсию сервера: версию программы и базы данных, сборку, дату, сборку и дату аппаратного модуля.

Лицензия

МетодЧто возвращает
getlicensefulltextПолный текст информации о лицензии на установленном на сервере языке — тот же, что в разделе «Администрирование. Общие настройки. Информация о лицензии».
getlicensefullxmlXML-структуру лицензионного сертификата.
getlicenseinfoЗначение одного параметра сертификата; параметр detail. См. таблицу ниже.
Значение detailЧто вернётся
regserial7-значный номер регистрации
confirmdateДата следующего подтверждения сертификата, формат dd.MM.yyyy
updatelimitdateКонечная дата поддерживаемых версий по лицензии на обновления, формат dd.MM.yyyy

Файлы

Скачивание

МетодЧто отдаёт
download/rec/…, download/fax/…, download/vm/…Записи разговоров, полученные факсы, файлы голосовой почты. Правильную ссылку выдаёт WebSocket-подключение.
download/byscriptПроизвольный файл, путь к которому определяет запускаемый этим же запросом служебный сценарий. Используются все параметры execsvcscript.
download/filesПроизвольный файл по прямой ссылке в параметре path. Путь может быть абсолютным либо относительным — от рабочего каталога службы или от хранилища файлов.
getsharedfileФайл из открытой папки локального хранилища \LocalStorage\Shared — без авторизации. Параметр path. При любой неточности возвращает 404 Not Found.
downloadrecordbylinkЗапись разговора по коду, упакованному и переданному через WebSocket-подключение. Параметр recordlink.
getavatarИзображение пользователя. Параметры path либо userid. Авторизация не нужна.

Общий параметр attachment: 1 — скачивание вложением, 0 — как медиа, по расширению файла. По умолчанию 1.

Зона произвольного скачивания ограничена По умолчанию, согласно ключу AllowDownloadFilesDirectlyOnlyFromTemp в конфигурационном файле, метод download/files может отдавать файлы только из временной папки и папки хранилища. Это ограничение стоит менять осознанно: оно защищает файловую систему сервера от чтения снаружи.
Аватары хранятся в трёх размерах 352×288 — максимальные размеры с учётом пропорций, а также 32×32 и 96×96. Ссылки на скачивание выдаются через WebSocket-подключение, но могут быть сгенерированы и автоматически.

Загрузка

upload принимает файлы методом POST. Веб-сервер понимает multipart/form-data и application/octet-stream; в запросе должны присутствовать поля Content-Transfer-Encoding и Content-Disposition. Одним запросом через MIME можно передать несколько файлов. Чтобы имена не оказались случайными, исходные имена указываются параметром суб-заголовка Content-Disposition.

По умолчанию файлы размещаются во временном каталоге \OktellWorkDirectory\Temp\UploadData.

storagemodeКуда попадёт файл
temp (по умолчанию)Временная папка. Гарантированно очищается при перезапуске службы. Файлы доступны снаружи без авторизации по прямой ссылке через getsharedfile.
storageФайловое хранилище; доступно снаружи только после авторизации, по временному паролю либо если авторизация веб-сервера не используется.
storagesharedОткрытая часть хранилища; доступна без авторизации любому, кто знает прямую ссылку, через getsharedfile.
scriptФайл кладётся во временную папку, затем запускается указанный служебный сценарий; пятым параметром ему передаётся XML с полными путями сохранённых файлов. Предполагается, что сценарий сам перенесёт их из временной папки. Ответ — как у execsvcscript.
scriptplainТо же, но ответ — как у execsvcscriptplain.
ПараметрОписание
pathmodeabsolute или relative — какой путь возвращать в ответе или передавать в сценарий. По умолчанию относительный.
subfolderПодкаталог внутри выбранного хранилища.
Решите заранее, что будет с файлами Режимы различаются не удобством, а доступностью и сроком жизни: temp очищается при перезапуске службы и открыт без авторизации, storageshared открыт всякому, кто знает ссылку. Прежде чем выбирать режим, ответьте, кем и при каких условиях файлы будут скачиваться и надолго ли они нужны. Смотрите также ключ AllowDownloadFilesDirectlyOnlyFromTemp и параметр «Путь к хранилищу файлов» в общих настройках.

Ответом возвращается XML с описанием всех сохранённых файлов и путей к ним; для неудачно сохранённых атрибут saved равен нулю.

Управление звонками

Как указывается, от чьего имени выполнять команду Команды с префиксом wp_ исполняются от имени линии (line), пользователя (user) или рабочего места (wp). Достаточно одного из этих параметров. Значением может быть GUID, название, имя пользователя, логин, номер линии — по нему однозначно определяется внутренняя линия.
МетодЧто делает
wp_autocallstartЗапускает автодозвон или разовый звонок. Обязательный параметр number. См. таблицу ниже.
wp_switchcallFlash-переключение текущего звонка на указанный номер; если линия неактивна — запускает автодозвон. Параметры те же.
wp_autocallstopОстанавливает активную сессию автодозвона.
wp_flashГенерирует flash от имени линии.
wp_answercallОтвечает на входящий вызов.
wp_declinecallОтклоняет входящий вызов.
wp_abortcallКладёт трубку, завершая звонок.
wp_getchaincontentТекущий контент цепочки, в которой участвует линия; структура JSON.
wp_getabonentinfoИнформация о противоположном абоненте в коммутации; структура JSON.
wp_setuserstateМеняет состояние пользователя и переводит его между режимами. См. ниже.

Параметры дозвона

ПараметрЗначения
directionpbx — звонок внутрь, city — наружу. По умолчанию автоопределение: номер найден среди внутренних — звонок внутрь, иначе наружу.
sequencedirect (по умолчанию) — сначала вызывается абонент, после ответа производится обратный вызов линии. back — сначала вызывается сама линия, затем от её имени указанный номер.

Режимы flash

modeЧто происходит, если на удержании уже есть абонент
abortОтбой текущему, возврат к тому, кто на удержании.
switchВозврат к тому, кто на удержании; текущий уходит на удержание.
nextОтбой текущему и сразу переход к набору номера, без возврата к удерживаемому.

Смена состояния пользователя

ПараметрОписание
userstateid1 свободен, 2 перерыв, 3 нет на месте, 5 занят в разговоре или в обработчике задачи.
onredirect0 или 1 — режим переадресации. Доступен только при выключенном режиме call-центра.
oncallcenter0 или 1 — режим call-центра. Дополнительно меняет состояние, если текущее противоречит выбранному режиму: выводит из перерыва при выходе, из переадресации при входе.
onccmanual0 или 1 — ручной режим в call-центре. Меняется только когда пользователь находится в call-центре.
onlunch0 или 1 — режим перерыва. Доступен только при включённом режиме call-центра. При активном режиме пользователь переводится в перерыв вместо готовности всякий раз, как освобождается.
lunchreasonidЧисловой код регламентной причины перерыва; коды определены в общих настройках.
lunchreasonmsgОписание индивидуальной причины перерыва.
Не все переходы между состояниями возможны Нельзя сделать пользователя свободным, пока он занят разговором; нельзя ввести в перерыв того, кто не в режиме call-центра. Служебные состояния — отключён, без телефона, зарезервирован — через этот метод не назначаются вовсе.

Метод возвращает 200 OK без дополнительных параметров в любом случае, если пользователь определён. То есть успешный ответ здесь не означает, что состояние действительно изменилось: проверяйте результат отдельным запросом.
Причина перерыва: код или текст, но не оба Для регламентированных причин, заведённых в базе, указывается только код lunchreasonid. Для индивидуальных — только текст lunchreasonmsg.