📚
База знаний | Qolio.io
  • Обзор Qolio
  • Видеоинструкции
    • Интеграция с Битрикс24
    • Права доступа и уровни сотрудников
    • Дополнительные отделы
    • Структура компании
    • Страница "Сотрудники"
    • Настройки организации
    • Управление аккаунтом
    • Страница "Формы оценки"
    • Настройка критериев
    • Настройка формы оценки
    • Cтраница "Список коммуникаций"
    • Конфигурации фильтров
    • Фильтры на "Списке коммуникаций"
    • Как оценить звонок?
    • Как оценить текстовую коммуникацию?
    • Быстрая проверка
    • Где найти мою проверку?
    • Статусы контакта
    • Теги
    • Библиотека звонков
    • Как загрузить звонки
    • Распределение нагрузки
    • Как отслеживать прогресс сотрудников
    • Калибровочные сессии
    • Апелляции: настройка
    • Как подать апелляцию
    • Обработка апелляции
    • Страница "Отчеты": Динамика оценок по отделам
    • Страница "Отчеты": Аналитика по апелляциям
    • Страница "Отчеты": Команда
    • Страница "Аналитика"
    • Личный кабинет Оператора
    • Распределение нагрузки: видео-обзор функции
  • Быстрые клавиши
  • Как написать сообщение в поддержку?
  • Последние обновления
    • Возможность менять оператора, ответственного за звонок
    • Улучшения в настройках аналитики и интеграции
    • Перезагрузка плеера во время проверки
    • Дополнительные отделы, больше информации по сделкам из AmoCRM и другие возможности
    • Отображение результатов по дате оценки и другие новые возможности
    • Апелляции на любые типы коммуникаций
    • Отображение аналитики по дате оценки в разделах “Личный кабинет” и “Команда” уже доступно
    • Простая интеграция с HelpDeskEddy
  • Возможности платформы
    • Список коммуникаций
    • Формы оценки
      • Настройка форм оценки
      • Критерии формы оценки
      • Зоны оценки
      • Подсчет результатов по формам оценки
        • Процентное/Простая/Сумма
        • Процентное/Простая/Средний балл
        • Процентное/Взвешенная/Средний балл
        • Числовое/Простая/Сумма
        • Числовое/Простая/Средний балл
        • Числовое/Взвешенная/Средний балл
    • Проверка коммуникаций
      • Как оценить звонок
      • Быстрая проверка
    • Браузерное расширение
    • Теги
    • Библиотека звонков
    • Статусы контакта
    • Апелляции
      • Как подать апелляцию?
      • Как обработать апелляцию
    • Аналитика
      • Как настроить аналитику
      • Как посмотреть аналитику по дате оценки
      • Отчёт "Динамика оценок по отделам"
      • Команда
      • XL-виджеты
        • Результаты проверок по сотрудникам
        • Результаты сотрудников по критериям
        • Результаты проверок по критериям
        • Количество проверок по проверяющим
        • Результаты сотрудников по формам оценки
        • Результаты сотрудников по форме оценки
        • Флаги и комментарии
      • L-виджеты
        • Динамика среднего балла по отделам
        • Динамика балла по группам вопросов формы оценки
        • Динамика балла по вопросам формы оценки
        • Динамика количества проверенных звонков
        • Динамика количества звонков по сотрудникам
        • Динамика средней продолжительности звонка по сотрудникам
        • Динамика количества звонков по отделам
        • Динамика средней продолжительности звонка по отделам
        • Динамика среднего балла по сотрудникам
      • M-виджеты
        • Сравнение среднего балла по сотрудникам
        • Количество флагов и комментариев
        • Сравнение количества флагов по сотрудникам
        • Сравнение среднего балла по отделам
        • Сравнение количества тегов по отделам
        • Сравнение среднего балла по формам оценки
        • Сравнение среднего балла по вопросам в форме оценки
        • Сравнение количества тегов по сотрудникам
        • Сравнение среднего балла в группах формы оценки
        • Сравнение среднего балла вопросов в группах
        • Сравнение количества звонков по отделам
        • Сравнение количества звонков по сотрудникам
        • Сравнение количества проверок супервизоров
        • Сравнение средней продолжительности звонков по сотрудникам
        • Сравнение количества флагов по отделам
        • Сравнение средней продолжительности звонков по отделам
      • S-виджеты
        • Количество звонков
        • Общая продолжительность звонков
        • Процент проверок
        • Средняя продолжительность звонка
        • Средний балл по форме оценки
    • Калибровочные сессии
    • Личный кабинет Оператора
    • Распределение нагрузки: общий обзор функции
      • Распределение нагрузки: как отслеживать процесс проверок
      • Распределение нагрузки: как оценивать коммуникации
    • Настройки пользователей и отделов
      • Как пригласить сотрудников в Qolio
      • Настройки прав доступа и уровней сотрудников
      • Дополнительные отделы
      • Добавление новых сотрудников и смена пароля
      • Как добавить нового сотрудника из вашей системы
      • Настройка уведомлений и статусов
      • Страница "Подключения"
  • Интеграции
    • Битрикс 24
      • Bitrix (Коробочная Версия): Разрешение Доступа
    • AmoCRM
      • Как просмотреть все коммуникации из сделки AmoCRM
      • Если не получается оценить звонок из AmoCRM
      • Авторизация в amoCRM
    • Что делать после установки Qolio в AmoCRM/Битрикс24?
    • Usedesk
    • Binotel
    • Sipuni
    • Zendesk
    • HelpDeskEddy
    • UIS/Comagic
    • Edna
    • MANGO OFFICE
    • Подключение по API
      • Интеграция по API для IP-телефонии и чатов
        • API запрос для добавления звонков
          • API запрос для добавления звонка с транскрибцией
        • API запрос для добавления звонков с хранением данных на S3
        • HTTPS интеграция с текстовыми каналами (через API Qolio)
      • Создание csv файла для добавления пользователей при интеграции по API
      • Создание и управление пользовательскими полями при интеграции по API
      • Синхронизация аккаунтов пользователя в системе Qolio и интегрируемой системы
      • Доступ через API
      • Добавление и настройка пользователей через API
      • Custom Fields API - Настройка пользовательских полей
      • Возможные ошибки API
      • Получение оценок операторов по API
      • Приложение (информация о полях в объектах JSON:API)
    • Установка коробочной версии на одной машине (single-node deployment)
    • Oktell: Общие сведения для подключения
    • Asterisk: Общие сведения о настройке интеграции
  • Вопросы
    • Что делать, если по сотрудникам нет коммуникаций
    • Доступ к Qolio через VPN
    • Если в браузере не проигрывается звонок с http-ссылкой
    • "Установленные настройки недоступны" - что делать?
  • Безопасность
    • Облачная версия
Powered by GitBook
On this page
  • Введение
  • Порядок действий при подключении
  • Пример создания скрипта для синхронизации данных Asterisk по API

Was this helpful?

  1. Интеграции

Asterisk: Общие сведения о настройке интеграции

PreviousOktell: Общие сведения для подключенияNextЧто делать, если по сотрудникам нет коммуникаций

Last updated 10 months ago

Was this helpful?

Введение

Asterisk очень доступный инструмент для создания компьютерной телефонии внутри компании. Вместе с этим у Asterisk'a нет одного способа поставки и способа использования, поэтому настройка интеграции конкретной установки Asterisk должна производиться ответственным сотрудником компании.

Порядок действий при подключении

  1. Получить от Qolio доступ к аккаунту админа в вашем кабинете.

  2. Для начала со стороны телефонии нужно определить следующие вещи:

    • где будут храниться записи звонков и как к этим записям можно получить доступ по http(s). В системе есть возможность настроить доступ через S3 совместимое облачное хранилище и настроить доступ к хранилищу с basic http авторизацией.

    • по какому атрибуту будет привязываться звонок к оператору внутри Qolio. Для этой привязки используется поле operator_id в API запросе

  3. Добавить пользователей, по которым будут приходить звонки в Qolio (если этого не сделать, звонки, переданные по API сохраняться не будут). Пользователь добавляет админ телефонии либо другой сотрудник компании.

    • Настроив пользователей вручную () или загрузив их через CSV файл (подробнее ) в настройках API интеграции

    • Создавать и настраивать пользователей через API (, кроме этого в этой статье описано, как с помощью python скрипта настраивать пользователей через CSV файл)

    Для импорта звонков пользователи должны быть загружены в систему DealApp, а так же быть активными и назначенными на отдел.

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

  5. Разработать расширение для телефонии, которая будет передавать через http запросы на DealApp API информацию о совершенных звонках на телефонии. Информацию про API запросы, которые нужно делать для импорта звонков телефонии. Так же можно попробовать делать запросы со страницы настройки интеграции. Далее в этой статье описан пример создания скрипта для синхронизации данных.

Для последующей эксплуатации необходимо продумать, как будут обновляться пользователи, какие роли будут в системе, как они будут взаимодействовать и так далее. На этом моменте технические задачи заканчиваются.

Пример создания скрипта для синхронизации данных Asterisk по API

Qolio необходимо принимать следующие данные о звонках:

  • ID оператора в системе (operator_id) - это идентификатор оператора в системе, с которым связан звонок.

  • Длительность (duration) и направление звонка (direction)

  • Номер звонящего клиента (client_phone_number)

  • URL Ссылку на запись разговора (media_url), по которой можно получить доступ к записи разговора. Эта ссылка будет передаваться в плеер сервиса Qolio.

Также есть возможность расширить набор этих данных через поле metacontent (custom_fields). Подробности можете прочитать в статье про Custom HTTP интеграцию.

В данной статье приводится пример работы, которую можно выполнить, чтобы подключить Asterisk к DealApp

Порядок работы

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

  • создается systemd сервис, который запускается периодически каждые пол часа как cron job

  • этот сервис запускает скрипт, который подключается к базе данных и вытаскивает данные о звонках за последнее время

  • далее скрипт преобразовывает данные из базы данных в необходимый JSON формат и отправляет их в Qolio

Далее будет приведен примеры сервисов, которые были созданы на основе Red Hat Linux (Linux ats 3.10.0) с Asterisk 13.32.0, Python 2.7.5 и Mysql 5.5 (Ver 15.1 Distrib 5.5.65-MariaDB). Python был выбран как скриптовой язык из-за того, что он с большой вероятностью будет находиться в дистрибутиве с Asterisk.

Чаще всего записи телефонных звонков доступны через сетевое хранилище и телефонный разговор в нем можно найти по названию файла, которое храниться в базе CDR.

Скрипт для загрузки телефонных звонков в DealApp

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

// sudo pip install mysql-connector-python
sudo pip install requests

sudo mkdir -p /etc/dealapp-sync/bin

sudo touch /etc/dealapp-sync/bin/dealapp-sync
sudo chmod +x /etc/dealapp-sync/bin/dealapp-sync

В папке /etc/dealapp-sync будет храниться все данные о синхронизации, в том числе и файлик со временем последней синхронизации.

Нам необходимо так же установить pip пакет mysql-connector-python для работы с mysql базы данных и requests для того, чтобы делать http запросы в DealApp сервис.

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

Содержание скрипта /etc/dealapp-sync/bin/dealapp-sync

// #!/usr/bin/env python

import argparse, sys, time, re, logging, datetime, mysql.connector, json, os.path, glob, requests

from logging import critical, error, info, warning, debug
from datetime import datetime, timedelta
from os import path

INTEGRATION_URL="https://api.prod1.dealapp.io/api/v1/integrations/8a48a9d6-1930-47ca-a331-e60e1945d249/phone_calls"
AUTHORIZATION_TOKEN="253aac176651c106c7fcf57acf324559b8e5aa0a27ba1a2db88d325256a3df15fbff1eb353a036faf065d167a7c237d9eacfe217212306f554d541e8321acde1"
RECORDS_STORAGE_BASE_URL="https://ats-srv.local"
DEFAULT_CONFIG_PATH="/etc/dealapp-sync/last_export_timestamp"
INTERNAL_NUMBER_MATCHER=re.compile('^\d{3}$')
CDR_DATABASE_NAME="asteriskcdrdb"


class PhoneCall:
  def __init__(self, clid, calldate, src, dst, billsec, recordingfile):
    self.clid = clid
    self.calldate = calldate
    self.src = src
    self.dst = dst
    self.billsec = billsec
    self.recordingfile = recordingfile

  def is_valid(self):
    return (bool(INTERNAL_NUMBER_MATCHER.match(self.dst)) or bool(INTERNAL_NUMBER_MATCHER.match(self.src))) and self.billsec > 0

  def is_incoming(self):
    return bool(INTERNAL_NUMBER_MATCHER.match(self.dst))

  def direction(self):
    return "incoming" if self.is_incoming() else "outcoming"

  def operator_id(self):
    return self.dst if self.is_incoming() else self.src

  def client_phone_number(self):
    return self.src if self.is_incoming() else self.dst

  def duration(self):
    return float(self.billsec)

  def started_at(self):
    return self.calldate.isoformat()

  def media_url(self):
    return "{}/{}/{}/{}/{}".format(RECORDS_STORAGE_BASE_URL, self.calldate.year, self.calldate.strftime("%m"), self.calldate.strftime("%d"), self.recordingfile)


def get_last_export_timestamp():
  try:
    with open(DEFAULT_CONFIG_PATH, 'r') as config_file:
      return datetime.strptime(config_file.read(), "%Y-%m-%d %H:%M")
  except:
    print "Can not read config file with synchronization timestamp, exporting phone calls created 0.5h ago"
    return datetime.now() - timedelta(hours = 26)


def save_last_export_timestamp(syncronization_start_time):
  try:
    with open(DEFAULT_CONFIG_PATH, 'w') as config_file:
      config_file.write(syncronization_start_time.strftime("%Y-%m-%d %H:%M"))
  except:
    print "Can not save last export time into {}".format(DEFAULT_CONFIG_PATH)


def read_phone_calls_from_database(fetch_from_time):
  cnx = mysql.connector.connect(database=CDR_DATABASE_NAME)
  cursor = cnx.cursor()
  query = ("SELECT clid, calldate, src, dst, billsec, recordingfile FROM cdr "
           "WHERE calldate > %s "
           "AND billsec > 0 "
           "AND COALESCE (recordingfile, '') <> ''")
  cursor.execute(query, (fetch_from_time,))
  phone_calls = []
  for (clid, calldate, src, dst, billsec, recordingfile) in cursor:
    phone_calls.append(PhoneCall(clid, calldate, src, dst, billsec, recordingfile))
  cursor.close()
  cnx.close()
  return phone_calls


def send_phone_calls_to_dealapp(phone_calls):
  phone_calls_are_sent_successfully = True
  headers = {'Content-Type': 'application/json', 'Authorization': AUTHORIZATION_TOKEN}

  for phone_call in phone_calls:
    if phone_call.is_valid():
      serialized_phone_call = {
        "operator_id":         phone_call.operator_id(),
        "direction":           phone_call.direction(),
        "duration":            phone_call.duration(),
        "started_at":          phone_call.started_at(),
        "client_phone_number": phone_call.client_phone_number(),
        "media_url":           phone_call.media_url()
      }
      try:
        result = requests.post(url=INTEGRATION_URL, data=json.dumps(serialized_phone_call), headers=headers)
        if(result.status_code != 200):
          print("Phone call with clid {} can not be sent to DealApp".format(phone_call.clid))
          print(result.text, "Reason")
      except:
        phone_calls_are_sent_successfully = False
        print("Can't connect to DealApp service")

  return phone_calls_are_sent_successfully


def main():
  fetch_from_time = get_last_export_timestamp()
  last_export_time = datetime.now()
  phone_calls = read_phone_calls_from_database(fetch_from_time)
  successeed = send_phone_calls_to_dealapp(phone_calls)
  if(successeed):
    save_last_export_timestamp(last_export_time)


if __name__ == '__main__':
    main()

В этом скрипте есть следующие константы:

Константы

Название
Описание

INTEGRATION_URL

Значение AUTHORIZATION_TOKEN берется из модального диалога интеграции (Токен интеграции)

AUTHORIZATION_TOKEN

Значение INTEGRATION_URL берется из модального диалога интеграции (URL интегрируемого приложения)

RECORDS_STORAGE_BASE_URL

Адрес сетевого хранилища записей. В этом виде может выступать адрес S3 bucket или ссылка nginx сервер, который раздает звонки

DEFAULT_CONFIG_PATH

Адрес на файл со временем последней синхронизации

INTERNAL_NUMBER_MATCHER

С помощью этого регулярного выражения проверяется являться данный телефонный разговор внутренним или нет

CDR_DATABASE_NAME

Название базы данных CDR, которое необходимо для подключения к этой базе. В общем случае это значение можно найти в файле /etc/asterisk/cdr_adaptive_odbc.conf

PhoneCall класс используется для того, чтобы принимать данные из базы данных и сериализовать их в значения, которые ожидает получить Qolio.

Название метода
Описание

is_valid

Позволяет определить стоит ли экспортировать этот телефонный звонок (например, если звонок не состоялся или состоялся между внутренними номерами)

is_incoming

Определяет, является ли телефонный звонок входящим

direction

Возвращает значения "incoming" или "outcoming" в зависимости от направления разговора

duration

Длительность разговора в секундах. Обратите внимание, что здесь мы берем значение из поля billsec в базе данных, так как оно отображает реальную длительность разговора между оператором и клиентом без времени ожидания.

operator_id

Идентификатор оператора в системе. В нашем случае это значение его внутреннего номера, это значение должно быть настроено в системе DealApp.

client_phone_number

Телефонный номер клиента, с которым происходил разговор

started_at

Время разговора в ISO8601 формате

media_url

Ссылка на запись разговора, которая будет использоваться в плеере внутри DealApp. В нашем случае ссылка формируется из адреса хранилища данных, данных о дате звонка и названия записи

Описаний функций скрипта

Name
Описание

get_last_export_timestamp

Получает время последней синхронизации с DealApp. Далее это время используется, чтобы доставать информацию о звонках из базы CDR

save_last_export_timestamp

Записывает время последней успешной синхронизации с DealApp в файл

read_phone_calls_from_database

Делает запрос в базу данных на получение записей после определенного времени и оборачивает результат в объекты типа PhoneCall

send_phone_calls_to_dealapp

Принимает список телефонных звонков, преобразует их в JSON и отправляет на сервис DealApp

Создание systemd сервиса для синхронизации

Сервис для вызова скрипта будет выглядеть следующим образом:

// # /etc/systemd/system/dealapp-sync.service

[Unit]
Description=Export Phone Calls from Asterisk CDR to DealApp
Wants=shopify-recent.timer

[Service]
WorkingDirectory=/etc/dealapp-sync
ExecStart=/etc/dealapp-sync/bin/dealapp-sync
User=root
Group=root

[Install]
WantedBy=multi-user.target

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

// #/etc/systemd/system/dealapp-sync.timer

[Unit]
Description=Run export of Phone Calls from Asterisk CDR to DealApp every 30 minutes
Requires=dealapp-sync.service

[Timer]
Unit=dealapp-sync.service
OnUnitInactiveSec=30m

[Install]
WantedBy=timers.target

Затем создадим скрипты для systemd сервиса и таймера

// sudo systemctl daemon-reload
sudo systemctl enable dealapp-sync.timer
sudo systemctl start dealapp-sync.timer

Для успешной работы Qolio должен принимать данные о телефонных звонках через API по http(s). Для упрощения работы используется "Custom HTTP интеграция", подробности о которой можно почитать тут:

https://wiki.qolio.io/qolio-or-baza-znanii/integracii/podklyuchenie-po-api/sozdanie-i-upravlenie-polzovatelskimi-polyami-pri-integracii-po-api
https://wiki.qolio.io/qolio-or-baza-znanii/integracii/podklyuchenie-po-api/dobavlenie-i-nastroika-polzovatelei-cherez-api
https://wiki.qolio.io/qolio-or-baza-znanii/integracii/podklyuchenie-po-api/dobavlenie-i-nastroika-polzovatelei-cherez-api
https://wiki.qolio.io/qolio-or-baza-znanii/integracii/podklyuchenie-po-api/sozdanie-csv-faila-dlya-dobavleniya-polzovatelei-pri-integracii-po-api
https://wiki.qolio.io/qolio-or-baza-znanii/integracii/podklyuchenie-po-api/integraciya-po-api-dlya-ip-telefonii-i-chatov