ادغام Asterisk و Bitrix24

ادغام Asterisk و Bitrix24
شبکه گزینه های مختلفی برای ادغام IP-PBX Asterisk و CRM Bitrix24 دارد، اما ما تصمیم گرفتیم خودمان را بنویسیم.

از نظر عملکرد، همه چیز استاندارد است:

  • استریسک با کلیک بر روی پیوند با شماره تلفن مشتری در Bitrix24، شماره داخلی کاربری که این کلیک از طرف او انجام شده است را با شماره تلفن مشتری متصل می کند. در Bitrix24 یک رکورد از مکالمه ضبط می شود و در پایان مکالمه، رکورد مکالمه بالا کشیده می شود.
  • تماسی از خارج به استریسک می رسد - در رابط Bitrix24، کارت مشتری را به کارمندی که این تماس به شماره او رسیده است نشان می دهیم.
    اگر چنین مشتری وجود ندارد، کارت را برای ایجاد سرنخ جدید باز کنید.
    به محض اینکه تماس کامل شد، این را در کارت منعکس می کنیم و ضبط مکالمه را بالا می بریم.

در زیر برش، به شما خواهم گفت که چگونه همه چیز را برای خودتان تنظیم کنید و یک پیوند به github بدهید - بله، بله، آن را بگیرید و از آن استفاده کنید!

توضیحات عمومی

ما ادغام خود را CallMe نامیدیم. CallMe یک برنامه وب کوچک است که به زبان PHP نوشته شده است.

فناوری ها و خدمات مورد استفاده

  • PHP 5.6
  • کتابخانه PHP AMI
  • آهنگساز
  • nginx + php fpm
  • سرپرست
  • AMI (رابط مدیر ستاره)
  • Bitrix webhooks (اجرای REST API ساده شده)

از پیش تنظیم

در سرور با استریسک، باید وب سرور (nginx + php-fpm)، سوپروایزر و git را نصب کنید.

دستور نصب (CentOS):

yum install nginx php-fpm supervisor git

دایرکتوری موجود در وب سرور را ارسال می کنیم، برنامه را از 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;
		}
}

تجزیه و تحلیل پیکربندی، مسائل امنیتی، دریافت گواهینامه و حتی انتخاب سرور وب را خارج از محدوده مقاله می گذارم - در این مورد مطالب زیادی نوشته شده است. این برنامه هیچ محدودیتی ندارد، هم روی http و هم روی https کار می کند.

ما https داریم، اجازه دهید گواهی را رمزگذاری کنیم.

اگر همه چیز را به درستی انجام داده اید، با کلیک بر روی پیوند باید چیزی شبیه به این را ببینید

ادغام Asterisk و Bitrix24

پیکربندی Bitrix24

بیایید دو وب هوک ایجاد کنیم.

وب هوک ورودی.

در زیر حساب مدیر (با شناسه 1) مسیر را طی کنید: برنامه ها -> وب هوک ها -> افزودن وب هوک -> وب هوک ورودی

ادغام Asterisk و Bitrix24

پارامترهای وب هوک ورودی را مانند تصاویر پر کنید:

ادغام Asterisk و Bitrix24

ادغام Asterisk و Bitrix24

و روی save کلیک کنید.

پس از ذخیره، Bitrix24 آدرس وب هوک ورودی را ارائه می دهد، به عنوان مثال:

ادغام Asterisk و Bitrix24

نسخه URL خود را بدون /profile/ ذخیره کنید - در برنامه برای کار با تماس های ورودی استفاده می شود.

دارمش https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

وب هوک خروجی.

برنامه ها -> Webhooks -> Add Webhook -> Outgoing Webhook

جزئیات در تصاویر موجود است:

ادغام Asterisk و Bitrix24

ادغام Asterisk و Bitrix24

ذخیره کنید و کد مجوز را دریافت کنید

ادغام Asterisk و Bitrix24

دارمش xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. همچنین باید آن را برای خود کپی کنید، برای برقراری تماس های خروجی لازم است.

مهم!

گواهی ssl باید روی سرور Bitrix24 پیکربندی شود (می توانید از letsencrypt استفاده کنید)، در غیر این صورت api BitrixXNUMX کار نخواهد کرد. اگر نسخه ابری دارید، نگران نباشید - ssl در حال حاضر وجود دارد.

مهم!

در قسمت "آدرس پردازنده"، آدرسی که از اینترنت قابل دسترسی است باید مشخص شود!

و با آخرین لمس، بیایید CallMeOut خود را به عنوان یک برنامه برای برقراری تماس نصب کنیم (به طوری که با کلیک بر روی شماره در PBX، دستوری برای برقراری تماس پرواز می کند).

در منو، گزینه: More -> Telephony -> More -> Settings را انتخاب کنید، روی "Number for outgoing calls به طور پیش فرض" تنظیم کنید برنامه: CallMeOut و روی "ذخیره" کلیک کنید.

ادغام Asterisk و 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

در مرحله بعد، چند ترفند وجود دارد که باید با استفاده از dialplan اجرا شوند (ما 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});
}

};

بیایید از ابتدا شروع کنیم: بخشنامه جهان.

متغیر URLRECORDS URL فایل‌های ضبط مکالمه را ذخیره می‌کند، که براساس آن Bitrix24 آنها را به کارت تماس می‌کشد.

بعد، ما به ماکرو ماکرو علاقه مندیم ضبط.

در اینجا علاوه بر ضبط مکالمات، متغیر را تنظیم می کنیم FullFname.

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 را برای این برنامه افزودنی خاموش کنید (در آنجا نیازی نیست)، زمان پایان تماس را تنظیم کنید، مدت زمان را محاسبه کنید، اگر نتیجه تماس مشخص نیست - تنظیم کنید (متغیر با من DISPOSITION تماس بگیرید) و در مرحله آخر، همه چیز را از طریق curl سیستم به 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();
        }

در اینجا ما فقط به یک خط علاقه داریم.

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

او می گوید PBX نصب کنید شناسه تماس گیرنده (نام) متغیر CallMeCallerIDName.

خود متغیر CallMeCallerIDName به نوبه خود توسط برنامه CallMe تنظیم می شود (اگر Bitrix24 نام کاملی برای شماره تماس گیرنده داشته باشد، آن را به عنوان تنظیم می کنیم شناسه تماس گیرنده (نام)، نه - ما کاری انجام نخواهیم داد).

راه اندازی برنامه

فایل تنظیمات برنامه - /var/www/pbx.vistep.ru/config.php

شرح پارامترهای برنامه:

  • CallMeDEBUG - اگر 1 باشد، تمام رویدادهای پردازش شده توسط برنامه در فایل log نوشته می شود، 0 - ما چیزی نمی نویسیم
  • فن آوری SIP/PJSIP/IAX/و غیره
  • authToken - کد مجوز Bitrix24، کد مجوز خروجی وب هوک
  • bitrixApiUrl - آدرس وب هوک ورودی، بدون نمایه/
  • گسترش - لیست شماره های خارجی
  • زمینه - زمینه ایجاد تماس
  • listener_timeout - سرعت پردازش رویداد از ستاره
  • ستاره - آرایه ای با تنظیمات اتصال به ستاره:
  • میزبان - ip یا نام میزبان سرور ستاره
  • طرح - نمودار اتصال (tcp://، tls://)
  • بندر - بندر
  • نام کاربری - نام کاربری
  • راز - کلمه عبور
  • connect_timeout - پایان زمان اتصال
  • read_timeout - خواندن مهلت زمانی

نمونه فایل تنظیمات:

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

سوالات، پیشنهادات - لطفا در نظرات. همچنین، اگر به چگونگی پیشرفت این ادغام علاقه دارید، بنویسید، و در مقاله بعدی سعی خواهم کرد همه چیز را با جزئیات بیشتری فاش کنم.

منبع: www.habr.com

اضافه کردن نظر