Asterisk ve Bitrix24 entegrasyonu

Asterisk ve Bitrix24 entegrasyonu
IP-PBX Asterisk ve CRM Bitrix24'ü ağ üzerinde entegre etmek için farklı seçenekler var, ancak yine de kendimizinkini yazmaya karar verdik.

İşlevsellik açısından her şey standarttır:

  • Bitrix24'te müşterinin telefon numarasını içeren bir bağlantıya tıklandığında Asterisk, adına tıklamanın yapıldığı kullanıcının dahili numarasını müşterinin telefon numarasına bağlar. Bitrix24'te görüşmenin kaydı tutulur ve görüşmenin sonunda görüşmenin kaydı açılır.
  • Yıldız işareti dışarıdan bir çağrı alır - Bitrix24 arayüzünde müşteri kartını bu çağrının geldiği çalışana gösteririz.
    Böyle bir müşteri yoksa, yeni bir potansiyel müşteri oluşturmak için kartı açacağız.
    Görüşme tamamlanır tamamlanmaz bunu karta yansıtıyoruz ve görüşmenin kaydını çıkarıyoruz.

Kesimin altında size her şeyi kendiniz için nasıl ayarlayacağınızı anlatacağım ve size github'a bir bağlantı vereceğim - evet, evet, alın ve kullanın!

genel açıklama

Entegrasyonumuza CallMe adını verdik. CallMe, PHP ile yazılmış küçük bir web uygulamasıdır.

Kullanılan teknolojiler ve hizmetler

  • PHP 5.6
  • PHP AMI kütüphanesi
  • Oluşturmak
  • Nginx + php-fpm
  • gözetmen
  • AMI (Yıldız Yöneticisi Arayüzü)
  • Bitrix web kancaları (basitleştirilmiş REST API uygulaması)

ön ayar

Yıldız işaretli bir sunucuya bir web sunucusu (bizim için nginx+php-fpm), yönetici ve git kurmanız gerekir.

Kurulum komutu (CentOS):

yum install nginx php-fpm supervisor git

Web sunucusunun erişebileceği dizine gidiyoruz, uygulamayı Git'ten alıyoruz ve klasöre gerekli hakları ayarlıyoruz:


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

Sonra nginx'i yapılandıralım, yapılandırmamız şurada bulunuyor

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

Yapılandırmayı, güvenlik sorunlarını, sertifika almayı ve hatta bir web sunucusu seçmeyi makalenin kapsamı dışında bırakacağım - bunun hakkında çok şey yazıldı. Uygulamanın herhangi bir kısıtlaması yoktur, hem http hem de https üzerinden çalışmaktadır.

https kullanıyoruz, sertifikayı şifreleyelim.

Her şeyi doğru yaptıysanız, bağlantıya tıkladığınızda buna benzer bir şey görmelisiniz.

Asterisk ve Bitrix24 entegrasyonu

Bitrix24'ü kurma

İki web kancası oluşturalım.

Gelen web kancası.

Yönetici hesabı altında (kimlik 1 ile), şu yolu izleyin: Uygulamalar -> Web kancaları -> Web kancası ekle -> Gelen web kancası

Asterisk ve Bitrix24 entegrasyonu

Gelen webhook'un parametrelerini ekran görüntülerindeki gibi doldurun:

Asterisk ve Bitrix24 entegrasyonu

Asterisk ve Bitrix24 entegrasyonu

Ve kaydet'i tıklayın.

Kaydettikten sonra Bitrix24, gelen webhook'un URL'sini sağlayacaktır, örneğin:

Asterisk ve Bitrix24 entegrasyonu

URL sürümünüzü son /profil/ olmadan kaydedin; bu, uygulamada gelen çağrılarla çalışmak için kullanılacaktır.

bu bende var https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Giden web kancası.

Uygulamalar -> Web kancaları -> Web kancası ekle -> Giden web kancası

Ayrıntılar yine ekran görüntülerinde:

Asterisk ve Bitrix24 entegrasyonu

Asterisk ve Bitrix24 entegrasyonu

Yetkilendirme kodunu kaydedin ve alın

Asterisk ve Bitrix24 entegrasyonu

bu bende var xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Ayrıca kendiniz için de kopyalamanız gerekir; giden aramalar yapmak için de buna ihtiyacınız vardır.

Önemli!

Bitrix24 sunucusunda bir SSL sertifikasının yapılandırılması gerekir (letsencrypt kullanabilirsiniz), aksi takdirde Bitrix api çalışmaz. Bulut sürümünüz varsa endişelenmeyin; zaten SSL'si var.

Önemli!

“İşlemci Adresi” alanı internetten erişilebilen bir adres içermelidir!

Ve son bir dokunuş olarak, CallMeOut'umuzu arama yapmak için bir uygulama olarak yükleyelim (böylece PBX'teki numaraya tıkladığınızda, aramayı başlatma komutu uçup gidecek).

Menüde şunu seçin: Diğer -> Telefon -> Diğer -> Ayarlar, “Varsayılan giden çağrı numarası”nda ayarlayın Uygulama: CallMeOut ve “Kaydet”e tıklayın

Asterisk ve Bitrix24 entegrasyonu

Yıldız işareti ayarlama

Asterisk ve Bitrix24 arasındaki başarılı etkileşim için AMI kullanıcısı callme'yi Manager.conf'a eklememiz gerekiyor:

[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

Daha sonra, arama planı aracılığıyla uygulanması gereken birkaç püf noktası var (bizim için bu extensions.ael).

Dosyanın tamamını sunacağım ve ardından bir açıklama yapacağım:

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

};

En baştan başlayalım: direktif globaller.

değişken URL KAYITLARI konuşma kayıt dosyalarının URL'sini saklar ve buna göre Bitrix24 bunları kişi kartına çeker.

Daha sonra makro makroyla ilgileniyoruz kayıt.

Burada konuşmaları kaydetmenin yanı sıra değişkeni de ayarlayacağız. Tam İsim.

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

Tam URL'yi belirli bir dosyaya kaydeder (makro her yerde çağrılır).

Giden aramayı analiz edelim:

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

Diyelim ki 89991234567'yi arıyoruz, ilk olarak buraya geliyoruz:

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

onlar. Görüşme kayıt makrosu çağrılır ve gerekli değişkenler ayarlanır.

İleri

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

Aramayı kimin başlattığını ve aramanın başlama saatini kaydediyoruz.

Ve tamamlandığında, özel bir bağlamda 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});
}

bu dahili hat için CDR tablosuna girişi devre dışı bırakın (burada gerekli değildir), çağrının bitiş saatini ayarlayın, çağrının sonucu bilinmiyorsa süreyi hesaplayın - ayarlayın (değişken) Beni Ara) ve son adımda her şeyi sistem rotasyonu aracılığıyla Bitrix'e gönderin.

Ve biraz daha sihir - gelen bir çağrı:

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

Burada sadece bir satırla ilgileniyoruz.

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

PBX'e kurulmasını söyler Arayanın Kimliği(isim) değişkene eşit Beni Arayan KimliğinAdı.

CallMeCallerIDName değişkeninin kendisi de CallMe uygulaması tarafından ayarlanır (Bitrix24'te arayanın numarası için tam bir ad varsa, bunu şu şekilde ayarlayın: Arayanın Kimliği(isim), hayır - hiçbir şey yapmayacağız).

Uygulamayı ayarlama

Uygulama ayarları dosyası - /var/www/pbx.vistep.ru/config.php

Uygulama parametrelerinin açıklaması:

  • Beni AraDEBUG — 1 ise, uygulama tarafından işlenen tüm olaylar günlük dosyasına yazılacaktır, 0 — hiçbir şey yazmayız
  • teknoloji -SIP/PJSIP/IAX/vb
  • kimlik doğrulama belirteci — Bitrix24 yetkilendirme jetonu, giden webhook yetkilendirme kodu
  • bitrixApiUrl — Gelen webhook'un URL'si, profil olmadan/
  • Uzantılar — harici numaraların listesi
  • bağlam — çağrı başlatma bağlamı
  • listener_timeout — yıldız işaretinden itibaren olay işleme hızı
  • yıldız işareti — yıldız işaretine bağlanmak için ayarların bulunduğu bir dizi:
  • ev sahibi — yıldız işareti sunucusunun ip veya ana bilgisayar adı
  • plan — bağlantı şeması (tcp://, tls://)
  • Liman - liman
  • kullanıcı adı - Kullanıcı adı
  • gizli - şifre
  • Bağlantı zaman aşımı - Bağlantı zamanaşımı
  • okuma_zaman aşımı - okuma zaman aşımı

örnek ayarlar dosyası:

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

);

Yönetici kurulumu

Yönetici, gelen çağrıları izleyen ve Bitrix24 ile etkileşime giren (kartı göster, kartı gizle vb.) Asterisk CallMeIn.php'den olay işleyici sürecini başlatmak için kullanılır.

Oluşturulacak ayarlar dosyası:

/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

Uygulamayı başlatın ve yeniden başlatın:

supervisorctl start callme
supervisorctl restart callme

Uygulamanın çalışma durumunu görüntüleme:

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

Sonuç

Oldukça karmaşık olduğu ortaya çıktı, ancak deneyimli bir yöneticinin bunu uygulayabileceğinden ve kullanıcılarını memnun edeceğinden eminim.

Söz verildiği gibi, github'a bağlantı.

Sorular, öneriler - lütfen bunları yorumlarda bırakın. Ayrıca bu entegrasyonun gelişiminin nasıl gittiğini merak ediyorsanız yazın, bir sonraki makalede her şeyi daha ayrıntılı olarak ortaya koymaya çalışacağım.

Kaynak: habr.com

Yorum ekle