Интеграция Asterisk с amoCRM

Дмитрий Аверин
23 июля 2020
access_time7 минут
remove_red_eye1566
Компания «Ланкрафт»
Компания «Ланкрафт»

Подключение IP-АТС Asterisk к одной из наиболее популярных систем класса CRM - amoCRM - является весьма востребованной задачей. Чтобы избежать ошибок и неправильных действий, рекомендуем ознакомиться с данной инструкцией, пошагово описывающей процесс интеграции. Здесь учтены важные нюансы, включая получение сертификата SSL, настройку веб-сервера и многое другое.

Вводные

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

  • ОС Debian Jessie (8.7)
  • Asterisk 13.14
  • Nginx 1.10.3
  • PHP 5.6

Получение SSL-сертификата

Мы воспользуемся сертификатом от Let's Encrypt, который предоставляется бесплатно. Получить его элементарно, но для лучшего понимания следует описать процедуру подробно.

  1. Откроем в браузере страницу letsencrypt.org и нажмем Get Started.
  2. Зайдем в раздел With Shell Access, содержащий руководство к действию.
  3. Переходим на страницу certbot.eff.org, чтобы выбрать используемое нами программное обеспечение.
  4. Действуем согласно предложенной инструкции, применяем в консоли заданные команды.
  5. Отправляем запрос, чтобы получить сертификат, пользуясь утилитой Certbot.
  6. Зададим  команду: certbot certonly. После этого запустится мастер, который запросит необходимые данные в интерактивном режиме.
  7. Копируем сертификаты на сервер NGNIX.

Помните про один важный момент: срок действия сертификатов составляет 3 месяца, после чего необходимо будет перевыпустить их.

Настраиваем веб-сервер

В папке /var/www/asterisk/ необходимо выполнить создание симлинка на папку, в которую будут помещаться файлы с записанными разговорами.

cd /var/www/asterisk/
ln -s /var/calls/ records

О том, как настроить запись переговоров, будет рассказано чуть позднее.

Стоит дополнительно сказать пару слов про сертификаты. У нас уже есть два, которые располагаются в положенном им месте: lankraft.ru.key и lankraft.ru.pem. Но нам еще необходим dhparam.pem. Его требуется создать.

openssl dhparam -out /etc/nginx/certs/dhparam.pem 4096

После завершения этой процедуры работы по настройке NGINX можно считать завершенными. Самое время переходить к Asterisk.

Настраиваем IP-PBX Asterisk

Для обеспечения коммуникации amoCRM с Asterisk, необходимо файлы /etc/asterisk/manager.conf, а также /etc/asterisk/http.conf привести к определенному виду согласно приведенным ниже примерам.

/etc/asterisk/manager.conf

[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
webenabled = yes
httptimeout = 60
debug = on

[amocrm]
secret = Qwerty!23456
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = cdr,reporting,originate
write = reporting,originate

http.conf

[general]
enabled=yes
enablestatic=yes
bindaddr=0.0.0.0
bindport=8088
prefix=asterisk

Далее перезапустим Asterisk и проверим состояние интересующих нас сервисов:

asterisk*CLI> http show status

HTTP Server Status:
Prefix: /asterisk
Server: Asterisk/13.14.0
Server Enabled and Bound to 0.0.0.0:8088

Enabled URI's:
/asterisk/httpstatus => Asterisk HTTP General Status
/asterisk/phoneprov/... => Asterisk HTTP Phone Provisioning Tool
/asterisk/amanager => HTML Manager Event Interface w/Digest authentication
/asterisk/arawman => Raw HTTP Manager Event Interface w/Digest authentication
/asterisk/manager => HTML Manager Event Interface
/asterisk/rawman => Raw HTTP Manager Event Interface
/asterisk/static/... => Asterisk HTTP Static Delivery
/asterisk/amxml => XML Manager Event Interface w/Digest authentication
/asterisk/mxml => XML Manager Event Interface
/asterisk/ari/... => Asterisk RESTful API
/asterisk/ws => Asterisk HTTP WebSocket
Enabled Redirects:
None.

asterisk*CLI> manager show settings

Global Settings:
----------------
Manager (AMI): Yes
Web Manager (AMI/HTTP): Yes
TCP Bindaddress: 0.0.0.0:5038
HTTP Timeout (minutes): 60
TLS Enable: No
TLS Bindaddress: Disabled
TLS Certfile: asterisk.pem
TLS Privatekey:
TLS Cipher:
Allow multiple login: Yes
Display connects: Yes
Timestamp events: No
Channel vars:
Debug: Yes

Далее создадим Dialplan (в данном примере используется AEL, но аналогичным образом его можно реализовать и на Lua):

extensions.ael

globals {
	WAV=/var/calls; //Временный каталог с WAV
	MP3=/var/calls; //Путь к файлам mp3
	RECORDING=1; // Активация записи.
};

macro recording (calling,called) {
	if ("${RECORDING}" = "1"){
		Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
		Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
		System(mkdir -p ${WAV}/${datedir});
		Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${datedir}/${fname}.wav"  "${MP3}/${datedir}/${fname}.mp3" && chmod o+r "${MP3}/${datedir}/${fname}.*");
		Set(CDR(filename)=${fname}.mp3);
		Set(CDR(recordingfile)=${fname}.wav);
		Set(CDR(realdst)=${called});
		MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});
	};
};

context dial_out {
	// исходящие вызовы
	_[71]XX => {
		&recording(${CALLERID(number)},${EXTEN});
		Dial(SIP/${EXTEN},,tTr);
		Hangup();
	}
	// кому позвонить - решит amoCRM
	9898 => {
		Set(DEFMAN=123); // по умолчанию звоним на 123
		Set(TOEXT=${SHELL(wget -O - --quiet "https://lankraftru.amocrm.ru/private/acceptors/asterisk_new/?redirect=Y&number=${CALLERID(num)}&USER_LOGIN=ceo@lankraft.ru&USER_HASH=1dc1444b0d3172c1113ffea9078c575c")}); // получаем номер ответственного менеджера
		Dial(SIP/${TOEXT},,tTr); // звоним ответственному менеджеру, // если он не отвечает или ошибка, звоним на номер по умолчанию
		if ("${DIALSTSTUS}" != "ANSWERED") {
			Dial(SIP/${DEFMAN},,tTr);
		}
		HangUP();
	}
	_XXXXXX => {
		NoOP(=== CALL FROM ${CALLERID(number)} TO ${EXTEN} ===);
		&recording(${CALLERID(number)},${EXTEN});
		Dial(SIP/83843${EXTEN}@multifon,180,tT);
		HangUP();
	}
	_[78]XXXXXXXXXX => {
		NoOP(=== CALL TO ${EXTEN} ===);
		&recording(${CALLERID(number)},${EXTEN});
		Dial(SIP/${EXTEN}@multifon,180,tT);
		HangUP();
	}
	_+7XXXXXXXXXX => {
		NoOP(=== CALL TO ${EXTEN} ===);
		&recording(${CALLERID(number)},${EXTEN});
		Dial(SIP/${EXTEN}@multifon,180,tT);
		 HangUP();
	}
	//все остальные звонки, не прописанные выше, отклоняются
	_X. => {
		Hangup();
	}
}
context default {
	// в контексте по умолчанию отклоняются все звонки
	 _X. => {
		Hangup();
	}
};
context incoming {
	_[87]XXXXXXXXXX => {
		&recording(${CALLERID(number)},${EXTEN});
		Answer();
		Set(CHANNEL(musicclass)=lankraft.ru);
		Set(CUSTOMER_NAME=${SHELL(wget -O - --quiet  "https://lankraftru.amocrm.ru/private/acceptors/asterisk_new/?number=${CALLERID(num)}&USER_LOGIN=ceo@lankraft.ru&USER_HASH=1dc1444b0d3172c1113ffea9078c575c"|cut -d "|" -f1)});
		Set(CALLERID(name)=${CUSTOMER_NAME});
		Queue(queue_1,tT);
		NoOp(=== ${HANGUPCAUSE} ===);
		HangUP();
	}
}

Необходимо обратить внимание еще на один момент. В контексте обработки входящих звонков (Incoming), в одном внутреннем номере будет важная строчка.

Set(CUSTOMER_NAME=${SHELL(wget -O - --quiet "https://lankraftru.amocrm.ru/private/acceptors/asterisk_new/?number=${CALLERID(num)}&USER_LOGIN=ceo@lankraft.ru&USER_HASH=1dc1444b0w6172c1117ffea9078c575c"|cut -d "|" -f1)});

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

Стоит разобрать линк подробнее.

  1. lankraft.amocrm.ru/private/acceptors/asterisk_new? – название поддомена (lankraft.ru) в amocrm.
  2. USER_LOGIN=ceo@lankraft.ru – учетная запись amoCRM.
  3. USER_HASH=1dc1444b0w6172c1119597ffea9078c575c – API Key amoCRM (Настройки >> API).

Переходим к системному внутреннему номеру 9898. Посмотрим, как он выглядит.

// кому позвонить - решит amoCRM.
9898 => {
	Set(DEFMAN=123); // по умолчанию звоним на 123
	Set(TOEXT=${SHELL(wget -O - --quiet "https://lankraftru.amocrm.ru/private/acceptors/asterisk_new/?redirect=Y&number=${CALLERID(num)}&USER_LOGIN=ceo@lankraft.ru&USER_HASH=1dc1444b0d3172c1113ffea9078c575c")}); // получаем номер ответственного менеджера
	Dial(SIP/${TOEXT},,tTr); // звоним ответственному менеджеру, а если он не отвечает или возникает ошибка, звоним на номер по умолчанию (123)
	if ("${DIALSTSTUS}" != "ANSWERED") {
		Dial(SIP/${DEFMAN},,tTr);
	}
	HangUP();
}

Также рекомендуем добавить в таблицу CDR дополнительное поле. Благодаря этому можно будет прослушивать переговоры в клиентской карточке с помощью amoCRM.

ALTER TABLE `cdr` ADD `recordingfile` VARCHAR (120) NOT NULL

Можно еще добавить пару команд.

Настраиваем amoCRM

Начнем с подключения Asterisk в интерфейсе amoCRM.

Заходим в «Настройки», где найдем пункт «Интеграции», содержащий Asterisk. Выполним его установку.

Пролистываем вниз текст, пока не доберемся до полей, в которые требуется ввести информацию.

Для поля Login используем amocrm (из manager.conf)

Для пароля берем Qwerty!23456 (из manager.conf).

Указываем расположение скрипта: https://asterisk.lankraft.ru/amocrm.php

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

Теперь следует разобраться с настройкой amocrm.php.

amocrm.php

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

Тестирование полученной связки

После настройки параметров у нас будут такие фичи:

  • показ входящего вызова в amoCRM (при наличии контакта в базе выводятся имя и фамилия звонящего, так что можно открыть для проверки соответствующую карточку или создать ее одним щелчком, если таковая отсутствует);
  • демонстрация ФИО клиента из amoCRM на телефонном аппарате сотрудника фирмы во время входящего вызова;
  • возможность сделать звонок прямо из amoCRM в два клика;
  • переадресация звонков сотруднику, отвечающему за работу с клиентом, который находится на линии.

На этом интеграция IP-АТС Asterisk с amoCRM завершена.