Integrasi Asterisk dan Bitrix24

Integrasi Asterisk dan Bitrix24
Ada opsi berbeda untuk mengintegrasikan IP-PBX Asterisk dan CRM Bitrix24 di jaringan, tetapi kami tetap memutuskan untuk menulis sendiri.

Dari segi fungsionalitas, semuanya standar:

  • Dengan mengeklik tautan dengan nomor telepon klien di Bitrix24, Asterisk menghubungkan nomor internal pengguna yang atas namanya klik dilakukan dengan nomor telepon klien. Di Bitrix24, rekaman panggilan direkam dan, di akhir panggilan, rekaman percakapan diambil.
  • Asterisk menerima panggilan dari luar - di antarmuka Bitrix24 kami menunjukkan kartu klien kepada karyawan yang nomornya menerima panggilan ini.
    Jika tidak ada klien seperti itu, kami akan membuka kartu untuk membuat prospek baru.
    Segera setelah panggilan selesai, kami merefleksikannya pada kartu dan menampilkan rekaman percakapan.

Di bawah ini saya akan memberi tahu Anda cara mengatur semuanya sendiri dan memberi Anda tautan ke github - ya, ya, ambil dan gunakan!

Deskripsi umum

Kami menyebut integrasi kami CallMe. CallMe adalah aplikasi web kecil yang ditulis dalam PHP.

Teknologi dan layanan yang digunakan

  • PHP 5.6
  • Perpustakaan PHP AMI
  • Menyusun
  • Nginx + php-fpm
  • pengawas
  • AMI (Antarmuka Manajer Asterisk)
  • Webhook Bitrix (implementasi REST API yang disederhanakan)

presetting

Di server dengan Asterisk, Anda perlu menginstal server web (bagi kami adalah nginx+php-fpm), supervisor dan git.

Perintah instalasi (CentOS):

yum install nginx php-fpm supervisor git

Kami pergi ke direktori yang dapat diakses oleh server web, menarik aplikasi dari Git dan mengatur hak yang diperlukan ke folder tersebut:


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

Selanjutnya mari kita konfigurasikan nginx, konfigurasi kita terletak di

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

Saya akan meninggalkan penguraian konfigurasi, masalah keamanan, mendapatkan sertifikat, dan bahkan memilih server web di luar cakupan artikel - banyak yang telah ditulis tentang ini. Aplikasi ini tidak memiliki batasan, ia berfungsi baik melalui http dan https.

Kami menggunakan https, mari mengenkripsi sertifikat.

Jika Anda melakukan semuanya dengan benar, maka dengan mengklik link tersebut Anda akan melihat sesuatu seperti ini

Integrasi Asterisk dan Bitrix24

Menyiapkan Bitrix24

Mari buat dua webhook.

Webhook masuk.

Di bawah akun administrator (dengan id 1), ikuti jalur: Aplikasi -> Webhook -> Tambahkan webhook -> Webhook masuk

Integrasi Asterisk dan Bitrix24

Isikan parameter webhook yang masuk seperti pada screenshot:

Integrasi Asterisk dan Bitrix24

Integrasi Asterisk dan Bitrix24

Dan klik simpan.

Setelah disimpan, Bitrix24 akan memberikan URL webhook yang masuk, misalnya:

Integrasi Asterisk dan Bitrix24

Simpan versi URL Anda tanpa /profil/ final - ini akan digunakan dalam aplikasi untuk menangani panggilan masuk.

aku punya ini https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook keluar.

Aplikasi -> Webhook -> Tambahkan webhook -> Webhook keluar

Detailnya ada lagi di tangkapan layar:

Integrasi Asterisk dan Bitrix24

Integrasi Asterisk dan Bitrix24

Simpan dan terima kode otorisasi

Integrasi Asterisk dan Bitrix24

aku punya ini xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Anda juga perlu menyalinnya sendiri; Anda memerlukannya untuk melakukan panggilan keluar.

Penting!

Sertifikat SSL harus dikonfigurasi di server Bitrix24 (Anda dapat menggunakan letsencrypt), jika tidak, api Bitrix tidak akan berfungsi. Jika Anda memiliki versi cloud, jangan khawatir - versi ini sudah memiliki SSL.

Penting!

Bidang β€œAlamat Prosesor” harus berisi alamat yang dapat diakses dari Internet!

Dan sebagai sentuhan terakhir, mari instal CallMeOut kita sebagai aplikasi untuk melakukan panggilan (sehingga ketika Anda mengklik nomor di PBX, perintah untuk memulai panggilan akan hilang).

Di menu, pilih: Lainnya -> Telepon -> Lainnya -> Pengaturan, atur di β€œNomor panggilan keluar default” Aplikasi: CallMeOut dan klik β€œSimpan”

Integrasi Asterisk dan Bitrix24

Menyiapkan tanda bintang

Agar interaksi antara Asterisk dan Bitrix24 berhasil, kita perlu menambahkan panggilan pengguna AMI ke 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

Selanjutnya ada beberapa trik yang perlu diterapkan melalui dialplan (bagi kami ini adalah extensions.ael).

Saya akan memberikan seluruh filenya, lalu saya akan memberikan penjelasannya:

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

};

Mari kita mulai dari awal: arahan GLOBALS.

Variabel CATATAN URL menyimpan URL ke file rekaman percakapan, yang menurut Bitrix24 akan menariknya ke kartu kontak.

Selanjutnya kita tertarik pada makro makro rekaman.

Di sini, selain merekam percakapan, kami akan mengatur variabelnya Nama Lengkap.

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

Ini menyimpan URL lengkap ke file tertentu (makro dipanggil di mana-mana).

Mari kita menganalisis panggilan keluar:

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

Katakanlah kita menelepon 89991234567, pertama-tama kita sampai di sini:

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

itu. Makro rekaman percakapan dipanggil dan variabel yang diperlukan ditetapkan.

Selanjutnya

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

Kami mencatat siapa yang memulai panggilan dan mencatat waktu mulai panggilan.

Dan setelah selesai, dalam konteks khusus 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});
}

nonaktifkan entri ke tabel CDR untuk ekstensi ini (tidak diperlukan di sana), atur waktu berakhirnya panggilan, hitung durasinya, jika hasil panggilan tidak diketahui - setel (variabel Hubungi Saya DISPOSISI) dan, langkah terakhir, kirim semuanya ke Bitrix melalui system curl.

Dan sedikit keajaiban lagi - panggilan masuk:

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

Di sini kami hanya tertarik pada satu baris.

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

Dia memberitahu PBX untuk menginstal ID Penelepon (nama) sama dengan variabel Nama CallMeCallerID.

Variabel CallMeCallerIDName sendiri, pada gilirannya, diatur oleh aplikasi CallMe (jika Bitrix24 memiliki nama lengkap untuk nomor penelepon, setel sebagai ID Penelepon (nama), tidak - kami tidak akan melakukan apa pun).

Menyiapkan aplikasi

File pengaturan aplikasi - /var/www/pbx.vistep.ru/config.php

Deskripsi parameter aplikasi:

  • Hubungi SayaDEBUG β€” jika 1, maka semua event yang diproses oleh aplikasi akan ditulis ke file log, 0 β€” kami tidak menulis apa pun
  • tech - SIP/PJSIP/IAX/dll
  • token autentik β€” Token otorisasi Bitrix24, kode otorisasi webhook keluar
  • bitrixApiUrl β€” URL webhook masuk, tanpa profil/
  • ekstensi β€” daftar nomor eksternal
  • konteks β€” konteks untuk memulai panggilan
  • pendengar_waktu habis β€” kecepatan pemrosesan acara dari asterisk
  • asterisk β€” array dengan pengaturan untuk menghubungkan ke tanda bintang:
  • tuan rumah β€” ip atau nama host server asterisk
  • skema β€” diagram koneksi (tcp://, tls://)
  • pelabuhan - pelabuhan
  • nama pengguna - Nama belakang
  • rahasia - kata sandi
  • koneksi_waktu habis - waktu koneksi habis
  • waktu_baca habis - batas waktu baca

contoh file pengaturan:

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

);

Pengaturan pengawas

Supervisor digunakan untuk meluncurkan proses event handler dari Asterisk CallMeIn.php, yang memantau panggilan masuk dan berinteraksi dengan Bitrix24 (tunjukkan kartu, sembunyikan kartu, dll.).

File pengaturan yang akan dibuat:

/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

Luncurkan dan mulai ulang aplikasi:

supervisorctl start callme
supervisorctl restart callme

Melihat status pengoperasian aplikasi:

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

Kesimpulan

Ternyata cukup ribet, tapi saya yakin administrator yang berpengalaman akan mampu mengimplementasikannya dan menyenangkan penggunanya.

Seperti yang dijanjikan, tautan ke github.

Pertanyaan, saran - silakan tinggalkan di komentar. Selain itu, jika Anda tertarik dengan perkembangan integrasi ini, tulislah, dan pada artikel selanjutnya saya akan mencoba mengungkap semuanya lebih detail.

Sumber: www.habr.com

Tambah komentar