Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24
Π’ сСти Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ IP-АВБ Asterisk ΠΈ CRM Битрикс24, Π½ΠΎ ΠΌΡ‹, всС Ρ‚Π°ΠΊΠΈ, Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свою.

По Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ всС стандартно:

  • Кликом Π½Π° ссылку с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² Битрикс24, Asterisk соСдиняСт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ это ΠΊΠ»ΠΈΠΊ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½, с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. 
В Битрикс24 фиксируСтся запись ΠΎ Π·Π²ΠΎΠ½ΠΊΠ΅ ΠΈ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° подтягиваСтся запись Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°.
  • На Asterisk поступаСт Π·Π²ΠΎΠ½ΠΎΠΊ ΠΈΠ·Π²Π½Π΅ β€” Π² интСрфСйсС Битрикс24 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚ΠΎΠΌΡƒ сотруднику, Π½Π° Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ этот Π·Π²ΠΎΠ½ΠΎΠΊ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π».
    Если Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π΅Ρ‚, ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ Π»ΠΈΠ΄Π°.
    Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π²ΠΎΠ½ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½, ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅ΠΌ это Π² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈ подтягиваСм запись Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°.

Под ΠΊΠ°Ρ‚ΠΎΠΌ расскаТу ΠΊΠ°ΠΊ всС Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρƒ сСбя ΠΈ Π΄Π°ΠΌ Π»ΠΈΠ½ΠΊ Π½Π° github β€” Π΄Π°-Π΄Π°, Π·Π°Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ!

ΠžΠ±Ρ‰Π΅Π΅ описаниС

Бвою ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ ΠΌΡ‹ Π½Π°Π·Π²Π°Π»ΠΈ CallMe. CallMe β€” это нСбольшоС Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, написанноС Π½Π° PHP.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ сСрвисы

  • PHP 5.6
  • PHP AMI-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
  • Composer
  • Nginx + php-fpm
  • supervisor
  • AMI (Asterisk Manager Interface)
  • Π’Π΅Π±Ρ…ΡƒΠΊΠΈ Bitrix (упрощСнная рСализация REST API)

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка

На сСрвСрС с Asterisk Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ web-сСрвСр (Ρƒ нас это nginx+php-fpm), supervisor ΠΈ git.

Команда для установки (CentOS):

yum install nginx php-fpm supervisor git

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π²Π΅Π±-сСрвСру, тянСм ΠΈΠ· Π³ΠΈΡ‚Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ выставляСм Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° Π½Π° ΠΏΠ°ΠΏΠΊΡƒ:


cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/

Π”Π°Π»Π΅Π΅ настроим nginx, наш ΠΊΠΎΠ½Ρ„ΠΈΠ³ размСстился Π²

/etc/nginx/conf.d/pbx.vistep.ru.conf

server {
	server_name www.pbx.vistep.ru pbx.vistep.ru;
	listen *:80;
	rewrite ^  https://pbx.vistep.ru$request_uri? permanent;
}

server {
#        listen *:80;
#	server_name pbx.vistep.ru;


	access_log /var/log/nginx/pbx.vistep.ru.access.log main;
        error_log /var/log/nginx/pbx.vistep.ru.error.log;

    listen 443 ssl http2;
    server_name pbx.vistep.ru;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/pbx.vistep.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ru/privkey.pem;
    ssl_dhparam /etc/nginx/certs/dhparam.pem;
    ssl_session_timeout 24h;
    ssl_session_cache shared:SSL:2m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000;";
    add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
	
	root /var/www/callme;
	index  index.php;
        location ~ /. {
                deny all; # Π·Π°ΠΏΡ€Π΅Ρ‚ для скрытых Ρ„Π°ΠΉΠ»ΠΎΠ²
        }

        location ~* /(?:uploads|files)/.*.php$ {
                deny all; # Π·Π°ΠΏΡ€Π΅Ρ‚ для Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… скриптов
        }

        location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
                expires max; # ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ статики
        }

	location ~ .php {
		root /var/www/callme;
		index  index.php;
		fastcgi_pass unix:/run/php/php5.6-fpm.sock;
	#	fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
		}
}

Π Π°Π·Π±ΠΎΡ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°, вопросы бСзопасности, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сСртификата ΠΈ Π΄Π°ΠΆΠ΅ Π²Ρ‹Π±ΠΎΡ€ web-сСрвСра я ΠΎΡΡ‚Π°Π²Π»ΡŽ Π·Π° Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” ΠΎΠ± этом ΠΌΠ½ΠΎΠ³ΠΎ написано. Π£ прилоТСния Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΏΠΎ http ΠΈ ΠΏΠΎ https.

Π£ нас β€” https, сСртификат let’s encrypt.

Если Π²Ρ‹ всС сдСлали ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚ΠΎ пСрСйдя ΠΏΠΎ ссылкС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Настройка Битрикс24

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄Π²Π° Π²Π΅Π±Ρ…ΡƒΠΊΠ°.

Входящий Π²Π΅Π±Ρ…ΡƒΠΊ.

Под ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записью администратора (с id 1) ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ: ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ -> Π’Π΅Π±Ρ…ΡƒΠΊΠΈ -> Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π΅Π±Ρ…ΡƒΠΊ -> Входящий Π²Π΅Π±Ρ…ΡƒΠΊ

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

ЗаполняСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ входящСго Π²Π΅Π±Ρ…ΡƒΠΊΠ° ΠΊΠ°ΠΊ Π½Π° скринах:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

И ΠΆΠΌΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ.

ПослС сохранСния Битрикс24 прСдоставит URL входящСго Π²Π΅Π±Ρ…ΡƒΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ сСбС ваш Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ URL Π±Π΅Π· Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ /profile/ β€” ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с входящими Π·Π²ΠΎΠ½ΠΊΠ°ΠΌΠΈ.

Π£ мСня это https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Π˜ΡΡ…ΠΎΠ΄ΡΡ‰ΠΈΠΉ Π²Π΅Π±Ρ…ΡƒΠΊ.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ -> Π’Π΅Π±Ρ…ΡƒΠΊΠΈ -> Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Π΅Π±Ρ…ΡƒΠΊ -> Π˜ΡΡ…ΠΎΠ΄ΡΡ‰ΠΈΠΉ Π²Π΅Π±Ρ…ΡƒΠΊ

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ снова Π½Π° скринах:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

БохраняСм ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Π£ мСня это xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Π•Π³ΠΎ Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСбС, ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ исходящих Π·Π²ΠΎΠ½ΠΊΠΎΠ².

Π’Π°ΠΆΠ½ΠΎ!

На сСрвСрС Битрикс24 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ настроСн ssl-сСртификат (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ letsencrypt), ΠΈΠ½Π°Ρ‡Π΅ api битрикса Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Если Ρƒ вас облачная вСрсия, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π²ΠΎΠ»Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ β€” Ρ‚Π°ΠΌ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ssl.

Π’Π°ΠΆΠ½ΠΎ!

Π’ ΠΏΠΎΠ»Π΅ «АдрСс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Β» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ доступный ΠΈΠ· сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ адрСс!

И послСдним ΡˆΡ‚Ρ€ΠΈΡ…ΠΎΠΌ установим наш CallMeOut Π² качСствС прилоТСния для ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π²ΠΎΠ½ΠΊΠΎΠ² (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ Π½Π° Π½ΠΎΠΌΠ΅Ρ€ Π½Π° АВБ ΡƒΠ»Π΅Ρ‚Π°Π»Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° для ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π²ΠΎΠ½ΠΊΠ°).

Π’ мСню Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ: Π•Ρ‰Π΅ -> ВСлСфония -> Π•Ρ‰Π΅ -> Настройки, ставим Π² «НомСр для исходящСго Π·Π²ΠΎΠ½ΠΊΠ° ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: CallMeOut ΠΈ ΠΆΠΌΠ΅ΠΌ Β«Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒΒ»

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Asterisk ΠΈ Битрикс24

Настройка asterisk

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ взаимодСйствия Asterisk ΠΈ Bitrix24 Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ AMI-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ callme Π² manager.conf:

[callme]
secret = JD3clEB8_f23r-3ry84gJ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
permit= 10.100.111.249/255.255.255.255
permit = 192.168.254.0/255.255.255.0
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

Π”Π°Π»Π΅Π΅ Π΅ΡΡ‚ΡŒ нСсколько хитростСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ потрСбуСтся Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ посрСдствам dialplan (Ρƒ нас это extensions.ael).

ΠŸΡ€ΠΈΠ²ΠΎΠΆΡƒ вСсь Ρ„Π°ΠΉΠ», Π° послС Π΄Π°ΠΌ пояснСния:

globals {
    WAV=/var/www/pbx.vistep.ru/callme/records/wav; //Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с WAV
    MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //ΠšΡƒΠ΄Π° Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ mp3 Ρ„Π°ΠΉΠ»Ρ‹
    URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
    RECORDING=1; // Π—Π°ΠΏΠΈΡΡŒ, 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 ${MP3}/${datedir});
	      System(mkdir -p ${WAV}/${datedir});
              Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${datedir}/${fname}.wav"  "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
	      Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
              Set(CDR(filename)=${fname}.mp3);
	      Set(CDR(recordingfile)=${fname}.wav);
              Set(CDR(realdst)=${called});
              MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});

       };
};


context incoming {
888999 => {
	&recording(${CALLERID(number)},${EXTEN});
        Answer();
        ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // выставляСм CallerID Ссли ΡƒΠ·Π½Π°Π»ΠΈ Π΅Π³ΠΎ Ρƒ Битрикс24
        Set(CallStart=${STRFTIME(epoch,,%s)});  
        Queue(Q1,tT);
        Set(CallMeDISPOSITION=${CDR(disposition)}); 
        Hangup();
        }

h => {
    Set(CDR_PROP(disable)=true); 
    Set(CallStop=${STRFTIME(epoch,,%s)}); 
    Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); 
    ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===));  
}

}


context default {

_X. => {
        Hangup();
        }
};


context dial_out {

_[1237]XX => {
	&recording(${CALLERID(number)},${EXTEN});
        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});
        Dial(SIP/${EXTEN},,tTr);
        Hangup();
        }

_11XXX => {
	&recording(${CALLERID(number)},${EXTEN});
	Set(CallStart=${STRFTIME(epoch,,%s)});
	Set(__CallIntNum=${CALLERID(num)});
        Dial(SIP/${EXTEN:2}@toOurAster,,t);
        Hangup();
        }

_. => {
	&recording(${CALLERID(number)},${EXTEN});
        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});
	Dial(SIP/${EXTEN}@toOurAster,,t);
	Hangup();
        }

h => {
        Set(CDR_PROP(disable)=true);
        Set(CallStop=${STRFTIME(epoch,,%s)});
        Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
	if(${ISNULL(${CallMeDISPOSITION})}) {
          Set(CallMeDISPOSITION=${CDR(disposition)});
        }
	System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

};

НачнСм с самого Π½Π°Ρ‡Π°Π»Π°: Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° globals.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ URLRECORDS Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² сСбС URL ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ записСй Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΎΠ², ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Bitrix24 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡ… ΠΏΠΎΠ΄Ρ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°.

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ интСрСсСн макрос макрос recording.

Π—Π΄Π΅ΡΡŒ, ΠΏΠΎΠΌΠΈΠΌΠΎ записи Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΎΠ², ΠΌΡ‹ установим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ FullFname.

Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);

Она Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ URL ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ (макрос вызываСтся Π²Π΅Π·Π΄Π΅).

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ исходящий Π·Π²ΠΎΠ½ΠΎΠΊ:

_. => {
	&recording(${CALLERID(number)},${EXTEN});
        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});
	Dial(SIP/${EXTEN}@toOurAster,,t);
	Hangup();
        }

h => {
        Set(CDR_PROP(disable)=true);
        Set(CallStop=${STRFTIME(epoch,,%s)});
        Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
	if(${ISNULL(${CallMeDISPOSITION})}) {
          Set(CallMeDISPOSITION=${CDR(disposition)});
        }
	System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

Допустим ΠΌΡ‹ Π·Π²ΠΎΠ½ΠΈΠΌ Π½Π° 89991234567, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ сюда:

&recording(${CALLERID(number)},${EXTEN});

Ρ‚.Π΅. вызываСтся макрос записи Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π”Π°Π»Π΅Π΅

        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});

записываСм ΠΊΡ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» Π·Π²ΠΎΠ½ΠΎΠΊ ΠΈ фиксируСм врСмя старта Π·Π²ΠΎΠ½ΠΊΠ°.

И ΠΏΠΎ Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ, Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ контСкстС h

h => {
        Set(CDR_PROP(disable)=true);
        Set(CallStop=${STRFTIME(epoch,,%s)});
        Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
	if(${ISNULL(${CallMeDISPOSITION})}) {
          Set(CallMeDISPOSITION=${CDR(disposition)});
        }
	System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ CDR для этого ΡΠΊΡΡ‚Π΅Π½ΡˆΠ΅Π½Π° (Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ½ΠΎ Ρ‚Π°ΠΌ), выставляСм врСмя Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π²ΠΎΠ½ΠΊΠ°, вычисляСм ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π·Π²ΠΎΠ½ΠΊΠ° Π½Π΅ извСстСн β€” ставим (пСрСмСнная CallMeDISPOSITION) ΠΈ, послСдним шагом, шлСм всС битриксу Ρ‡Π΅Ρ€Π΅Π· систСмный curl.

И Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π³ΠΈΠΈ β€” входящий Π·Π²ΠΎΠ½ΠΎΠΊ:

888999 => {
	&recording(${CALLERID(number)},${EXTEN});
        Answer();
        ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // выставляСм CallerID Ссли ΡƒΠ·Π½Π°Π»ΠΈ Π΅Π³ΠΎ Ρƒ Битрикс24
        Set(CallStart=${STRFTIME(epoch,,%s)}); // Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ отсчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π²ΠΎΠ½ΠΊΠ°
        Queue(Q1,tT);
        Set(CallMeDISPOSITION=${CDR(disposition)}); 
        Hangup();
        }

Π—Π΄Π΅ΡΡŒ нас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° строка.

ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());

Она Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ АВБ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ CallerID(name) Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CallMeCallerIDName.

Π‘Π°ΠΌΠ° пСрСмСнная CallMeCallerIDName, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, устанавливаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ CallMe (Ссли Π² Bitrix24 Π΅ΡΡ‚ΡŒ ЀИО для Π½ΠΎΠΌΠ΅Ρ€Π° позвонившСго β€” установим Π² качСствС CallerID(name), Π½Π΅Ρ‚ β€” Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ).

Настройка прилоТСния

Π€Π°ΠΉΠ» настроСк прилоТСния β€” /var/www/pbx.vistep.ru/config.php

ОписаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² прилоТСния:

  • CallMeDEBUG β€” Ссли 1, Ρ‚ΠΎ Π² Π»ΠΎΠ³ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ всС события, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, 0 β€” Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ пишСм
  • tech β€” SIP/PJSIP/IAX/etc
  • authToken β€” Ρ‚ΠΎΠΊΠ΅Π½ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ битрикс24, ΠΊΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ исходящСго Π²Π΅Π±Ρ…ΡƒΠΊΠ°
  • bitrixApiUrl β€” URL входящСго Π²Π΅Π±Ρ…ΡƒΠΊΠ°, Π±Π΅Π· profile/
  • extentions β€” список Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ²
  • context β€” контСкст для ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π²ΠΎΠ½ΠΊΠ°
  • listener_timeout β€” ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий ΠΎΡ‚ asterisk
  • asterisk β€” массив с настройками ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ астСриску:
  • host β€” ip ΠΈΠ»ΠΈ hostname сСрвСра астСриск
  • scheme β€” схСма ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (tcp://, tls://)
  • port β€” ΠΏΠΎΡ€Ρ‚
  • username β€” имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • secret β€” ΠΏΠ°Ρ€ΠΎΠ»ΡŒ
  • connect_timeout β€” Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
  • read_timeout β€” Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ чтСния

ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° настроСк:

 <?php
return array(

        'CallMeDEBUG' => 1, // Π΄Π΅Π±Π°Π³ сообщСния Π² Π»ΠΎΠ³Π΅: 1 - пишСм, 0 - Π½Π΅ пишСм
        'tech' => 'SIP',
        'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', //Ρ‚ΠΎΠΊΠ΅Π½ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ битрикса
        'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', //url ΠΊ api битрикса (входящий Π²Π΅Π±Ρ…ΡƒΠΊ)
        'extentions' => array('888999'), // список Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ², Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ
        'context' => 'dial_out', //исходящий контСкст для ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π²ΠΎΠ½ΠΊΠ°
        'asterisk' => array( // настройки для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ астСриску
                    'host' => '10.100.111.249',
                    'scheme' => 'tcp://',
                    'port' => 5038,
                    'username' => 'callme',
                    'secret' => 'JD3clEB8_f23r-3ry84gJ',
                    'connect_timeout' => 10000,
                    'read_timeout' => 10000
                ),
        'listener_timeout' => 300, //ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий ΠΎΡ‚ asterisk

);

Настройка supervisor

Supervisor слуТит для запуска процСсса-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий ΠΎΡ‚ Asterisk CallMeIn.php, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отслСТиваСт входящиС Π·Π²ΠΎΠ½ΠΊΠΈ ΠΈ взаимодСйствуСт с Битрикс24 (ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ, ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ Ρ‚.Π΄.).

Π€Π°ΠΉΠ» настроСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ:

/etc/supervisord.d/callme.conf

[program:callme]
command=/usr/bin/php CallMeIn.php
directory=/var/www/pbx.vistep.ru
autostart=true
autorestart=true
startretries=5
stderr_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
stdout_logfile=/var/www/pbx.vistep.ru/logs/daemon.log

Запуск ΠΈ рСстарт прилоТСния:

supervisorctl start callme
supervisorctl restart callme

просмотр статуса Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния:

supervisorctl status callme
callme                           RUNNING   pid 11729, uptime 17 days, 16:58:07

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ достаточно слоТно, Π½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½ β€” ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ администратор сумССт Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Ρƒ сСбя ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ своих ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Как ΠΎΠ±Π΅Ρ‰Π°Π», Π»ΠΈΠ½ΠΊ Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±.

Вопросы, поТСлания β€” ΠΏΡ€ΠΎΡˆΡƒ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Ρ‹. Π’Π°ΠΊΠΆΠ΅ Ссли интСрСсно ΠΊΠ°ΠΊ шла Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° этой ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅, Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ всС Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ