アスタリスクとBitrix24の統合

アスタリスクとBitrix24の統合
ネットワークには IP-PBX Asterisk と CRM Bitrix24 を統合するためのさまざまなオプションがありますが、それでも私たちは独自のオプションを作成することにしました。

機能的にはすべてが標準です。

  • Bitrix24 内のクライアントの電話番号のリンクをクリックすると、Asterisk は、クリックが行われたユーザーの内部番号とクライアントの電話番号を接続します。 Bitrix24 では、通話の記録が記録され、通話の終了時に会話の記録が取り出されます。
  • アスタリスクは外部から電話を受信します。Bitrix24 インターフェイスでは、この電話が届いた番号の従業員にクライアント カードを表示します。
    そのようなクライアントが存在しない場合は、新しいリードを作成するためのカードを開きます。
    通話が完了するとすぐにカードに反映され、会話の記録が取り出されます。

カットの下では、すべてを自分で設定する方法と、github へのリンクを示します。はい、はい、それを受け取って使用してください。

一般的な説明

私たちは統合を CallMe と呼びました。 CallMe は、PHP で書かれた小さな Web アプリケーションです。

利用されている技術やサービス

  • PHP 5.6
  • PHP AMI ライブラリ
  • 作曲家
  • nginx + php fpm
  • スーパーバイザー
  • AMI (アスタリスクマネージャーインターフェース)
  • Bitrix Webhook (簡素化された REST API 実装)

プリセット

Asterisk を備えたサーバーには、Web サーバー (nginx + php-fpm があります)、スーパーバイザー、および git をインストールする必要があります。

インストールコマンド(CentOS):

yum install nginx php-fpm supervisor git

Web サーバーにアクセスできるディレクトリに移動し、Git からアプリケーションを取得し、フォルダーに必要な権限を設定します。


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

次に、nginx を設定しましょう。設定は次の場所にあります。

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

構成の分析、セキュリティの問題、証明書の取得、さらには Web サーバーの選択については、この記事の範囲外としておきます。これについては多くのことが書かれています。 アプリケーションには制限がなく、http と https の両方で動作します。

https を使用して、証明書を暗号化しましょう。

すべてが正しく行われた場合は、リンクをクリックすると次のような内容が表示されるはずです。

アスタリスクとBitrix24の統合

Bitrix24のセットアップ

XNUMX つの Webhook を作成しましょう。

受信 Webhook。

管理者アカウント (ID 1) で、次のパスに進みます: [アプリケーション] -> [Webhook] -> [Webhook の追加] -> [受信 Webhook]

アスタリスクとBitrix24の統合

スクリーンショットのように、受信 Webhook のパラメーターを入力します。

アスタリスクとBitrix24の統合

アスタリスクとBitrix24の統合

そして「保存」をクリックします。

保存後、Bitrix24 は受信 Webhook の URL を提供します。例:

アスタリスクとBitrix24の統合

末尾に /profile/ を付けずに URL のバージョンを保存します。これはアプリケーションで着信呼び出しを処理するために使用されます。

私はそれを持っている https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

送信 Webhook。

アプリケーション -> Webhook -> Webhook の追加 -> 送信 Webhook

詳細はスクリーンショットにあります。

アスタリスクとBitrix24の統合

アスタリスクとBitrix24の統合

認証コードを保存して取得する

アスタリスクとBitrix24の統合

私はそれを持っている xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6。 また、これを自分自身にコピーする必要があります。発信には必要です。

重要!

SSL 証明書は Bitrix24 サーバー上で構成する必要があります (letsencrypt を使用できます)。構成されていない場合、Bitrix API は機能しません。 クラウド バージョンをお持ちの場合は、心配する必要はありません。SSL はすでに存在します。

重要!

「プロセッサ アドレス」フィールドには、インターネットからアクセスできるアドレスが含まれている必要があります。

そして最後の仕上げとして、CallMeOut を電話をかけるためのアプリケーションとしてインストールしましょう (PBX 上の番号をクリックすると、電話を開始するためのコマンドが飛びます)。

メニューで、[詳細] -> [テレフォニー] -> [詳細] -> [設定] を選択し、「デフォルトの発信番号」で設定します。 アプリケーション: CallMeOut を選択して、[保存] をクリックします。

アスタリスクとBitrix24の統合

アスタリスクのセットアップ

Asterisk と Bitrix24 間の対話を正常に行うには、callme AMI ユーザーを 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

次に、ダイヤルプラン (ここでは、extensions.ael) を介して実装する必要があるいくつかのトリックがあります。

ファイル全体を提供してから説明します。

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

};

最初から始めましょう: ディレクティブ グローバル.

可変 URLレコード 会話録音ファイルの URL を保存し、それに応じて Bitrix24 がそれらを連絡先カードに取り込みます。

次にマクロマクロに興味があります 録音.

ここでは、会話を録音するだけでなく、変数を設定します フルネーム.

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

特定のファイルへの完全な URL を保存します (マクロはどこでも呼び出されます)。

発信通話を分析してみましょう。

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

ここで最初に 89991234567 に電話すると、次のようになります。

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

それらの。 通話録音マクロが呼び出され、必要な変数が設定されます。

次へ

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

誰が通話を開始したか、通話の開始時刻を記録します。

そしてそれが完了すると、特別なコンテキストで 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});
}

この内線番号の CDR テーブルのエントリをオフにし(そこには必要ありません)、通話の終了時刻を設定し、通話の結果が不明な場合は継続時間を計算します - 設定(変数) 電話してください) そして最後のステップでは、システムカールを通じてすべてを Bitrix に送信します。

そしてもう少し魔法です - 着信:

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

ここでは XNUMX 行のみに注目します。

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

彼女はPBXをインストールすると言っています 発信者ID(名前) 変数 CallMe発信者ID名.

CallMeCallerIDName 変数自体は、CallMe アプリケーションによって設定されます (Bitrix24 が発信者の番号のフルネームを持っている場合は、それを次のように設定します) 発信者ID(名前)、いいえ、私たちは何もしません)。

アプリケーションのセットアップ

アプリケーション設定ファイル - /var/www/pbx.vistep.ru/config.php

アプリケーションパラメータの説明:

  • CallMeDEBUG - 1 の場合、アプリケーションによって処理されたすべてのイベントがログ ファイルに書き込まれます。0 - 何も書き込みません。
  • テク SIP/PJSIP/IAXなど
  • 認証トークン — Bitrix24 認証トークン、送信 Webhook 認証コード
  • bitrixApiUrl — 受信 Webhook の URL (profile/ なし)
  • 拡張子 — 外部番号のリスト
  • コンテキスト — 通話開始のコンテキスト
  • リスナー_タイムアウト — アスタリスクからのイベント処理の速度
  • アスタリスク - アスタリスクへの接続設定を含む配列:
  • host - アスタリスクサーバーの IP またはホスト名
  • スキーム — 接続図 (tcp://、tls://)
  • ポート - ポート
  • ユーザ名 - ユーザー名
  • 秘密 - パスワード
  • 接続タイムアウト - 接続タイムアウト
  • 読み取りタイムアウト - 読み取りタイムアウト

設定ファイルの例:

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

);

スーパーバイザのセットアップ

Supervisor は、Asterisk CallMeIn.php イベント ハンドラー プロセスを起動するために使用されます。このプロセスは、着信通話を監視し、Bitrix24 と対話します (カードの表示、カードの非表示など)。

作成する設定ファイル:

/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

アプリケーションを起動して再起動します。

supervisorctl start callme
supervisorctl restart callme

アプリケーションの動作ステータスの表示:

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

まとめ

かなり難しいことが判明しましたが、経験豊富な管理者ならきっと実装してユーザーを満足させることができるでしょう。

約束通り、 github へのリンク.

ご質問、ご提案はコメント欄にお寄せください。 また、この統合の開発がどのように行われたかに興味がある場合は、次の記事ですべてをより詳細に明らかにするつもりです。

出所: habr.com

コメントを追加します