
Különböző lehetőségek vannak az IP-PBX Asterisk és a CRM Bitrix24 integrálására a hálózaton, de mégis úgy döntöttünk, hogy megírjuk a sajátunkat.
A funkcionalitás szempontjából minden szabványos:
- A Bitrix24-ben az ügyfél telefonszámát tartalmazó hivatkozásra kattintva az Asterisk összekapcsolja annak a felhasználónak a belső számát, akinek nevében a kattintás történt, az ügyfél telefonszámával. A Bitrix24-ben rögzítésre kerül a hívás rögzítése, majd a hívás végén előkerül a beszélgetés felvétele.
- Az Asterisk hívást kap kívülről - a Bitrix24 felületén megmutatjuk az ügyfélkártyát annak a munkatársnak, akinek a számára ez a hívás érkezett.
Ha nincs ilyen ügyfél, akkor megnyitjuk a kártyát új lead létrehozására.
Amint a hívás befejeződött, ezt tükrözzük a kártyán, és elővesszük a beszélgetés felvételét.
A vágás alatt elmondom, hogyan állíts be mindent magadnak, és adok egy linket a githubhoz – igen, igen, vedd és használd!
Általános leírás
Integrációnkat CallMe-nek hívtuk. A CallMe egy PHP nyelven írt kis webalkalmazás.
Az alkalmazott technológiák és szolgáltatások
- PHP 5.6
- Összeállít
- Nginx + php-fpm
- felügyelő
- AMI (Asterisk Manager Interface)
- Bitrix webhooks (egyszerűsített REST API megvalósítás)
előbeállítás
Az Asterisk-kel rendelkező szerveren telepíteni kell egy webszervert (nálunk ez nginx+php-fpm), felügyelőt és git-et.
Telepítési parancs (CentOS):
yum install nginx php-fpm supervisor gitMegyünk a webszerver számára elérhető könyvtárba, lehúzzuk az alkalmazást a Gitből, és beállítjuk a szükséges jogokat a mappához:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Ezután állítsuk be az nginx-et, a konfigurációnk itt található
/etc/nginx/conf.d/pbx.vistep.ru.confserver {
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;
}
}
A konfig elemzését, a biztonsági kérdéseket, a tanúsítvány megszerzését és még a webszerver kiválasztását is a cikk keretein kívül hagyom - erről sokat írtak. Az alkalmazásnak nincsenek korlátozásai, http és https protokollon is működik.
https-t használunk, titkosítsuk a tanúsítványt.
Ha mindent helyesen csinált, akkor a linkre kattintva valami ilyesmit kell látnia

A Bitrix24 konfigurálása
Hozzunk létre két webhookot.
Bejövő webhook.
A rendszergazdai fiók alatt (1-es azonosítóval) kövesse az alábbi elérési utat: Alkalmazások -> Webhooks -> Webhook hozzáadása -> Bejövő webhook

Töltse ki a bejövő webhook paramétereit a képernyőképek szerint:


És kattintson a Mentés gombra.
Mentés után a Bitrix24 megadja a bejövő webhook URL-jét, például:

Mentse el az URL saját verzióját a végső /profil/ nélkül – az alkalmazás a bejövő hívások kezelésére fogja használni.
nekem ez megvan https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Kimenő webhook.
Alkalmazások -> Webhook -> Webhook hozzáadása -> Kimenő webhook
A részletek ismét a képernyőképeken:


Mentse el és kapja meg az engedélyezési kódot

nekem ez megvan xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Azt is le kell másolnia magának, kimenő hívások indításához szüksége van rá.
Fontos!
A Bitrix24 szerveren SSL-tanúsítványt kell beállítani (használhatja a letsencryptet), különben a Bitrix api nem fog működni. Ha felhőverzióval rendelkezik, ne aggódjon – már van ssl.
Fontos!
A „Processzor címe” mezőben az internetről elérhető címet kell tartalmaznia!
Utolsó simításként pedig telepítsük a CallMeOut-ot híváskezdeményező alkalmazásként (hogy az alközponton a számra kattintva elrepüljön a hívásindítás parancsa).
A menüben válassza a következőket: Egyebek -> Telefonálás -> Továbbiak -> Beállítások, állítsa be az „Alapértelmezett kimenő hívási szám” menüpontban Alkalmazás: CallMeOut, majd kattintson a „Mentés” gombra.

A csillag beállítása
Az Asterisk és a Bitrix24 közötti sikeres interakció érdekében hozzá kell adnunk az AMI callme felhasználót a manager.conf fájlhoz:
[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
Ezután számos trükköt kell megvalósítani a dialplan segítségével (nálunk ez az extensions.ael).
Megadom a teljes fájlt, majd adok magyarázatot:
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});
}
};
Kezdjük az elejétől: az irányelv globals.
Változó URLRECORDS eltárolja a beszélgetésrögzítési fájlok URL-jét, amely szerint a Bitrix24 behúzza azokat a névjegykártyába.
Ezután a makró makró érdekel minket felvétel.
Itt a beszélgetések rögzítése mellett a változót is beállítjuk FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);Egy adott fájl teljes URL-jét tárolja (a makrót mindenhol hívják).
Elemezzük a kimenő hívást:
_. => {
&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});
}
Tegyük fel, hogy felhívjuk a 89991234567-et, először is ide jutunk:
&recording(${CALLERID(number)},${EXTEN});azok. Meghívja a beszélgetésrögzítési makrót, és beállítja a szükséges változókat.
További
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Rögzítjük, hogy ki kezdeményezte a hívást, és rögzítjük a hívás kezdési időpontját.
Befejezése után pedig különleges kontextusban 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});
}
letiltja a belépést a CDR táblába ennél a melléknél (ott nem szükséges), állítsa be a hívás befejezési idejét, számítsa ki az időtartamot, ha a hívás eredménye nem ismert - állítsa be (változó CallMeDISPOSITION), és az utolsó lépésben mindent elküld a Bitrixnek a rendszer curl-jén keresztül.
És még egy kis varázslat – egy bejövő hívás:
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();
}
Itt csak egy sorra vagyunk kíváncsiak.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());Azt mondja az alközpontnak, hogy telepítse Hívóazonosító(név) változóval egyenlő CallMeCallerIDName.
Magát a CallMeCallerIDName változót pedig a CallMe alkalmazás állítja be (ha a Bitrix24-nek teljes neve van a hívó számának, állítsa be Hívóazonosító(név), nem – nem teszünk semmit).
Alkalmazás beállítása
Alkalmazásbeállítások fájlja - /var/www/pbx.vistep.ru/config.php
Alkalmazási paraméterek leírása:
- CallMeDEBUG — ha 1, akkor az alkalmazás által feldolgozott összes esemény a naplófájlba kerül, 0 — nem írunk semmit
- tech - SIP/PJSIP/IAX/stb
- authToken — Bitrix24 engedélyezési token, kimenő webhook engedélyezési kód
- bitrixApiUrl — a bejövő webhook URL-je, profil nélkül/
- kiterjesztések — a külső számok listája
- kontextus — kontextus a hívás kezdeményezéséhez
- hallgató_időtúllépés — az eseményfeldolgozás sebessége csillagtól
- csillag — egy tömb a csillaghoz való csatlakozás beállításaival:
- vendéglátó — a csillagszerver IP-címe vagy gazdagépneve
- rendszer - csatlakozási rajz (tcp://, tls://)
- kikötő - kikötő
- felhasználónév - Felhasználónév
- titkos - Jelszó
- connect_timeout - kapcsolat időtúllépés
- read_timeout - olvasási időtúllépés
példa beállítási fájl:
<?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
);Felügyelő beállítása
A Supervisor az Asterisk CallMeIn.php eseménykezelő folyamatának elindítására szolgál, amely figyeli a bejövő hívásokat és interakcióba lép a Bitrix24-gyel (kártya megjelenítése, kártya elrejtése stb.).
Létrehozandó beállítási fájl:
/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.logIndítsa el és indítsa újra az alkalmazást:
supervisorctl start callme
supervisorctl restart callmeAz alkalmazás működési állapotának megtekintése:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07Következtetés
Elég bonyolultnak bizonyult, de biztos vagyok benne, hogy egy tapasztalt rendszergazda képes lesz otthon is megvalósítani, és tetszeni fog a felhasználóknak.
Ígéret szerint, .
Kérdések, javaslatok - kérjük, hagyja meg őket a megjegyzésekben. Továbbá, ha érdekel, hogyan zajlott ennek az integrációnak a fejlesztése, írjon, és a következő cikkben megpróbálok mindent részletesebben feltárni.
Forrás: will.com
