Integracija Asteriska i Bitrix24

Integracija Asteriska i Bitrix24
Mreža ima različite opcije za integraciju IP-PBX Asterisk i CRM Bitrix24, ali mi smo ipak odlučili napisati svoju.

Funkcionalno, sve je standardno:

  • Klikom na poveznicu s telefonskim brojem klijenta u Bitrix24, Asterisk povezuje interni broj korisnika u čije ime je izvršen ovaj klik s telefonskim brojem klijenta. U Bitrix24 se snima zapis poziva, a na kraju poziva se povlači zapis razgovora.
  • Poziv stiže u Asterisk izvana - u sučelju Bitrix24 prikazujemo karticu klijenta zaposleniku na čiji je broj stigao ovaj poziv.
    Ako takvog klijenta nema, otvorite karticu za kreiranje novog potencijalnog klijenta.
    Čim se poziv završi, to odražavamo na kartici i povlačimo snimku razgovora.

Pod rezom, reći ću vam kako sve postaviti za sebe i dati vezu na github - da, da, uzmite i koristite!

Opći opis

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

Korištene tehnologije i usluge

  • PHP 5.6
  • PHP AMI biblioteka
  • kompozitor
  • nginx + php fpm
  • nadzornik
  • AMI (Asterisk Manager sučelje)
  • Bitrix webhooks (pojednostavljena implementacija REST API-ja)

predpodešavanje

Na server sa Asterisk-om potrebno je instalirati web server (imamo nginx + php-fpm), supervisor i git.

Instalacijska naredba (CentOS):

yum install nginx php-fpm supervisor git

Prosljeđujemo direktorij dostupan web poslužitelju, povlačimo aplikaciju iz git-a i postavljamo potrebna prava na mapu:


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

Zatim konfigurirajte nginx, u kojem 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, sigurnosna pitanja, dobivanje certifikata, pa čak i odabir web poslužitelja ostavit ću izvan okvira članka - o tome je puno napisano. Aplikacija nema ograničenja, radi i na http i https.

Imamo https, šifrirajmo certifikat.

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

Integracija Asteriska i Bitrix24

Postavljanje Bitrix24

Kreirajmo dva webhooka.

Dolazni webhook.

Pod administratorskim računom (s ID-om 1) idite stazom: Aplikacije -> Web-dojavice -> Dodaj web-dojavnik -> Dolazni web-dojavnik

Integracija Asteriska i Bitrix24

Ispunite parametre dolaznog webhooka kao na snimkama zaslona:

Integracija Asteriska i Bitrix24

Integracija Asteriska i Bitrix24

I kliknite spremi.

Nakon spremanja, Bitrix24 će pružiti URL dolaznog webhooka, na primjer:

Integracija Asteriska i Bitrix24

Spremite svoju verziju URL-a bez /profila/ na kraju - koristit će se u aplikaciji za rad s dolaznim pozivima.

imam to https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Odlazni webhook.

Aplikacije -> Webhooks -> Dodaj webhook -> Odlazni webhook

Detalji su na snimkama zaslona:

Integracija Asteriska i Bitrix24

Integracija Asteriska i Bitrix24

Spremite i preuzmite autorizacijski kod

Integracija Asteriska i Bitrix24

imam to xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Također ga trebate kopirati sebi, potreban je za odlazne pozive.

Važno!

Ssl certifikat mora biti konfiguriran na Bitrix24 poslužitelju (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 biti navedena adresa dostupna s interneta!

I za kraj, instalirajmo naš CallMeOut kao aplikaciju za telefoniranje (tako da klikom na broj na PBX-u poleti naredba za uspostavu poziva).

U izborniku odaberite: Više -> Telefonija -> Više -> Postavke, stavite u "Broj za odlazne pozive prema zadanim postavkama" Aplikacija: CallMeOut i kliknite na "Spremi"

Integracija Asteriska i Bitrix24

postavljanje zvjezdice

Za uspješnu interakciju između Asteriska 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 koje će trebati implementirati pomoću dialplana (imamo extensions.ael).

Citirat ću cijelu datoteku, 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});
}

};

Krenimo od početka: direktiva globals.

Promjenjiva URLRECORDS pohranjuje URL na datoteke snimanja razgovora, prema kojima će ih Bitrix24 povući u karticu kontakta.

Zatim nas zanima makro makro snimanje.

Ovdje ćemo osim snimanja razgovora postaviti varijablu Puno ime.

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

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

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, prvo što dobijemo ovdje:

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

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

Dalje

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

bilježimo tko 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 tablici CDR za ovaj lokal (ondje nije potreban), postavite vrijeme završetka poziva, izračunajte trajanje, ako rezultat poziva nije poznat - postavite (varijabla Zovite me DISPOZICIJA) i, posljednji korak, pošaljite sve na Bitrix kroz curl sustava.

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

Ona kaže instalirati PBX ID pozivatelja (ime) varijabla CallMeCallerIDName.

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

Postavljanje aplikacije

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

Opis parametara aplikacije:

  • CallMeDEBUG - ako je 1, tada će se svi događaji koje aplikacija obradi zapisati u log datoteku, 0 - ne pišemo ništa
  • tech SIP/PJSIP/IAX/itd
  • authToken — Bitrix24 autorizacijski token, autorizacijski kod za odlazni webhook
  • bitrixApiUrl — URL dolaznog webhooka, bez profila/
  • proširenja — popis vanjskih brojeva
  • kontekst — kontekst za pokretanje poziva
  • slušatelj_timeout - brzina obrade događaja od zvjezdice
  • zvjezdica - niz s postavkama veze do zvjezdice:
  • domaćin - ip ili naziv hosta poslužitelja sa zvjezdicom
  • shema — dijagram povezivanja (tcp://, tls://)
  • luka - luka
  • korisničko ime - Korisničko ime
  • tajna - lozinka
  • povezivanje_timeout - vrijeme povezanosti je isteklo
  • istek_čitanja - vrijeme čekanja za čitanje

primjer datoteke 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 rukovatelja događajima Asterisk CallMeIn.php, koji prati dolazne pozive i komunicira s Bitrix24 (pokaži karticu, sakrij karticu itd.).

Datoteka postavki za izradu:

/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 prijave:

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

Zaključak

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

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

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

Izvor: www.habr.com

Dodajte komentar