Integracija Asterisk i Bitrix24

Integracija Asterisk i Bitrix24
Mreža ima različite opcije za integraciju IP-PBX Asterisk i CRM Bitrix24, ali smo ipak odlučili da napišemo svoju.

Funkcionalno, sve je standardno:

  • Klikom na link sa telefonskim brojem klijenta u Bitrix24, Asterisk povezuje interni broj korisnika u čije ime je ovaj klik napravljen sa telefonskim brojem klijenta. U Bitrix24 se snima zapis o razgovoru, a na kraju razgovora se povlači zapis razgovora.
  • Asterisk stiže poziv spolja - u Bitrix24 interfejsu pokazujemo klijentsku karticu zaposleniku na čiji je poziv stigao.
    Ako takvog klijenta nema, otvorite karticu za kreiranje novog potencijalnog klijenta.
    Čim se poziv završi, to odražavamo na kartici i izvlačimo snimak razgovora.

Ispod reza ću vam reći kako sve sami podesiti i dati link na github - da, da, uzmi i koristi!

Opšti opis

Našu integraciju smo nazvali CallMe. CallMe je mala web aplikacija napisana u PHP-u.

Korišćene tehnologije i usluge

  • PHP 5.6
  • PHP AMI biblioteka
  • kompozitor
  • nginx + php fpm
  • supervizor
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (pojednostavljena implementacija REST API-ja)

unapred podešavanje

Na serveru sa Asterisk-om potrebno je da instalirate web server (imamo nginx + php-fpm), supervizor i git.

Naredba za instalaciju (CentOS):

yum install nginx php-fpm supervisor git

Prosljeđujemo direktorij dostupan web serveru, izvlačimo aplikaciju iz git-a i postavljamo potrebna prava na folder:


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

Zatim konfigurišite nginx, u kojoj se nalazi naša konfiguracija

/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;
		}
}

Analizu konfiguracije, sigurnosne probleme, dobijanje sertifikata, pa čak i odabir web servera ostaviću van okvira članka - o tome je dosta pisano. Aplikacija nema ograničenja, radi i na http i https.

Imamo https, šifrirajmo certifikat.

Ako ste sve uradili kako treba, onda bi klikom na link trebali vidjeti ovako nešto

Integracija Asterisk i Bitrix24

Postavljanje Bitrix24

Kreirajmo dva webhooka.

Dolazni webhook.

Pod administratorskim nalogom (sa ID-om 1) idite putem: Applications -> Webhooks -> Add webhook -> Incoming webhook

Integracija Asterisk i Bitrix24

Popunite parametre dolaznog webhooka kao na snimcima ekrana:

Integracija Asterisk i Bitrix24

Integracija Asterisk i Bitrix24

I kliknite na sačuvaj.

Nakon spremanja, Bitrix24 će dati URL dolaznog webhooka, na primjer:

Integracija Asterisk i Bitrix24

Sačuvajte svoju verziju URL-a bez završnog /profila/ - koristit će se u aplikaciji za rad sa dolaznim pozivima.

Imam ga https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Odlazni webhook.

Applications -> Webhooks -> Add Webhook -> Outgoing Webhook

Detalji su na snimcima ekrana:

Integracija Asterisk i Bitrix24

Integracija Asterisk i Bitrix24

Sačuvajte i preuzmite autorizacijski kod

Integracija Asterisk i Bitrix24

Imam ga xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Takođe ga morate kopirati na sebe, potrebno je za odlazne pozive.

Važno!

Ssl sertifikat mora biti konfigurisan na Bitrix24 serveru (možete koristiti letsencrypt), inače BitrixXNUMX API neće raditi. Ako imate verziju u oblaku, ne brinite - ssl je već tu.

Važno!

U polju "Adresa procesora" mora se navesti adresa dostupna sa Interneta!

I sa završnim dodirom, instalirajmo naš CallMeOut kao aplikaciju za pozivanje (tako da će klikom na broj na PBX-u poletjeti komanda za upućivanje poziva).

U meniju odaberite: Više -> Telefonija -> Više -> Postavke, postavite na "Broj za odlazne pozive prema zadanim postavkama" Aplikacija: CallMeOut i kliknite "Sačuvaj"

Integracija Asterisk i Bitrix24

podešavanje zvjezdice

Za uspješnu interakciju između Asterisk i Bitrix24, moramo dodati callme AMI korisnika u 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

Zatim, postoji nekoliko trikova koji će se morati implementirati pomoću dialplan-a (imamo extensions.ael).

Citirat ću cijeli fajl, a zatim ću dati objašnjenja:

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});
}

};

Počnimo od početka: direktiva globalima.

Promjenjivo URLRECORDS pohranjuje URL datoteka za snimanje razgovora, prema kojem će ih Bitrix24 povući u kontakt karticu.

Zatim nas zanima makro makro snimanje.

Ovdje ćemo pored snimanja razgovora postaviti varijablu Puno ime.

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

Pohranjuje puni URL u određenu datoteku (makro se poziva posvuda).

Analizirajmo odlazni poziv:

_. => {
	&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});
}

Recimo da nazovemo 89991234567, prva stvar koju dobijemo ovdje:

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

one. poziva se makro za snimanje poziva i postavljaju se potrebne varijable.

dalje

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

snimamo ko je inicirao poziv i bilježimo vrijeme početka poziva.

I po njegovom završetku, u posebnom kontekstu 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});
}

isključite unos u CDR tablici za ovaj lokal (tamo nije potreban), postavite vrijeme završetka poziva, izračunajte trajanje, ako rezultat poziva nije poznat - postavite (varijabilna Zovite me DISPOSITION) i, posljednji korak, pošaljite sve u Bitrix kroz sistemski curl.

I još malo magije - dolazni poziv:

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();
        }

Ovdje nas zanima samo jedna linija.

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

Kaže da instaliram PBX ID pozivaoca (ime) varijabla CallMeCallerIDName.

Samu varijablu CallMeCallerIDName, pak, postavlja CallMe aplikacija (ako Bitrix24 ima puno ime za broj pozivaoca, mi ćemo ga postaviti kao ID pozivaoca (ime), ne - nećemo ništa učiniti).

Podešavanje aplikacije

Datoteka postavki aplikacije - /var/www/pbx.vistep.ru/config.php

Opis parametara aplikacije:

  • CallMeDEBUG - ako je 1, tada će svi događaji koje obrađuje aplikacija biti upisani u datoteku dnevnika, 0 - ne upisujemo ništa
  • tech SIP/PJSIP/IAX/itd
  • authToken — Bitrix24 token autorizacije, odlazni webhook autorizacijski kod
  • bitrixApiUrl — URL dolaznog webhooka, bez profila/
  • ekstenzije — lista eksternih brojeva
  • kontekst — kontekst za pokretanje poziva
  • listener_timeout - brzina obrade događaja iz zvjezdice
  • asterisk - niz sa postavkama veze sa zvjezdicom:
  • domaćin - ip ili ime hosta servera asterisk
  • šema — dijagram povezivanja (tcp://, tls://)
  • luka - luka
  • korisničko ime - Korisničko ime
  • tajna - lozinka
  • connect_timeout - vremensko ograničenje veze
  • read_timeout - istek vremena za čitanje

primjer fajla postavki:

 <?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

);

Postavljanje nadzornika

Supervizor se koristi za pokretanje procesa obrade događaja Asterisk CallMeIn.php, koji prati dolazne pozive i komunicira sa Bitrix24 (prikaži karticu, sakrij karticu, itd.).

Datoteka postavki za kreiranje:

/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

Pokretanje i ponovno pokretanje aplikacije:

supervisorctl start callme
supervisorctl restart callme

pogledajte status aplikacije:

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

zaključak

Ispalo je prilično teško, ali sam siguran da će iskusni administrator moći implementirati i zadovoljiti svoje korisnike.

Kao što je obećano, link na github.

Pitanja, prijedlozi - molimo u komentarima. Također, ako vas zanima kako je tekao razvoj ove integracije, napišite, a u sljedećem članku pokušat ću sve detaljnije otkriti.

izvor: www.habr.com

Dodajte komentar