فهم FreePBX ودمجها مع Bitrix24 والمزيد

بيتريكس 24 عبارة عن مزيج ضخم يجمع بين CRM وسير العمل والمحاسبة والعديد من الأشياء الأخرى التي يحبها المديرون حقًا ولا يحبها موظفو تكنولوجيا المعلومات حقًا. يتم استخدام البوابة من قبل الكثير من الشركات الصغيرة والمتوسطة الحجم ، بما في ذلك العيادات الصغيرة والمصنعين وحتى صالونات التجميل. الوظيفة الرئيسية التي يحبها المديرون هي تكامل الاتصال الهاتفي وإدارة علاقات العملاء ، عندما يتم تسجيل أي مكالمة على الفور في CRM ، يتم إنشاء بطاقات العملاء ، وعند ورودها ، يتم عرض معلومات حول العميل ويمكنك على الفور معرفة من هو وماذا يمكن أن يبيع وكم هو مدين. لكن الاتصال الهاتفي من Bitrix24 وتكامله مع CRM يكلف الكثير من المال أحيانًا. سأخبرك في المقالة بتجربة الدمج مع الأدوات المفتوحة و IP PBX الشهير FreePBX، وكذلك النظر في منطق عمل الأجزاء المختلفة

أعمل كمتعاقد خارجي في شركة تبيع وتتكامل مع المهاتفة عبر بروتوكول الإنترنت. عندما سُئلت عما إذا كان بإمكاننا تقديم شيء لهذه وهذه الشركة لدمج Bitrix24 مع PBXs التي يمتلكها العملاء ، وكذلك مع PBXs الافتراضية في العديد من شركات VDS ، ذهبت إلى Google. وبالطبع أعطاني رابطًا لـ مقالة في habr، حيث يوجد وصف ، و github ، ويبدو أن كل شيء يعمل. ولكن عند محاولة استخدام هذا الحل ، اتضح أن Bitrix24 لم يعد كما كان من قبل ، ويلزم إعادة بنائه كثيرًا. بالإضافة إلى ذلك ، لا يعد FreePBX علامة نجمية عارية بالنسبة لك ، وهنا تحتاج إلى التفكير في كيفية الجمع بين سهولة الاستخدام وخطة الطلب المتشددة في ملفات التكوين.

ندرس منطق العمل

بالنسبة للمبتدئين ، كيف يجب أن يعمل كل شيء. عند تلقي مكالمة من خارج PBX (حدث SIP INVITE من الموفر) ، تبدأ معالجة مخطط الاتصال (خطة الاتصال ، مخطط الطلب) - قواعد ماذا وبأي ترتيب يتم القيام به مع المكالمة. من الحزمة الأولى ، يمكنك الحصول على الكثير من المعلومات ، والتي يمكن استخدامها بعد ذلك في القواعد. يعد المحلل أداة ممتازة لدراسة الأجزاء الداخلية لـ SIP سنجريب (رابط) الذي تم تثبيته ببساطة في توزيعات شائعة عبر تثبيت apt / yum install وما شابه ، ولكن يمكن أيضًا بناؤه من المصدر. دعونا نلقي نظرة على سجل المكالمات في sngrep

فهم FreePBX ودمجها مع Bitrix24 والمزيد

في شكل مبسط ، يتعامل مخطط الطلب فقط مع الحزمة الأولى ، وأحيانًا أيضًا أثناء المحادثة ، ويتم تحويل المكالمات ، والضغط على الأزرار (DTMF) ، والعديد من الأشياء المثيرة للاهتمام مثل FollowMe و RingGroup و IVR وغيرها.

ماذا يوجد داخل حزمة الدعوة

فهم FreePBX ودمجها مع Bitrix24 والمزيد

في الواقع ، تعمل معظم مخططات الطلب البسيطة مع أول حقلين ، ويدور المنطق بأكمله حول DID و CallerID. DID - حيث نتصل ، CallerID - من المتصل.

ولكن بعد كل شيء ، لدينا شركة وليس هاتفًا واحدًا - مما يعني أن PBX على الأرجح بها مجموعات اتصال (رنين متزامن / متتابع لعدة أجهزة) على أرقام المدينة (Ring Group) ، IVR (مرحبًا ، لقد اتصلت ... اضغط واحد من أجل ...) ، آلات الرد (الجمل) ، الظروف الزمنية ، إعادة التوجيه إلى أرقام أخرى أو إلى خلية (FollowMe ، إعادة توجيه). هذا يعني أنه من الصعب للغاية تحديد من سيتلقى مكالمة بالفعل ومن الذي سيجري محادثة عند وصول مكالمة بشكل لا لبس فيه. فيما يلي مثال على بداية مكالمة نموذجية في PBX لعملائنا

فهم FreePBX ودمجها مع Bitrix24 والمزيد

بعد دخول المكالمة إلى PBX بنجاح ، تنتقل عبر مخطط الطلب في "سياقات" مختلفة. السياق من وجهة نظر النجمة عبارة عن مجموعة مرقمة من الأوامر ، كل منها يحتوي على مرشح بواسطة الرقم المطلوب (يطلق عليه exten ، لمكالمة خارجية في المرحلة الأولية exten = DID). يمكن أن تكون الأوامر الموجودة في خط الطلب أي شيء - وظائف داخلية (على سبيل المثال ، استدعاء مشترك داخلي - Dial()، ضع الهاتف جانباً - Hangup()) ، عوامل شرطية (IF, ELSE, ExecIF وما شابه) ، والانتقالات إلى القواعد الأخرى لهذا السياق (Goto, GotoIF) ، الانتقال إلى سياقات أخرى في شكل استدعاء دالة (Gosub ، Macro). توجيه منفصل include имя_контекста, الذي يضيف أوامر من سياق آخر إلى نهاية السياق الحالي. الأوامر المضمنة عبر التضمين يتم تنفيذها دائمًا بعد أوامر السياق الحالي.

تم بناء منطق FreePBX بالكامل على تضمين سياقات مختلفة في بعضها البعض من خلال التضمين والاستدعاء من خلال معالجات Gosub و Macro و Handler. ضع في اعتبارك سياق مكالمات FreePBX الواردة

فهم FreePBX ودمجها مع Bitrix24 والمزيد

ينتقل الاستدعاء عبر جميع السياقات من أعلى إلى أسفل بدوره ، وفي كل سياق يمكن أن يكون هناك استدعاءات لسياقات أخرى مثل وحدات الماكرو (ماكرو) ، أو الوظائف (Gosub) أو مجرد انتقالات (الانتقال) ، لذلك يمكن للشجرة الحقيقية لما يسمى فقط يتم تعقبها في السجلات.

يظهر أدناه مخطط إعداد نموذجي لـ PBX نموذجي. عند الاتصال ، يتم البحث عن DID في المسارات الواردة ، ويتم التحقق من الشروط المؤقتة لذلك ، إذا كان كل شيء على ما يرام ، يتم تشغيل قائمة الصوت. منه ، بالضغط على الزر 1 أو المهلة ، اخرج إلى مجموعة مشغلي الاتصال. بعد انتهاء المكالمة ، يتم استدعاء ماكرو hangupcall ، وبعد ذلك لا يمكن عمل أي شيء في مخطط الطلب ، باستثناء المعالجات الخاصة (معالج إنهاء المكالمة).

فهم FreePBX ودمجها مع Bitrix24 والمزيد

أين يجب أن نوفر في خوارزمية المكالمة هذه معلومات حول بداية المكالمة إلى CRM ، وأين نبدأ التسجيل ، وأين يتم إنهاء التسجيل وإرساله مع معلومات حول المكالمة إلى CRM؟

التكامل مع الأنظمة الخارجية

ما هو تكامل PBX و CRM؟ هذه إعدادات وبرامج تقوم بتحويل البيانات والأحداث بين هذين النظامين الأساسيين وإرسالهما إلى بعضهما البعض. الطريقة الأكثر شيوعًا للتواصل بين الأنظمة المستقلة هي من خلال واجهات برمجة التطبيقات ، والطريقة الأكثر شيوعًا للوصول إلى واجهات برمجة التطبيقات هي HTTP REST. ولكن ليس لعلامة النجمة.

داخل النجمة هو:

  • AGI - استدعاء متزامن للبرامج / المكونات الخارجية ، تستخدم بشكل أساسي في مخطط الطلب ، وهناك مكتبات مثل phpagi, باجي

  • AMI - مقبس TCP نصي يعمل على مبدأ الاشتراك في الأحداث وإدخال أوامر نصية ، يشبه SMTP من الداخل ، يمكنه تتبع الأحداث وإدارة المكالمات ، توجد مكتبة بامي - الأكثر شيوعًا لإنشاء اتصال مع النجمة

مثال إخراج AMI

الحدث: قناة جديدة
الامتياز: الاتصال ، الكل
القناة: PJSIP / VMS_pjsip-0000078b
حالة القناة: 4
ChannelStateDesc: رنين
رقم المتصل: 111222
اسم المتصل: 111222
رقم الخط المتصل:
اسم الكتان المتصل:
اللغة: en
رمز الحساب:
السياق: from-pstn
على سبيل المثال: s
الأولوية 1
فريد: 1599589046.5244
ينكديد: 1599589046.5244

  • ARI عبارة عن مزيج من كليهما ، كل ذلك عبر REST ، و WebSocket ، بتنسيق JSON - ولكن مع مكتبات وأغلفة حديثة ، ليست جيدة جدًا ، تم العثور عليها مسبقًا (فباريا, phpari) التي أصبحت في تطورها منذ حوالي 3 سنوات.

مثال على إخراج ARI عند بدء المكالمة

{"متغير": "CallMeCallerIDName"، "القيمة": "111222"، "type": "ChannelVarset"، "timestamp": "2020-09-09T09: 38: 36.269 + 0000"، "channel": {"id »:» 1599644315.5334 ″ ، «الاسم»: »PJSIP / VMSpjsip-000007b6 ″، "state": "Ring"، "caller": {"name": "111222 ″،" number ":" 111222 ″}، "متصل": {"name": ""، "number" : ""}، "accountcode": ""، "dialplan": {"Context": "from-pstn"، "exten": "s"، "priority": 2، "appالاسم ":" Stasis "،" التطبيقالبيانات ":" hello-world "}،" createtime ":" 2020-09-09T09: 38: 35.926 + 0000 "،" language ":" en "}،" asteriskid ":" 48: 5b: aa: aa: aa: aa "،" application ":" hello-world "}

يتم تحديد الراحة أو الإزعاج ، وإمكانية أو استحالة العمل مع واجهة برمجة تطبيقات معينة من خلال المهام التي يجب حلها. مهام التكامل مع CRM هي كما يلي:

  • تتبع بداية المكالمة ، حيث تم نقلها ، واسحب CallerID ، و DID ، ووقت البدء والانتهاء ، وربما البيانات من الدليل (للبحث عن اتصال بين الهاتف ومستخدم CRM)

  • ابدأ تسجيل المكالمة وإنهائها ، واحفظها بالتنسيق المطلوب ، وأبلغ في نهاية التسجيل بمكان وجود الملف

  • ابدأ مكالمة على حدث خارجي (من البرنامج) ، واتصل برقم داخلي ورقم خارجي وقم بتوصيلهم

  • اختياري: التكامل مع CRM ومجموعات Dialer و FollowME للتحويل التلقائي للمكالمات في حالة عدم وجود مكان (وفقًا لـ CRM)

يمكن حل جميع هذه المهام من خلال AMI أو ARI ، ولكن ARI توفر معلومات أقل بكثير ، ولا توجد أحداث كثيرة ، ولا يتم تعقب العديد من المتغيرات التي لا تزال AMI تمتلكها (على سبيل المثال ، مكالمات الماكرو ، ومتغيرات الإعداد داخل وحدات الماكرو ، بما في ذلك تسجيل المكالمات). لذلك ، من أجل التتبع الصحيح والدقيق ، دعنا نختار AMI في الوقت الحالي (ولكن ليس بالكامل). بالإضافة إلى (حسنًا ، أين سيكون بدون هذا ، نحن كسالى) - في العمل الأصلي (مقالة في habr) استخدم PAMI. *ثم تحتاج إلى محاولة إعادة الكتابة إلى ARI ، ولكن ليس حقيقة أنها ستنجح.

إعادة اختراع التكامل

لكي يتمكن FreePBX الخاص بنا من إبلاغ AMI بطرق بسيطة حول بداية المكالمة ووقت الانتهاء والأرقام وأسماء الملفات المسجلة ، فمن الأسهل حساب مدة المكالمة باستخدام نفس الحيلة مثل المؤلفين الأصليين - أدخل المتغيرات الخاصة بك وقم بتحليل الإخراج لوجودها. يقترح PAMI القيام بذلك ببساطة من خلال وظيفة التصفية.

فيما يلي مثال على ضبط المتغير الخاص بك لوقت بدء المكالمة (رقم خاص في مخطط الطلب يتم إجراؤه قبل بدء البحث DID)

[ext-did-custom]

exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})

مثال حدث AMI لهذا الخط

الحدث: قناة جديدة

الامتياز: الاتصال ، الكل

القناة: PJSIP / VMS_pjsip-0000078b

حالة القناة: 4

ChannelStateDesc: رنين

رقم المتصل: 111222

اسم المتصل: 111222

رقم الخط المتصل:

اسم الكتان المتصل:

اللغة: en

رمز الحساب:

السياق: from-pstn

على سبيل المثال: s

الأولوية 1

فريد: 1599589046.5244

ينكديد: 1599589046.5244

التطبيق: تعيين بيانات التطبيق:

CallStart = 1599571046

لأن FreePBX يحل محل الملفات extention.conf و extention_extra.conf ، سنستخدم الملف تمديد_على.conf

كود extention_custom.conf الكامل

[globals]	
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку. 
;; Можно использовать и системную запись, но пока пусть будет эта - 
;; она работает
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}/${datedir})
exten => ~~s~~,8,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")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()


;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
exten =>  s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten =>  s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten =>  s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten =>  s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Самое главное! Обработчик окончания разговора. 
;; Обычные пути обработки конца через (exten=>h,1,чтототут) в FreePBX не работают - Macro(hangupcall,) все портит. 
;; Поэтому вешаем Hangup_Handler на окончание звонка
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания входящего вызова
[sub-call-from-cid-ended]

;; Сообщаем о значениях при конце звонка
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})

;; Статус вызова - Ответ, не ответ...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Обработчик исходящих вызовов - все аналогичено
[outbound-allroutes-custom]

;; Запись
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Переменные
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Вешаем Hangup_Handler на окончание звонка
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания исходящего вызова
[sub-call-internal-ended]

;; переменные
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Вызов скрипта, который сообщит о звонке в CRM - это исходящий, 
;; так что по факту окончания
exten => s,n,System(curl -s ${URLPHP}/CallMeOut.php --data action=sendcall2b24 --data ExtNum=${CallExtNum} --data call_id=${SIPCALLID} --data-urlencode FullFname='${FullFname}' --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition='${CallMeDISPOSITION}')
exten => s,n,Return

الميزة والاختلاف عن مخطط الاتصال الأصلي لمؤلفي المقال الأصلي -

  • Dialplan بتنسيق .conf ، كما يريده FreePBX (نعم ، يمكن أن يكون .ael ، ولكن ليس كل الإصدارات وهو ليس مناسبًا دائمًا)

  • بدلاً من معالجة النهاية من خلال exten => h ، تم تقديم المعالجة من خلال hangup_handler ، لأن FreePBX Dialplan يعمل معها فقط

  • سلسلة استدعاء البرنامج النصي الثابت والاقتباسات المضافة ورقم الاتصال الخارجي ExtNum

  • تنتقل المعالجة إلى سياقات مخصصة وتسمح لك بعدم لمس أو تعديل تكوينات FreePBX - الوارد عبر [تحويلة فعل العرف] ، الصادرة من خلال [الصادرة-allroutes-custom]

  • لا يوجد ربط للأرقام - الملف عالمي ويحتاج فقط إلى تكوينه للمسار والارتباط بالخادم

للبدء ، تحتاج أيضًا إلى تشغيل البرامج النصية في AMI عن طريق تسجيل الدخول وكلمة المرور - لهذا ، يحتوي FreePBX أيضًا على ملف مخصص

ملف manager_custom.conf

;;  это логин
[callmeplus]
;; это пароль
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; я работаю с локальной машиной - но если надо, можно и другие прописать
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

يجب وضع كلا الملفين في / etc / asterisk ، ثم إعادة قراءة التكوينات (أو إعادة تشغيل العلامة النجمية)

# astrisk -rv
  Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
     Dialplan reloaded.
#freepbx*CLI> exit

الآن دعنا ننتقل إلى PHP

تهيئة البرامج النصية وإنشاء الخدمة

نظرًا لأن مخطط العمل مع Bitrix 24 ، خدمة لـ AMI ، ليس بسيطًا وشفافًا تمامًا ، يجب مناقشته بشكل منفصل. النجمة ، عندما يتم تنشيط AMI ، ببساطة تفتح المنفذ وهذا كل شيء. عندما ينضم العميل ، فإنه يطلب الإذن ، ثم يشترك العميل في الأحداث الضرورية. تأتي الأحداث في نص عادي ، والذي يقوم PAMI بتحويله إلى كائنات منظمة ويوفر القدرة على تعيين وظيفة التصفية فقط للأحداث المهمة ، والحقول ، والأرقام ، وما إلى ذلك.

بمجرد ورود الاستدعاء ، يتم تشغيل حدث NewExten بدءًا من السياق الأصل [from-pstn] ، ثم تنتقل جميع الأحداث بترتيب الأسطر في السياقات. عند تلقي معلومات من متغيرات CallMeCallerIDName و CallStart المحددة في _custom dialplan ،

  1. وظيفة طلب معرف المستخدم المقابل للرقم الداخلي حيث وردت المكالمة. ماذا لو كانت مجموعة اتصال هاتفي؟ السؤال سياسي ، هل تحتاج إلى إنشاء مكالمة إلى الجميع في وقت واحد (عندما يتصل الجميع في وقت واحد) أو إنشاء مكالمة كما يتصلون عند الاتصال بدورهم؟ يمتلك معظم العملاء إستراتيجية Fisrt المتوفرة ، لذلك لا توجد مشكلة في ذلك ، مكالمة واحدة فقط. لكن المشكلة تحتاج إلى حل.

  2. وظيفة تسجيل المكالمة في Bitrix24 ، والتي تقوم بإرجاع CallID ، والتي تكون مطلوبة بعد ذلك للإبلاغ عن معلمات المكالمة ورابط للتسجيل. يتطلب إما الرقم الداخلي أو معرف المستخدم

فهم FreePBX ودمجها مع Bitrix24 والمزيد

بعد انتهاء المكالمة ، يتم استدعاء وظيفة تنزيل السجل ، والتي تقوم في نفس الوقت بالإبلاغ عن حالة إكمال المكالمة (مشغول ، لا يوجد رد ، نجاح) ، وتنزيل أيضًا رابطًا إلى ملف mp3 مع السجل (إن وجد).

نظرًا لأن الوحدة النمطية CallMeIn.php تحتاج إلى التشغيل بشكل مستمر ، فقد تم إنشاء ملف بدء تشغيل SystemD لها خدمة callme، والتي يجب وضعها في /etc/systemd/system/callme.service

[Unit]
Description=CallMe

[Service]
WorkingDirectory=/var/www/html/callmeplus
ExecStart=/usr/bin/php /var/www/html/callmeplus/CallMeIn.php 2>&1 >>/var/log/callmeplus.log
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGKILL

Restart=on-failure
RestartSec=10s

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

تتم تهيئة وإطلاق البرنامج النصي من خلال systemctl أو الخدمة

# systemctl enable callme
# systemctl start callme

ستتم إعادة تشغيل الخدمة من تلقاء نفسها حسب الحاجة (في حالة حدوث أعطال). لا تتطلب خدمة تتبع البريد الوارد تثبيت خادم ويب ، بل يلزم فقط php (وهو بالتأكيد موجود على خادم FeePBX). ولكن في غياب الوصول إلى سجلات المكالمات من خلال خادم الويب (أيضًا مع https) ، لن يكون من الممكن الاستماع إلى سجلات المكالمات.

الآن دعنا نتحدث عن المكالمات الصادرة. يحتوي البرنامج النصي CallMeOut.php على وظيفتين:

  • بدء مكالمة عند تلقي طلب لبرنامج نصي php (بما في ذلك استخدام زر "Call" في Bitrix نفسها). لا يعمل بدون خادم ويب ، يتم استلام الطلب عبر HTTP POST ، يحتوي الطلب على رمز مميز

  • رسالة حول المكالمة ومعلماتها وسجلاتها في Bitrix. تم التشغيل بواسطة النجمة في مخطط الطلب [الفرعي - الداخلي - المنتهي] عند انتهاء المكالمة

فهم FreePBX ودمجها مع Bitrix24 والمزيد

خادم الويب مطلوب فقط لأمرين - تنزيل ملفات سجل Bitrix (عبر HTTPS) واستدعاء البرنامج النصي CallMeOut.php. يمكنك استخدام خادم FreePBX المدمج ، الملفات الخاصة بها / var / www / html ، يمكنك تثبيت خادم آخر أو تحديد مسار مختلف.

قاعدة بيانات للانترنت

دعنا نترك إعداد خادم الويب للدراسة المستقلة (tyts, tyts, tyts). إذا لم يكن لديك مجال ، يمكنك تجربة FreeDomain ( https://www.freenom.com/ru/index.html) ، والذي سيمنحك اسمًا مجانيًا لعنوان IP الأبيض الخاص بك (لا تنس إعادة توجيه المنافذ 80 ، 443 من خلال جهاز التوجيه إذا كان العنوان الخارجي موجودًا عليه فقط). إذا قمت للتو بإنشاء مجال DNS ، فعليك الانتظار (من 15 دقيقة إلى 48 ساعة) حتى يتم تحميل جميع الخوادم. وفقًا لتجربة العمل مع مقدمي الخدمة المحليين - من ساعة واحدة إلى يوم واحد.

أتمتة التثبيت

تم تطوير أداة التثبيت على جيثب لتسهيل عملية التثبيت. لكن الأمر كان سلسًا على الورق - أثناء قيامنا بتثبيته يدويًا ، لأنه بعد إصلاح كل هذا أصبح واضحًا تمامًا ما هو الأصدقاء مع من ، ومن يذهب إلى أين وكيف يتم تصحيحه. لا يوجد مثبت حتى الان

عامل في حوض السفن

إذا كنت ترغب في تجربة الحل بسرعة - هناك خيار مع Docker - قم بإنشاء حاوية بسرعة ، ومنحها منافذ إلى الخارج ، وقم بسحب ملفات الإعدادات وحاول (هذا هو الخيار مع حاوية LetsEncrypt ، إذا كان لديك بالفعل شهادة ، تحتاج فقط إلى إعادة توجيه الوكيل العكسي إلى خادم الويب FreePBX (أعطيناه منفذًا آخر هو 88) ، LetsEncrypt في عامل الإرساء بناءً على هذا المقال

تحتاج إلى تشغيل الملف في مجلد المشروع الذي تم تنزيله (بعد git clone) ، ولكن عليك أولاً الدخول إلى تكوينات النجمة (مجلد النجمة) وكتابة المسارات إلى السجلات وعنوان URL الخاص بموقعك هناك

version: '3.3'
services:
  nginx:
    image: nginx:1.15-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/ssl_docker.conf:/etc/nginx/conf.d/ssl_docker.conf
  certbot:
    image: certbot/certbot
  freepbx:
    image: flaviostutz/freepbx
    ports:
      - 88:80 # для настройки
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # для CallMeOut.php
#      - 3306:3306
      - 18000-18100:18000-18100/udp
    restart: always
    environment:
      - ADMIN_PASSWORD=admin123
    volumes:
      - backup:/backup
      - recordings:/var/spool/asterisk/monitor
      - ./callme:/var/www/html/callme
      - ./systemd/callme.service:/etc/systemd/system/callme.conf
      - ./asterisk/manager_custom.conf:/etc/asterisk/manager_custom.conf
      - ./asterisk/extensions_custom.conf:/etc/asterisk/extensions_custom.conf
#      - ./conf/startup.sh:/startup.sh

volumes:
  backup:
  recordings:

يتم تشغيل ملف docker-compose.yaml هذا عبر

docker-compose up -d

إذا لم يبدأ nginx ، فهذا يعني أن هناك خطأ ما في التكوين في مجلد nginx / ssl_docker.conf

تكاملات أخرى

ولماذا لا نضع بعض CRM في البرامج النصية في نفس الوقت ، كما اعتقدنا. لقد درسنا العديد من واجهات برمجة تطبيقات CRM الأخرى ، خاصةً نظام PBX المدمج المجاني - ShugarCRM و Vtiger ، ونعم! نعم ، المبدأ هو نفسه. لكن هذه قصة أخرى ، سنقوم لاحقًا بتحميلها على github بشكل منفصل.

مراجع

إخلاء المسئولية: أي شبه بالواقع وهمي ولم أكن أنا.

المصدر: www.habr.com

إضافة تعليق