Работа c API

На данной станице будет показано как начать работу с API на примере задачи:

  1. создания SIP учеток для телефонов;
  2. создания комнаты конфренции;
  3. вызова телефонов и присоединения его к конференции.

Термины и определения

  • api_url - базовый URI используемый для выполнения запросов к виртуальной АТС. Далее в примерах используется значение https://api.rcsnet.ru/v2;
  • account_id - идентификатор виртуальной АТС, используется для указания набора сервисов предоставляемых тому или другому клиенту;
  • api_key - токен используемый для генерации сессионного пароля. Значение api_key необходимо получить у вашего менеджера;
  • auth_token - сессионный ключ, используется для аутентификации при выполнении операций с виртуальной АТС;

Генерация сессионного пароля

Перед началом каких-либо операций с виртуальной АТС требуется сгенерировать сессионый пароль auth_token. Пароль гененирируется запросом следующего вида

curl -X PUT {api_uri}/api_auth \
     -H 'Content-Type: application/json' \
     -d '{ "data" : { "api_key" : "{api_key}" }}'

Например:

curl -X PUT https://api.rcsnet.ru/v2/api_auth \
     -H 'Content-Type: application/json' \
     -d '{ "data" : { "api_key" : "my_complex_api_key_goes_here" }}'

В результате будет получен JSON ответ следующего вида:

{
   "page_size":1,
   "data":{
      "account_id":"abcdef1234567890abcdef1234567890",
      "reseller_id":"abcdef1234567890abcdef1234567890",
      "is_reseller":false,
      "account_name":"My Account Name",
      "language":"ru-RU"
   },
   "revision":"automatic",
   "request_id":"5a5e8c680f64ddbf8c56e8727660320b",
   "status":"success",
   "auth_token":"xxxxxxxxxxxxxxxxxxxxxxxxx"
}

В полученном ответе нас интересует значения account_id и auth_token, которые необходимо будет использовать в дальнейших запросах.

Отображение списка SIP устройств

Для отображения списка SIP устройств необходимо выполнить запрос вида:

curl -X GET {api_uri}/accounts/{account_id}/devices \
     -H 'X-Auth-Token: {auth_token}' \
     -H 'Accept: application/json'

Например:

curl -X GET https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/devices \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx' \
     -H 'Accept: application/json'

В результате будет получен ответ следующего вида

{
   "page_size":2,
   "data":[
      {
         "id":"14b32dddd09b255c5777555f5583217c",
         "name":"1001",
         "mac_address":"",
         "enabled":true,
         "device_type":"sip_device"
      },
      {
         "id":"0854505837c4bfd5dcf54b044a538535",
         "name":"1002",
         "mac_address":"",
         "enabled":true,
         "device_type":"sip_device"
      }
   ],
   "revision":"590923c4063889b493e58d16aaba776f",
   "request_id":"ccc28351d7f7ac08dff3ea2f9325bbdf",
   "status":"success",
   "auth_token":"c032acdb99279024f1834b1e91f408cf"
}

В ответе нас интересует объект ‘data’. Данный объект содержит краткое описание параметров SIP телефонов. Обратите внимание на параметр ‘id’ телефона, он будет использоваться для иницирования вызова на телефон.

Создание объекта конференции

В данном примере будет показано как создать конференцию. Следует отметить что после создания конференции ее еще нельзя вызвать с телефона. Требуется создать объект ‘callflow’ с описанием схемы обработки звонка в котором можно просто вызвать объект конференции или сперва проиграть какое-то объявление и потому вызвать объект конференции. Итак для создания конференции необходимо выполнить запрос вида:

curl -X PUT {api_uri}/accounts/{account_id}/conferences \
     -H 'Content-Type: application/json' \
     -H 'X-Auth-Token: {auth_token}' \
     -d '{"data":{"name":"{conference_name}"}}'

Например:

curl -X PUT https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/conferences \
     -H 'Content-Type: application/json' \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx' \
     -d '{"data":{"name":"my_first_conference","member":{"join_muted":false}}}'

В результате будет получен ответ следующего вида

{
   "data":{
      "name":"my_first_conference",
      "conference_numbers":[],
      "member":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "moderator":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "play_name":false,
      "id":"836d23419b739dee2503d89c8bf26b3a"
   },
   "revision":"1-e7a3f391f0367c417611157837134d4e",
   "request_id":"6c43a5bd757aea7369cb0bb0b3737d33",
   "status":"success",
   "auth_token":"02d6916158bf3a94d95c669d581cf7e0"
}

В ответе нас интересует объект ‘data’. Данный объект содержит краткое описание параметров созданной конференции. Обратите внимание на параметр ‘id’ конференции, он будет использоваться при создании ‘callflow’- схемы обработки вызова.

Вывод списка конференций

Для вывода перечня соданных конференций необходимо выполнить запрос вида:

curl -X GET {api_uri}/accounts/{account_id}/conferences \
     -H 'X-Auth-Token: {auth_token}'

Например:

curl -X GET https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/conferences \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx'

В результате будет получен ответ следующего вида

{
   "page_size":2,
   "data":[
      {
         "id":"d2bc7ac32168ac4d054dd68ae67c3a01",
         "name":"my_first_conference",
         "member":{
            "join_muted":false,
            "join_deaf":false,
            "numbers":[],
            "pins":[]
         },
         "moderator":{
            "join_deaf":false,
            "join_muted":false,
            "numbers":[],
            "pins":[]
         },
         "is_locked":false,
         "duration":0,
         "moderators":0,
         "members":0
      },
      {
         "id":"836d23419b739dee2503d89c8bf26b3a",
         "name":"my_second_conference",
         "member":{
            "join_deaf":false,
            "join_muted":false,
            "numbers":[],
            "pins":[]
         },
         "moderator":{
            "join_deaf":false,
            "join_muted":false,
            "numbers":[],
            "pins":[]
         },
         "is_locked":false,
         "duration":0,
         "moderators":0,
         "members":0
      }
   ],
   "revision":"eaf416ff10e53f1841abb109dca4c998",
   "request_id":"0d63e455642feb8d18e49ddf11335a77",
   "status":"success",
   "auth_token":"02d6916158bf3a94d95c669d581cf7e0"
}

Вывод конфигурации конференции

Для вывода полной информации о конфигурации конференций необходимо выполнить запрос вида:

curl -X GET {api_uri}/accounts/{account_id}/conferences/{conference_id} \
     -H 'X-Auth-Token: {auth_token}'

Например:

curl -X GET https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/conferences/d2bc7ac32168ac4d054dd68ae67c3a01 \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx'

В результате будет получен ответ следующего вида

{
   "data":{
      "member":{
         "join_muted":false,
         "join_deaf":false,
         "numbers":[],
         "pins":[]
      },
      "name":"my_first_conference",
      "conference_numbers":[],
      "moderator":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "play_name":false,
      "id":"d2bc7ac32168ac4d054dd68ae67c3a01",
      "_read_only":{
         "members":0,
         "moderators":0,
         "duration":0,
         "is_locked":false,
         "participants":[]
      }
   },
   "revision":"1-ed3b508ec557c82dd3374a0ad1e5bddb",
   "request_id":"fb1b13e42bda123a4cb3a08043f74113",
   "status":"success",
   "auth_token":"02d6916158bf3a94d95c669d581cf7e0"
}

Удаление объекта конференции

Для удаление конференции необходимо выполнить запрос вида:

curl -X DELETE {api_uri}/accounts/{account_id}/conferences/{conference_id} \
     -H 'X-Auth-Token: {auth_token}'

Например:

curl -X DELETE https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/conferences/d2bc7ac32168ac4d054dd68ae67c3a01 \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx'

В результате будет получен ответ следующего вида

{
   "data":{
      "member":{
         "join_muted":false,
         "join_deaf":false,
         "numbers":[],
         "pins":[]
      },
      "name":"my_first_conference",
      "conference_numbers":[],
      "moderator":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "play_name":false,
      "id":"d2bc7ac32168ac4d054dd68ae67c3a01",
      "_read_only":{
         "members":0,
         "moderators":0,
         "duration":0,
         "is_locked":false,
         "participants":[]
      }
   },
   "revision":"1-ed3b508ec557c82dd3374a0ad1e5bddb",
   "request_id":"fb1b13e42bda123a4cb3a08043f74113",
   "status":"success",
   "auth_token":"02d6916158bf3a94d95c669d581cf7e0"
}

Обновление конфигурации конференции

Для изменения конфигурации конференции необходимо выполнить запрос вида:

curl -X POST {api_uri}/accounts/{account_id}/conferences/{conference_id} \
     -H 'X-Auth-Token: {auth_token}' \
     -H 'Content-Type: application/json' \
     -d @- << EOF
  {
     "data":{
        "member":{
           "join_deaf":false,
           "join_muted":false,
           "numbers":[]
        },
        "name":"aabbccda",
        "moderator":{
           "join_deaf":false,
           "join_muted":false,
           "numbers":[],
           "pins":[]
        },
        "play_name":false,
        "id":"836d23419b739dee2503d89c8bf26b3a",
        "ui_metadata":{
           "ui":"kazoo-ui"
        }
     },
     "verb":"POST"
  }
  EOF

Например:

curl -X POST https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/conferences/d2bc7ac32168ac4d054dd68ae67c3a01 \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d @- << EOF
  {
     "data":{
        "member":{
           "join_deaf":false,
           "join_muted":false,
           "numbers":[]
        },
        "name":"aabbccda",
        "moderator":{
           "join_deaf":false,
           "join_muted":false,
           "numbers":[],
           "pins":[]
        },
        "play_name":false,
        "id":"836d23419b739dee2503d89c8bf26b3a",
        "ui_metadata":{
           "ui":"kazoo-ui"
        }
     },
     "verb":"POST"
  }
  EOF

В результате будет получен ответ следующего вида

{
   "data":{
      "member":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "name":"aabbccda",
      "moderator":{
         "join_deaf":false,
         "join_muted":false,
         "numbers":[],
         "pins":[]
      },
      "play_name":false,
      "id":"836d23419b739dee2503d89c8bf26b3a",
      "ui_metadata":{
         "ui":"kazoo-ui"
      },
      "conference_numbers":[]
   },
   "revision":"6-f79cb73aced09282f4e6a04a858f72e3",
   "request_id":"818a18db7eed440a3e4545509cfeafc6",
   "status":"success",
   "auth_token":"f6330215c035d35c2a44b4dce849a47e"
}

Схема документа конференции

Перечень возможных полей json документа описания кофигурации показан ниже

{
    "$schema": "http://json-schema.org/draft-03/schema#",
    "_id": "conferences",
    "description": "Schema for conferences",
    "properties": {
        "conference_numbers": {
            "default": [],
            "description": "Defines conference numbers that can be used by members or moderators",
            "items": {
                "regex": "^\\d+$",
                "required": false,
                "type": "string"
            },
            "required": false,
            "type": "array",
            "uniqueItems": true
        },
        "focus": {
            "description": "This is a read-only property indicating the media server hosting the conference",
            "required": false,
            "type": "string"
        },
        "member": {
            "default": {},
            "description": "Defines the discovery (call in) properties for a member",
            "properties": {
                "join_deaf": {
                    "default": false,
                    "description": "Determines if a member will join deaf",
                    "required": false,
                    "type": "boolean"
                },
                "join_muted": {
                    "default": true,
                    "description": "Determines if a member will join muted",
                    "required": false,
                    "type": "boolean"
                },
                "numbers": {
                    "default": [],
                    "description": "Defines the conference (call in) number(s) for members",
                    "items": {
                        "regex": "^\\d+$",
                        "required": false,
                        "type": "string"
                    },
                    "minItems": 0,
                    "required": false,
                    "type": "array",
                    "uniqueItems": true
                },
                "pins": {
                    "default": [],
                    "description": "Defines the pin number(s) for members",
                    "items": {
                        "regex": "^\\d+$",
                        "required": false,
                        "type": "string"
                    },
                    "required": false,
                    "type": "array"
                }
            },
            "required": false,
            "type": "object"
        },
        "moderator": {
            "default": {},
            "description": "Defines the discovery (call in) properties for a moderator",
            "properties": {
                "join_deaf": {
                    "default": false,
                    "description": "Determines if a moderator will join deaf",
                    "required": false,
                    "type": "boolean"
                },
                "join_muted": {
                    "default": false,
                    "description": "Determines if a moderator will join muted",
                    "required": false,
                    "type": "boolean"
                },
                "numbers": {
                    "default": [],
                    "description": "Defines the conference (call in) number(s) for moderators",
                    "items": {
                        "regex": "^\\d+$",
                        "required": false,
                        "type": "string"
                    },
                    "required": false,
                    "type": "array",
                    "uniqueItems": true
                },
                "pins": {
                    "default": [],
                    "description": "Defines the pin number(s) for moderators",
                    "items": {
                        "regex": "^\\d+$",
                        "required": false,
                        "type": "string"
                    },
                    "required": false,
                    "type": "array"
                }
            },
            "required": false,
            "type": "object"
        },
        "name": {
            "description": "A friendly name for the conference",
            "maxLength": 128,
            "minLength": 1,
            "required": false,
            "type": "string"
        },
        "owner_id": {
            "description": "The user ID who manages this conference",
            "maxLength": 32,
            "minLength": 32,
            "required": false,
            "type": "string"
        },
        "play_name": {
            "default": false,
            "description": "Do we need to announce new conference members?",
            "required": false,
            "type": "boolean"
        },
        "profile": {
            "description": "The XML profile name used to configure the conference",
            "required": false,
            "type": "string"
        }
    },
    "required": false,
    "type": "object"
}

Создание объекта схемы обработки вызова - callflow

В данном примере будет показано как создать схему обработки вызова на примере одного действия - вызова обекта конференция. В данном примере конференции назначается номер 3000.

Создание схемы обработки вызова имеет вид

curl -X PUT {api_uri}/accounts/{account_id}/callflows \
     -H 'Content-Type: application/json' \
     -H 'X-Auth-Token: {auth_token}' \
     -d '{"data":{"flow":{"data":{"id":"{conference_id}"},"module":"conference","children":{}},"numbers":["{number}"]}}'

Например:

curl -X PUT https://api.rcsnet.ru/v2/accounts/abcdef1234567890abcdef1234567890/callflows \
     -H 'Content-Type: application/json' \
     -H 'X-Auth-Token: xxxxxxxxxxxxxxxxxxxxxxxxx' \
     -d '{"data":{"flow":{"data":{"id":"68d05c10ef0360f908028d07bfa433e7"},"module":"conference","children":{}},"numbers":["3000"]}}'

В результате будет получен ответ следующего вида

{
   "data":{
      "flow":{
         "data":{
            "id":"68d05c10ef0360f908028d07bfa433e7",
            "moderator":false,
            "play_entry_tone":true,
            "play_exit_tone":true
         },
         "module":"conference",
         "children":{}
      },
      "numbers":[
         "3000"
      ],
      "patterns":[],
      "id":"124df94b976203bcb37e364d292954a3"
   },
   "revision":"1-bb6613a0a52727d001b93fbf9eba37f1",
   "request_id":"4c24585360fab3018bdd53aab7b0bfd5",
   "status":"success",
   "auth_token":"4e8a6ebd9dfffea9d73a4d110e5a8084"
}

Теперь с телефона можно сделать набор номера 3000 и вы войдете в конференицию.

Инициирование вызова телефона сотрудника и соединение его с другим абонентом средствами API

Для вызова телефона сотрудника и соедниения его с другим абонентам необходимо выполнить вызов вида:

curl -X GET {api_uri}/accounts/{account_id}/devices/{device_id}/quickcall/{dialed_number} \
     -H 'X-Auth-Token: {auth_token}'

Например ‘device_id’ устройства вы получили выполнив запрос описанный в разделе “Отображение списка SIP устройств”. Для вызова этого устройства и присоединение его в конференцию с номером 3000 необходимо выполнить запрос такого вида.

curl -X GET https://api.rcsnet.ru/v2/accounts/b72e6c95956ed9f061892b58f4d8991c/devices/68a37a5298a40f751b1bd9d12a4e30a8/quickcall/3000 \
     -H 'X-Auth-Token: {auth_token}'

В ответе вы получите описание деталей инициированного вызова следующего вида.

{
   "data":{
      "application_name":"transfer",
      "application_data":{
         "route":" 3000"
      },
      "endpoints":[
         {
            "invite_format":"username",
            "to_user":"2496",
            "to_username":"2496",
            "to_realm":"rcsnet.ru",
            "to_did":"3000",
            "endpoint_id":"68a37a5298a40f751b1bd9d12a4e30a8",
            "codecs":[
               "OPUS",
               "PCMA"
            ],
            "presence_id":"2496@rcsnet.ru",
            "custom_sip_headers":{
               "x_kazoo_aor":"sip:2496@rcsnet.ru"
            },
            "custom_channel_vars":{
               "sip_invite_domain":"rcsnet.ru",
               "media_encryption_enforce_security":false,
               "account_id":"b72e6c95956ed9f061892b58f4d8991c",
               "owner_id":"4a7bad7c80e8d890321492e1ba2d0204",
               "authorizing_type":"device",
               "authorizing_id":"68a37a5298a40f751b1bd9d12a4e30a8",
               "auto_answer":true
            },
            "outbound_call_id":"66b8058e5a6eb9a21176d36cd34a711fa46a-quickcall"
         }
      ],
      "timeout":30,
      "ignore_early_media":true,
      "media":"process",
      "outbound_caller_id_name":"Device QuickCall",
      "outbound_caller_id_number":"2496",
      "outbound_callee_id_name":"Sergey Safarov",
      "outbound_callee_id_number":"3000",
      "dial_endpoint_method":"simultaneous",
      "continue_on_fail":false,
      "custom_channel_vars":{
         "account_id":"b72e6c95956ed9f061892b58f4d8991c",
         "retain_cid":"true",
         "inherit_codec":"false",
         "authorizing_type":"device",
         "authorizing_id":"68a37a5298a40f751b1bd9d12a4e30a8"
      }
   },
   "revision":"54-7fb24d8d0720b2b5471164b0e3601a5e",
   "request_id":"233d4d005c61ddf06d79c06f674330a7",
   "status":"success",
   "auth_token":"bb7b2852827fd3466c023a214b8813ec"
}

В результате выполнения этого вызова на устройство поступит звонок. После того как он будет отвечен будет вызван абонет с номером 3000, в нашем примере этот номер принадлежит конференции. Таким образом сотрудник будет присоеднинен к конференции.

Приложения для иследования API

В списке доступных приложений выберите приложение “API explorer”. С помощью данного приожения Вы сможете в интерактивном режиме из браузера выполнить необходимые вам вызовы.

Литератрура

Общее описание работы с API находится на странице https://2600hz.atlassian.net/wiki/display/APIs/API+Introduction более подробно API описано в разделе “Configuration APIs” https://2600hz.atlassian.net/wiki/display/APIs/Configuration+APIs.