Документация / Введение

AsterConnector v2.0 - Asterisk+Битрикс24

Интеграция Asterisk (FreePBX / Issabel) с Битрикс24.

Один файл
Нет зависимостей. Просто PHP файл.
Битрикс24
OAuth2, CRM, звонки, задачи, сделки.
Asterisk AMI
PJSIP и chan_sip. FreePBX и Issabel.
Веб-панель
Встроенный интерфейс на порту 8080.

Что умеет

  • Регистрация входящих и исходящих звонков в Битрикс24
  • Автосоздание лидов, контактов и сделок при звонке
  • Click-to-Call из карточки клиента в Битрикс24
  • Загрузка записей разговоров в карточку звонка
  • Маршрутизация входящих на ответственного менеджера
  • Создание задач «Перезвонить» при пропущенных
  • Автозакрытие задач при успешном перезвоне
  • Повторные сделки для существующих клиентов
  • Несколько DID с разными воронками продаж
  • Нормализация номеров телефонов
  • Работает с Битрикс24 Облако и Коробка
Разработчик: ООО «LEADHUNTER», Узбекистан · +998 (71) 202-67-67 · support@leadhunter.uz · asterconnector.uz
Документация / Требования

Системные требования

Сервер

КомпонентМинимумРекомендуется
ОСUbuntu 20.04 / CentOS 7Ubuntu 22.04 LTS
PHP8.08.1 и выше
RAM256 МБ свободно512 МБ
Asterisk1618 и выше
Место на диске100 МБ1+ ГБ (для записей)

PHP расширения (обязательные)

РасширениеНазначение
php-cliЗапуск PHP из командной строки
php-curlHTTP запросы к Битрикс24
php-pdo_sqlite или php-sqlite3База данных SQLite
php-pcntlОбработка системных сигналов
php-mbstringРабота с многобайтовыми строками

Сеть

  • Порт 8080 должен быть открыт и доступен из интернета — для Click-to-Call
  • Сервер должен иметь выход в интернет — для OAuth и проверки лицензии
Issabel / CentOS 7: Системный PHP 5.4 не подходит. Нужен PHP 8.1 через репозиторий Remi — инструкция в разделе «Установка».
Документация / Установка

Установка

Ubuntu / Debian (FreePBX, PJSIP)

Подключитесь к серверу по SSH от пользователя root и выполните команды по порядку:

1
Обновить пакеты и установить PHP расширения
apt update
apt install -y php-cli php-curl php-sqlite3 php-mbstring
Проверьте что PHP установлен — должна отобразиться версия 8.0 и выше:
php -v
2
Скачать файл модуля
cd /tmp
wget https://asterconnector.uz/download/AsterConnector-v2.0-stable.zip
Если wget недоступен — скопируйте файл вручную через SCP или FileZilla в папку /tmp/
3
Скопировать файл в рабочую директорию и создать папки
cp /tmp/asterconnector.php /opt/asterconnector.php
chmod 644 /opt/asterconnector.php
mkdir -p /etc/asterconnector
mkdir -p /var/log/asterconnector
4
Создать systemd сервис
cat > /etc/systemd/system/asterconnector.service << 'EOF'
[Unit]
Description=AsterConnector v2.0
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/php /opt/asterconnector.php
Restart=always
RestartSec=5
StandardOutput=null
StandardError=null

[Install]
WantedBy=multi-user.target
EOF
5
Включить автозапуск и запустить сервис
systemctl daemon-reload
systemctl enable asterconnector
systemctl start asterconnector
Проверяем что сервис запустился — должно быть Active: active (running):
systemctl status asterconnector
6
Проверить работу панели
curl -s http://127.0.0.1:8080/health
Ожидаемый ответ: {"status":"ok","version":"2.0.0",...}
7
Открыть веб-панель в браузере
Адрес: http://IP_ВАШЕГО_СЕРВЕРА:8080

Логин по умолчанию: admin
Пароль по умолчанию: admin

После входа сразу смените пароль в разделе Система.

Issabel / CentOS 7 (chan_sip)

Важно: На Issabel системный PHP версии 5.4. Для модуля требуется PHP 8.1 — устанавливаем через Remi репозиторий.
1
Установить PHP 8.1 через Remi репозиторий
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y php81 php81-php-cli php81-php-curl php81-php-pdo php81-php-mbstring php81-php-pcntl
Проверяем:
php81 -v
2
Скачать и разместить файл
cd /tmp
wget https://asterconnector.uz/download/asterconnector.php
cp asterconnector.php /opt/asterconnector.php
chmod 644 /opt/asterconnector.php
mkdir -p /etc/asterconnector /var/log/asterconnector
3
Создать systemd сервис (с php81)
cat > /etc/systemd/system/asterconnector.service << 'EOF'
[Unit]
Description=AsterConnector v2.0
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/php81 /opt/asterconnector.php
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable asterconnector
systemctl start asterconnector
systemctl status asterconnector

Управление сервисом

КомандаДействие
systemctl start asterconnectorЗапустить
systemctl stop asterconnectorОстановить
systemctl restart asterconnectorПерезапустить
systemctl status asterconnectorСтатус сервиса
tail -f /var/log/asterconnector/asterconnector.logЛог в реальном времени

Обновление

1
Сделайте бэкап
Панель → Система → кнопка «↓ Бэкап»
2
Замените файл
systemctl stop asterconnector
cp /tmp/asterconnector_new.php /opt/asterconnector.php
systemctl start asterconnector
3
Проверьте работу
curl -s http://127.0.0.1:8080/health

Удаление

systemctl stop asterconnector
systemctl disable asterconnector
rm -f /etc/systemd/system/asterconnector.service
systemctl daemon-reload
rm -f /opt/asterconnector.php
rm -rf /etc/asterconnector/
rm -rf /var/log/asterconnector/
Внимание: Удаляются все настройки, токены и база данных. Сделайте бэкап если нужна история звонков.
Документация / AMI

Настройка AMI (Asterisk)

AMI — интерфейс управления Asterisk. Модуль подключается к AMI для отслеживания звонков в реальном времени.

Шаг 1 — Настройка manager.conf

Откройте файл конфигурации:

nano /etc/asterisk/manager.conf

Убедитесь что секция [general] выглядит так:

[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1

Добавьте пользователя для модуля в конец файла:

[asterconnector]
secret = ВАШ_ПАРОЛЬ_ЗДЕСЬ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = all
write = all

Применяем изменения без перезагрузки Asterisk:

asterisk -rx "manager reload"

Проверяем что AMI работает:

asterisk -rx "manager show settings"

Шаг 2 — Настройка в панели модуля

Панель → раздел AMI → заполните поля и нажмите Проверить:

ПолеЗначение
Хост127.0.0.1
Порт5038
Логинasterconnector
Парольваш пароль из manager.conf
SIP стекАвто (или вручную: FreePBX→PJSIP, Issabel→chan_sip)

Нажмите Сохранить. Проверяем подключение в логе:

tail -5 /var/log/asterconnector/asterconnector.log | grep AMI
Ожидаемый результат: AMI: подключён, версия=X.X.X
Документация / Битрикс24

Подключение к Битрикс24

1
Скопируйте адрес для Битрикс24
Панель → Битрикс24 → внизу страницы найдите поле «Адрес для Битрикс24» и скопируйте. Выглядит как: http://IP_СЕРВЕРА:8080/oauth/callback
2
Создайте локальное приложение в Битрикс24
Войдите в Битрикс24 → меню слева ПриложенияРазработчикамЛокальные приложенияДобавить
3
Заполните параметры приложения
ПолеЗначение
НазваниеAsterConnector
ТипСерверное
Путь вашего обработчикаадрес из шага 1
Путь для первоначальной установкитот же адрес
Использует только API✓ поставьте галочку
4
Выберите права доступа
Нажмите «Выбрать» рядом с Права и добавьте:
  • CRM — работа со сделками, контактами, лидами
  • Телефония — регистрация звонков
  • Пользователи — синхронизация сотрудников
  • Сообщения (im) — уведомления о пропущенных
  • Задачи — создание и закрытие задач
5
Сохраните и скопируйте Client ID и Client Secret
После нажатия Сохранить Битрикс24 покажет Client ID и Client Secret. Скопируйте оба значения.
6
Вставьте данные в панель модуля и сохраните
Панель → Битрикс24 → заполните Домен (без https://), Client ID, Client Secret → Сохранить
7
Нажмите Подключить и разрешите доступ
Кнопка Подключить → откроется Битрикс24 → нажмите Разрешить → вас перенаправит обратно со статусом «Подключено»
HTTPS для C2C: Если порт 8080 не работает через HTTPS — C2C может не работать с Битрикс24 облако. Настройте nginx с SSL или откройте порт напрямую.
Документация / Сотрудники

Настройка сотрудников

Модуль сопоставляет сотрудников Битрикс24 с внутренними номерами Asterisk. Без этого невозможно определить кто совершил или принял звонок.

Шаг 1 — Заполнить внутренние номера в Битрикс24

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

Битрикс24 → Сотрудники → открыть профиль → Изменить → поле «Внутренний телефон»

Номер должен совпадать с номером в Asterisk (например: 101, 102).

Шаг 2 — Синхронизировать

Панель → Сотрудники → кнопка «↻ Синхронизировать»

Синхронизация также происходит автоматически раз в час.

Шаг 3 — Проверить

В таблице сотрудников должна быть заполнена колонка Внутренний. Если пусто — заполните номер в Битрикс24 и синхронизируйте снова.

sqlite3 /etc/asterconnector/asterconnector.db \
  "SELECT user_id_b24, name, inner_number FROM employees WHERE active=1"
Документация / Настройки звонков

Настройки звонков

Контексты Asterisk

ПараметрПо умолчаниюОписание
Входящие контекстыfrom-trunk, from-pstnЧерез запятую. Звонки из этих контекстов — входящие.
Контекст исходящихfrom-internalЗвонки из этого контекста — исходящие.
Префикс набораДобавляется перед номером при исходящем (например: 9)
FreePBX: from-trunk + from-internal. Issabel: может быть from-pstn или from-sip. Проверьте: asterisk -rx "dialplan show"

Нормализация номеров

Автоматически добавляет код страны. Пример для Узбекистана: 901234567+998901234567

Номера компании (DID)

Укажите все номера вашей АТС. Для каждого DID можно настроить отдельную воронку продаж. Добавляйте в панели → Настройки звонков → «Номера компании (DID)».

Создание CRM объектов

НастройкаОписание
Создавать контакт при входящемЕсли номер не найден — создать контакт
Создавать сделку при входящемСоздать сделку. Требует создания контакта.
Повторная сделка при входящемЕсли у контакта нет открытых сделок — создать новую
То же для исходящихАналогично для исходящих звонков

Ответственный за пропущенный

  • Первый агент — первый сотрудник которому позвонило
  • Последний агент — последний кому звонило
  • Все агенты — уведомляются все
  • Ответственный за сделку — ищется в CRM по номеру телефона

Дополнительно укажите пользователя по умолчанию — будет ответственным если клиент новый и в CRM не найден.

Документация / Маршрутизация

Маршрутизация на ответственного

Автоматически направляет входящий звонок на менеджера ответственного за клиента в Битрикс24.

Как работает

  1. Входящий звонок поступает на АТС
  2. Диалплан Asterisk делает HTTP запрос: http://127.0.0.1:8080/forward?phone=НОМЕР
  3. Модуль ищет ответственного в Битрикс24 по номеру
  4. Возвращает внутренний номер сотрудника (например 101)
  5. Диалплан переводит звонок на этого сотрудника
  6. Если ответственный не найден — звонок идёт в очередь

Шаг 1 — Настройка диалплана FreePBX (PJSIP)

nano /etc/asterisk/extensions_custom.conf

Добавьте в конец файла:

[ac-transfer]
exten => _.,1,NoOp(AsterConnector: ${CALLERID(num)})
 same => n,Set(AC_EXT=)
 same => n,Set(CURLOPT(httptimeout)=3)
 same => n,Set(CURLOPT(conntimeout)=3)
 same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)})})
 same => n,GotoIf($["${AC_EXT}"=""]?queue)
 same => n,Set(AC_RESPONSIBLE=${AC_EXT})
 same => n,Dial(PJSIP/${AC_EXT},20,tTg)
 same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
 same => n(queue),Goto(ext-queues,1000,1)
 same => n(done),NoOp(Answered: ${AC_EXT})

Замените ext-queues,1000,1 на ваш контекст и номер очереди.

asterisk -rx "dialplan reload"

Шаг 1 — Настройка диалплана Issabel (chan_sip)

То же самое, но используем SIP/ вместо PJSIP/:

[ac-transfer]
exten => _.,1,NoOp(AsterConnector: ${CALLERID(num)})
 same => n,Set(AC_EXT=)
 same => n,Set(CURLOPT(httptimeout)=3)
 same => n,Set(CURLOPT(conntimeout)=3)
 same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)})})
 same => n,GotoIf($["${AC_EXT}"=""]?queue)
 same => n,Set(AC_RESPONSIBLE=${AC_EXT})
 same => n,Dial(SIP/${AC_EXT},20,tTg)
 same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
 same => n(queue),Goto(ext-queues,1000,1)
 same => n(done),NoOp(Answered: ${AC_EXT})
Issabel: Убедитесь что func_curl загружен: asterisk -rx "module load func_curl.so". Если нет модуля: yum install -y asterisk16-curl

Шаг 2 — Подключить маршрут во FreePBX

FreePBX → ConnectivityInbound Routes → выберите маршрут → Set DestinationCustom Destinations → введите: ac-transfer,s,1 → Save

Шаг 3 — Включить в панели модуля

Панель → Настройки звонков → включите «Использовать автораспределение» → выберите метод → Сохранить.

Шаг 4 — Проверить работу

curl -s "http://127.0.0.1:8080/forward?phone=998901234567"

Если ответственный найден — вернётся его внутренний номер. Если нет — пустой ответ.

Документация / Запись разговоров

Запись разговоров

Модуль автоматически загружает записи разговоров в карточку звонка в Битрикс24 каждые 30 секунд.

ПараметрПо умолчаниюОписание
Директория записей/var/spool/asterisk/monitorПуть к WAV/MP3 файлам Asterisk
Макс. размер файла (МБ)50Файлы больше не загружаются
Загружать в Битрикс24ДаВключить/выключить загрузку
Удалять после загрузкиНетУдалять файл с сервера после загрузки
Только отвеченные: Записи загружаются только для отвеченных звонков.

Автоочистка старых файлов (cron)

Для удаления файлов старше 7 дней добавьте задание в cron:

echo "0 3 * * * find /var/spool/asterisk/monitor/ -name '*.wav' -mtime +7 -delete" | crontab -

Мониторинг

tail -f /var/log/asterconnector/asterconnector.log | grep RECORD
Документация / Click-to-Call

Click-to-Call (C2C)

Звонок клиенту прямо из карточки Битрикс24 одним кликом.

Как работает

  1. Менеджер нажимает на номер в Битрикс24
  2. Битрикс24 отправляет событие ONEXTERNALCALLSTART на сервер модуля
  3. Модуль через AMI звонит на внутренний номер менеджера
  4. Менеджер поднимает трубку
  5. Asterisk звонит клиенту
  6. Звонок фиксируется в карточке клиента

Требования

  • Порт 8080 доступен из интернета
  • В Битрикс24 → Телефония выбрано приложение AsterConnector
  • У сотрудника заполнен внутренний номер в Битрикс24
  • Сотрудник синхронизирован в модуле

Ручная регистрация обработчика

Если C2C не работает — переподключите Битрикс24 или зарегистрируйте вручную:

TOKEN=$(python3 -c "import json; print(json.load(open('/etc/asterconnector/tokens.json'))['access_token'])")

# Удаляем старый обработчик
curl -s "https://ДОМЕН.bitrix24.ru/rest/event.unbind.json" \
  -d "auth=$TOKEN" -d "event=ONEXTERNALCALLSTART" -d "handler=http://ВАШ_IP:8080/c2c"

# Регистрируем новый
curl -s "https://ДОМЕН.bitrix24.ru/rest/event.bind.json" \
  -d "auth=$TOKEN" -d "event=ONEXTERNALCALLSTART" -d "handler=http://ВАШ_IP:8080/c2c"
Issabel / chan_sip: В панели → AMI → SIP стек выберите вручную chan_sip. Иначе C2C звонок пойдёт с неверным форматом канала.
Документация / Задачи

Задачи при пропущенных звонках

При пропущенном создаётся задача «Перезвонить: НОМЕР» с привязкой к контакту и сделке.

ПараметрОписание
Создавать задачу при пропущенномВключить/выключить
Исполнитель задачиОтветственный за пропущенный / за сделку / по умолчанию / конкретный
Срок выполнения (часы)Через сколько часов дедлайн. По умолчанию: 24
Автозакрытие задачЗакрывать при успешном звонке с клиентом
Автозакрытие: Задачи закрываются независимо от того кто их создал и кто исполнитель. Работает для всех задач «Перезвонить» привязанных к контакту или сделке.
Документация / Сделки и контакты

Сделки и контакты

Повторные сделки

  1. Ищем контакт по номеру телефона
  2. Проверяем есть ли открытые сделки у контакта
  3. Если нет — создаём новую сделку в настроенной воронке
  4. Если есть — новую не создаём

Несколько DID с разными воронками

Каждый DID номер можно привязать к отдельной воронке и этапу. Например:

  • Звонки на +998712026262 → воронка «Продажи», этап «Новый»
  • Звонки на +998712026200 → воронка «Поддержка», этап «В работе»

Настраивается: панель → Настройки звонков → Номера компании (DID).

Техническая деталь: Для перемещения сделок между воронками используется crm.item.update, а не crm.deal.update — только первый метод позволяет менять воронку через REST API.
Документация / Лицензия

Лицензия

Активация

1
Откройте раздел Лицензия
Панель → слева меню → Лицензия
2
Введите ключ и нажмите Активировать
3
Проверьте статус
Должно отобразиться: Лицензия активна с датой истечения.
ФайлОписание
/etc/asterconnector/license.keyЛицензионный ключ
/etc/asterconnector/license.jsonКэш. Подписан HMAC — не редактировать вручную.
Grace период 7 дней: При недоступности сервера лицензий модуль продолжает работу через кэш. После 7 дней регистрация звонков прекращается.

Приобрести или продлить: asterconnector.uz

Документация / Ошибки и решения

Ошибки и решения

AMIAMI: нет соединения / ошибка авторизации

Проверьте что enabled=yes в manager.conf и логин/пароль совпадают:

asterisk -rx "manager show settings"

Проверьте permit: должен быть 127.0.0.1/255.255.255.0. После изменений: asterisk -rx "manager reload"

B24Unsupported phone number format

Включите нормализацию номеров в панели → Настройки звонков и укажите код страны (для Узбекистана: 998).

B24expired_token / invalid_token

Переподключите Битрикс24: панель → Битрикс24 → ОтозватьПодключить.

C2CC2C не работает / Внутренний номер не найден

1. У сотрудника не заполнен внутренний номер в Битрикс24. Заполните и синхронизируйте.

2. Обработчик не зарегистрирован. Переподключите Битрикс24.

3 (Issabel). Неверный SIP стек. Выберите chan_sip вручную в настройках AMI.

4. Порт 8080 недоступен из интернета: ufw allow 8080/tcp

IssabelFunction CURL not registered
yum install -y asterisk16-curl
asterisk -rx "module load res_curl.so"
asterisk -rx "module load func_curl.so"

Для автозагрузки добавьте в /etc/asterisk/modules.conf:

load => res_curl.so
load => func_curl.so
IssabelSQLSTATE: syntax error near "ON"

Старая версия SQLite на CentOS 7. Убедитесь что используете актуальную версию модуля.

МаршрутизацияЗвонок всегда идёт в очередь / forward возвращает пустой ответ

1. Включите автораспределение в панели → Настройки звонков.

2. Проверьте что ac-transfer подключён к входящему маршруту в FreePBX.

3. Протестируйте поиск ответственного:

curl -s "http://127.0.0.1:8080/forward?phone=998901234567"

4. Посмотрите лог:

tail -20 /var/log/asterconnector/asterconnector.log | grep "getDeal\|FORWARD"
ЛицензияRC: cache integrity fail

Файл кэша повреждён. Удалите и перезапустите:

rm -f /etc/asterconnector/license.json
systemctl restart asterconnector

Общая диагностика

# Статус сервиса
systemctl status asterconnector

# Последние ошибки
tail -50 /var/log/asterconnector/asterconnector.log | grep ERROR

# Проверка панели
curl -s http://127.0.0.1:8080/health | python3 -m json.tool

# Проверка AMI
asterisk -rx "manager show connected" | grep asterconnector
Документация / FAQ

Часто задаваемые вопросы

Работает ли с Битрикс24 Коробка?

Да. Работает как с Облако так и с Коробкой на своём сервере.

Можно использовать с несколькими DID?

Да. Панель → Настройки звонков → Номера компании. Каждый DID можно привязать к своей воронке.

Звонок регистрируется дважды

Укажите DID номера компании в настройках. Без них входящий звонок может обрабатываться как входящий и как исходящий одновременно.

Как посмотреть историю звонков?

Панель → История звонков. Или напрямую в базе:

sqlite3 /etc/asterconnector/asterconnector.db \
  "SELECT datetime(started_at,'unixepoch','localtime'), direction, status, phone_number, duration FROM calls ORDER BY id DESC LIMIT 20"

Как изменить порт панели?

Панель → Система → Порт панели → Сохранить. Не забудьте открыть новый порт: ufw allow НОВЫЙ_ПОРТ/tcp

Как сменить пароль панели?

Панель → Система → Новый пароль → Сохранить.

Как сохранить настройки при переустановке?

Панель → Система → кнопка «↓ Бэкап». Скачается JSON с настройками.

Проверка что записи загружаются

sqlite3 /etc/asterconnector/asterconnector.db \
  "SELECT record_file, record_uploaded FROM calls WHERE record_file IS NOT NULL ORDER BY id DESC LIMIT 10"

Значение record_uploaded=1 — успешно загружено.

Документация / История изменений

История изменений

v2.0.0 Текущая

  • Встроенный HTTP сервер и веб-панель управления на порту 8080
  • Поддержка PJSIP (FreePBX) и chan_sip (Issabel)
  • OAuth2 авторизация в Битрикс24
  • Регистрация входящих и исходящих звонков
  • Click-to-Call
  • Умная маршрутизация на ответственного менеджера
  • Загрузка записей разговоров в карточку звонка
  • Автосоздание задач «Перезвонить» при пропущенных
  • Автозакрытие задач при успешном перезвоне
  • Повторные сделки через crm.item.update
  • Несколько DID с отдельными воронками
  • Два метода поиска ответственного: по лиду и по контакту
  • Нормализация номеров телефонов
  • Работа с Битрикс24 Облако и Коробка
  • Пометка неотвеченных исходящих: «Не дозвонились»
  • Совместимость с Issabel / CentOS 7 через PHP 8.1 Remi