FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Bitrix24 нь CRM, ажлын урсгал, нягтлан бодох бүртгэл болон менежерүүдэд үнэхээр таалагддаг, мэдээллийн технологийн ажилтнуудад үнэхээр дургүй байдаг бусад олон зүйлийг хослуулсан асар том хослол юм. Порталыг жижиг эмнэлгүүд, үйлдвэрлэгчид, тэр ч байтугай гоо сайхны салон зэрэг олон жижиг, дунд компаниуд ашигладаг. Менежерүүдийн "дуртай" гол үүрэг бол утас, CRM-ийг нэгтгэх явдал бөгөөд аливаа дуудлагыг CRM-д шууд бүртгэж, үйлчлүүлэгчийн картыг үүсгэж, ирэх үед үйлчлүүлэгчийн тухай мэдээлэл гарч ирэх бөгөөд та түүнийг хэн болохыг, тэр юу болохыг шууд харах боломжтой болно. зарж болно, хэр их өртэй. Гэхдээ Bitrix24-ийн утас, CRM-тэй нэгтгэх нь мөнгө, заримдаа маш их зардал шаарддаг. Нийтлэлд би нээлттэй хэрэгслүүд болон алдартай IP PBX-тэй нэгтгэх туршлагыг танд хэлэх болно ҮнэгүйPBX, мөн янз бүрийн хэсгүүдийн ажлын логикийг анхаарч үзээрэй

Би IP телефонийг борлуулдаг, тохируулдаг, нэгтгэдэг компанид аутсорсероор ажилладаг. Bitrix24-ийг хэрэглэгчдэд байдаг PBX-тэй, мөн янз бүрийн VDS компаниудын виртуаль PBX-уудтай нэгтгэхийн тулд бид энэ болон энэ компанид ямар нэг зүйл санал болгож болох уу гэж надаас асуухад би Google-д очсон. Тэгээд мэдээж тэр надад холбоос өгсөн habr дахь нийтлэл, энд тайлбар, github байгаа бөгөөд бүх зүйл ажиллаж байгаа юм шиг санагддаг. Гэхдээ энэ шийдлийг ашиглахыг оролдох үед Bitrix24 нь өмнөх шигээ байхаа больсон тул дахин хийх шаардлагатай болсон. Нэмж дурдахад, FreePBX нь таны хувьд нүцгэн од биш тул та тохиргооны файлд ашиглахад хялбар, хатуу залгах төлөвлөгөөг хэрхэн хослуулах талаар бодох хэрэгтэй.

Бид ажлын логикийг судалдаг

Тиймээс эхлэгчдэд энэ бүхэн хэрхэн ажиллах ёстой вэ. PBX-ийн гаднаас дуудлага хүлээн авах үед (үйлчилгээ үзүүлэгчээс SIP INVITE үйл явдал) залгах төлөвлөгөөг боловсруулах (залгах төлөвлөгөө, залгах төлөвлөгөө) эхэлдэг - дуудлагад юу, ямар дарааллаар хийх дүрмүүд. Эхний багцаас та маш их мэдээлэл авах боломжтой бөгөөд дараа нь дүрэмд ашиглаж болно. SIP-ийн дотоод байдлыг судлах маш сайн хэрэгсэл бол анализатор юм sngrep (ссылка) нь энгийн түгээлтүүдэд apt install/yum install гэх мэтээр суулгадаг боловч эх сурвалжаас нь бүтээж болно. sngrep дахь дуудлагын бүртгэлийг харцгаая

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Хялбаршуулсан хэлбэрээр залгах төлөвлөгөө нь зөвхөн эхний пакеттай, заримдаа ярианы үеэр дуудлага дамжуулж, товчлуурыг дарах (DTMF), FollowMe, RingGroup, IVR болон бусад сонирхолтой зүйлсийг харуулдаг.

Урилгын багц дотор юу байна

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Үнэндээ ихэнх энгийн залгах төлөвлөгөөнүүд эхний хоёр талбартай ажилладаг бөгөөд бүх логик нь DID болон CallerID-ийн эргэн тойронд эргэлддэг. DID - бидний залгаж байгаа газар, CallerID - хэн залгаж байна.

Эцсийн эцэст бид нэг компанитай бөгөөд нэг утас биш - энэ нь PBX нь хотын дугаар (Ring Group), IVR (Сайн уу, та залгасан ... Хэвлэл) дээр дуудлагын бүлгүүд (хэд хэдэн төхөөрөмжийн нэгэн зэрэг / дараалан дуугарах) байдаг гэсэн үг юм. нэг нь ...), Хариулах машин ( Үг хэллэг), Цагийн нөхцөл, Бусад тоо эсвэл нүд рүү дамжуулах (FollowMe, Forward). Энэ нь дуудлага ирэхэд хэн нь дуудлага хүлээн авах, хэнтэй харилцахыг хоёрдмол утгагүй тодорхойлоход маш хэцүү гэсэн үг юм. Манай үйлчлүүлэгчдийн PBX-д ердийн дуудлагын эхлэлийн жишээ энд байна

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Дуудлага PBX-д амжилттай орсны дараа өөр өөр "контекст"-д залгах төлөвлөгөөгөөр дамждаг. Оддын үүднээс контекст нь дугаарлагдсан командуудын багц бөгөөд тус бүр нь залгасан дугаарын шүүлтүүрийг агуулдаг (энэ нь эхний шатанд гадаад дуудлагын хувьд exten = DID гэж нэрлэгддэг). Залгах шугам дахь командууд нь юу ч байж болно - дотоод функцууд (жишээлбэл, дотоод захиалагч руу залгах - Dial(), утсаа тавь - Hangup()), нөхцөлт операторууд (IF, ELSE, ExecIF гэх мэт), энэ агуулгын бусад дүрэмд шилжих (Goto, GotoIF), функцийн дуудлагын хэлбэрээр бусад контекст руу шилжих (Gosub, Macro). Тусдаа заавар include имя_контекста, Энэ нь одоогийн контекстийн төгсгөлд өөр контекстээс тушаалуудыг нэмдэг. Include-ээр орсон командууд үргэлж биелэгддэг после одоогийн контекстийн командууд.

FreePBX-ийн бүх логик нь Gosub, Macro болон Handler зохицуулагчаар дамжуулан оруулах, дуудах замаар өөр өөр контекстүүдийг бие биедээ оруулах дээр суурилдаг. Ирж буй FreePBX дуудлагын контекстийг анхаарч үзээрэй

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Дуудлага нь бүх контекстийг дээрээс доош ээлжлэн дамждаг бөгөөд контекст бүрт макро (Макро), функцууд (Gosub) эсвэл зүгээр л шилжилтүүд (Goto) гэх мэт бусад контекст руу залгах боломжтой тул дуудагдсан зүйлийн жинхэнэ мод нь зөвхөн боломжтой. бүртгэлд бүртгэнэ.

Ердийн PBX-ийн ердийн тохиргооны диаграммыг доор үзүүлэв. Дуудлага хийх үед DID-г ирж буй чиглэлд хайж, түр зуурын нөхцөлийг шалгаж, бүх зүйл эмх цэгцтэй байвал дуут цэсийг ажиллуулна. Үүнээс 1 товчлуур эсвэл завсарлага дээр дарж залгах операторуудын бүлэгт гарна уу. Дуудлага дууссаны дараа hangupcall макро дуудагдах ба дараа нь залгах төлөвлөгөөнд тусгай зохицуулагчаас (гацаа зохицуулагч) өөр юу ч хийх боломжгүй.

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Энэ дуудлагын алгоритмын хаана нь бид CRM руу дуудлагын эхлэл, хаана бичиж эхлэх, бичлэгийг хаана дуусгах, CRM руу дуудлагын талаарх мэдээллийн хамт илгээх ёстой вэ?

Гадаад системтэй нэгтгэх

PBX болон CRM интеграци гэж юу вэ? Эдгээр нь эдгээр хоёр платформын хооронд өгөгдөл, үйл явдлуудыг хөрвүүлж, бие биедээ илгээдэг тохиргоо, програмууд юм. Бие даасан системүүдийн харилцах хамгийн түгээмэл арга бол API-ууд бөгөөд API-д хандах хамгийн түгээмэл арга бол HTTP REST юм. Гэхдээ одны хувьд биш.

Дотор од нь:

  • AGI - гадаад програмууд / бүрэлдэхүүн хэсгүүдэд синхрон дуудлага хийх, голчлон залгах төлөвлөгөөнд ашигладаг, гэх мэт сангууд байдаг. phpagi, PAGI

  • AMI - үйл явдалд бүртгүүлэх, текст команд оруулах зарчмаар ажилладаг текстийн TCP залгуур, дотроос SMTP-тэй төстэй, үйл явдлыг хянах, дуудлагыг удирдах боломжтой, номын сан байдаг. ПАМИ - одтой холболт үүсгэх хамгийн алдартай

AMI гаралтын жишээ

Үйл явдал: Шинэ суваг
Давуу эрх: дуудлага, бүгд
Суваг: PJSIP/VMS_pjsip-0000078b
Сувгийн төлөв: 4
ChannelStateDesc: Дуугарна
Дуудлагын дугаар: 111222
Дуудлагын дугаар: 111222
ConnectedLineNum:
холбогдсон шугамын нэр:
Хэл: en
дансны код:
Контекст: from-pstn
Өргөтгөсөн: с
Тэргүүлэх чиглэл: 1
Өвөрмөц: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI нь REST, WebSocket, JSON форматаар хоёулангийнх нь холимог боловч шинэ номын сан, боодолтой, тийм ч сайн биш, шууд олдсон (phparia, phpari) нь 3 жилийн өмнө тэдний хөгжилд орсон.

Дуудлага эхлүүлэх үед ARI гаралтын жишээ

{ "variable":"CallMeCallerIDName", "утга":"111222", "төрөл":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "суваг":{ "id" »:»1599644315.5334″, «нэр»:»PJSIP/VMSpjsip-000007b6″, "төлөв":"Ring", "дуудагч":{ "нэр":"111222″, "тоо":"111222″ }, "холбогдсон":{ "нэр":"", "тоо" :"" }, "дансны код":"", "dialplan":{ "контекст":"from-pstn", "exten":"s", "priority":2, "appнэр":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "хэл":"en" }, "од"id":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Тохиромжтой эсвэл тохиромжгүй байдал, тодорхой API-тай ажиллах боломж эсвэл боломжгүй байдал нь шийдвэрлэх шаардлагатай ажлуудаар тодорхойлогддог. CRM-тэй нэгтгэх даалгаврууд нь дараах байдалтай байна.

  • Дуудлагын эхэн үе, хаана шилжүүлсэн, дуудлагын ID, DID, эхлэх, дуусах цаг, магадгүй лавлахаас өгөгдөл гаргаж аваарай (утас болон CRM хэрэглэгчийн хоорондох холболтыг хайх)

  • Дуудлагын бичлэгийг эхлүүлэх, дуусгах, хүссэн форматаар хадгалах, бичлэгийн төгсгөлд файл хаана байгааг мэдэгдэх.

  • Гадны үйл явдал (хөтөлбөрөөс) дээр дуудлага эхлүүлэх, дотоод дугаар, гадаад дугаар руу залгаж, тэдгээрийг холбох

  • Нэмэлт: газар байхгүй үед дуудлагыг автоматаар дамжуулахын тулд CRM, залгах бүлгүүд болон FollowME-тэй нэгтгэх (CRM-ийн дагуу)

Эдгээр бүх ажлыг AMI эсвэл ARI-ээр дамжуулан шийдэж болох боловч ARI нь маш бага мэдээлэл өгдөг, олон үйл явдал байдаггүй, AMI-д байгаа олон хувьсагчдыг (жишээ нь, макро дуудлага, макро доторх хувьсагчдыг тохируулах, дуудлагын бичлэг гэх мэт) хянадаггүй. Тиймээс зөв, үнэн зөв хянахын тулд одоохондоо AMI-г сонгоцгооё (гэхдээ бүрэн биш). Нэмж дурдахад (энэгүйгээр хаана байх байсан бэ, бид залхуу хүмүүс) - анхны бүтээлд (habr дахь нийтлэл) PAMI ашиглах. *Дараа нь та ARI руу дахин бичихийг оролдох хэрэгтэй, гэхдээ энэ нь ажиллахгүй.

Интеграцчлалыг сэргээж байна

Манай FreePBX нь дуудлагын эхлэл, дуусах цаг, дугаар, бичигдсэн файлын нэрсийн талаар AMI-д энгийн байдлаар мэдээлэх боломжтой байхын тулд анхны зохиогчдын нэгэн адил заль мэхийг ашиглан дуудлагын үргэлжлэх хугацааг тооцоолоход хялбар байдаг. - хувьсагчаа оруулаад гаралтыг тэдгээрийн байгаа эсэхийг шинжлэх. PAMI үүнийг шүүлтүүрийн функцээр дамжуулан хийхийг санал болгож байна.

Дуудлагын эхлэх цагийг өөрийн хувьсагчаар тохируулах жишээ энд байна (s нь DID хайлтыг эхлүүлэхээс ӨМНӨ хийгдэх залгах төлөвлөгөөнд байгаа тусгай дугаар юм)

[ext-did-custom]

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

Энэ шугамын жишээ AMI үйл явдал

Үйл явдал: Шинэ суваг

Давуу эрх: дуудлага, бүгд

Суваг: PJSIP/VMS_pjsip-0000078b

Сувгийн төлөв: 4

ChannelStateDesc: Дуугарна

Дуудлагын дугаар: 111222

Дуудлагын дугаар: 111222

ConnectedLineNum:

холбогдсон шугамын нэр:

Хэл: en

дансны код:

Контекст: from-pstn

Өргөтгөсөн: с

Тэргүүлэх чиглэл: 1

Өвөрмөц: 1599589046.5244

Linkedid: 1599589046.5244

Програм: AppData тохируулах:

CallStart=1599571046

Учир нь FreePBX өргөтгөл.conf болон өргөтгөл_ файлуудыг дарж бичдэгнэмэлт.conf, бид файлыг ашиглах болно өргөтгөл_өөрчлөн.conf

Extension_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

Анхны нийтлэлийн зохиогчдын анхны залгах төлөвлөгөөний онцлог, ялгаа -

  • FreePBX-ийн хүссэнээр .conf форматаар залгах (тиймээ, энэ нь .ael байж болно, гэхдээ бүх хувилбарт биш бөгөөд энэ нь үргэлж тохиромжтой биш юм)

  • Төгсгөлийг exten=>h-ээр боловсруулахын оронд hangup_handler-ээр дамжуулан боловсруулалтыг нэвтрүүлсэн, учир нь FreePBX залгах төлөвлөгөө зөвхөн түүнтэй ажилладаг байсан.

  • Тогтмол скрипт дуудлагын мөр, нэмэгдсэн ишлэл болон гадаад дуудлагын дугаар ExtNum

  • Боловсруулалт нь _custom contexts руу шилжиж, FreePBX тохиргоонд хүрэх эсвэл засварлахгүй байх боломжийг олгодог - орж ирж буй [ext-did-customized], [-ээр дамжуулж байнаoutbound-allroutes-custom]

  • Тоонууд руу залгах шаардлагагүй - файл нь бүх нийтийнх бөгөөд зөвхөн зам болон сервер рүү холбоход тохируулах шаардлагатай

Эхлэхийн тулд та AMI-д нэвтрэх болон нууц үгээр скриптүүдийг ажиллуулах хэрэгтэй - үүний тулд FreePBX нь _custom файлтай.

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 руу шилжье

Скриптүүдийг эхлүүлэх, үйлчилгээ үүсгэх

AMI-д зориулсан үйлчилгээ болох Bitrix 24-тэй ажиллах схем нь тийм ч энгийн бөгөөд ил тод биш тул үүнийг тусад нь хэлэлцэх ёстой. Од, AMI идэвхжсэн үед портыг нээгээд л болоо. Үйлчлүүлэгч нэгдэх үед зөвшөөрөл хүсч, дараа нь үйлчлүүлэгч шаардлагатай арга хэмжээнд бүртгүүлдэг. Үйл явдлууд нь энгийн текст хэлбэрээр ирдэг бөгөөд үүнийг PAMI нь бүтэцлэгдсэн объект болгон хувиргадаг бөгөөд зөвхөн сонирхолтой үйл явдал, талбар, тоо гэх мэт шүүлтүүрийн функцийг тохируулах боломжийг олгодог.

Дуудлага ирсэн даруйд NewExten үйл явдал нь эх [from-pstn] контекстээс эхлэн идэвхжиж, дараа нь бүх үйл явдал контекст дэх мөрүүдийн дарааллаар явагдана. Тусгай залгах төлөвлөгөөнд заасан CallMeCallerIDName болон CallStart хувьсагчдаас мэдээлэл хүлээн авах үед

  1. Дуудлага ирсэн өргөтгөлийн дугаарт тохирох Хэрэглэгчийн ID-г хүсэх функц. Хэрэв энэ нь dial-up групп байвал яах вэ? Асуулт нь улс төрийн шинжтэй байна, та бүгдэд нэг дор (бүгд нэгэн зэрэг залгахад) дуудлага үүсгэх шаардлагатай юу эсвэл ээлжлэн залгах үед тэдний дууддаг шиг үүсгэх шаардлагатай юу? Ихэнх үйлчлүүлэгчид Fisrt Available стратеги байдаг тул үүнд ямар ч асуудал байхгүй, зөвхөн нэг л дуудлага ирдэг. Гэхдээ асуудлыг шийдэх хэрэгтэй.

  2. Bitrix24 дахь дуудлагын бүртгэлийн функц нь CallID-г буцаадаг бөгөөд энэ нь дуудлагын параметрүүд болон бичлэгийн холбоосыг мэдээлэх шаардлагатай. Өргөтгөлийн дугаар эсвэл UserID шаардлагатай

FreePBX-ийг ойлгож, Bitrix24 болон бусад зүйлстэй нэгтгэх

Дуудлага дууссаны дараа бичлэгийг татаж авах функц дуудагддаг бөгөөд энэ нь дуудлага дууссаны төлөвийг нэгэн зэрэг мэдээлдэг (Завгүй, Хариултгүй, Амжилттай), мөн бичлэгийн хамт mp3 файлын холбоосыг (хэрэв байгаа бол) татаж авдаг.

CallMeIn.php модулийг тасралтгүй ажиллуулах шаардлагатай байдаг тул түүнд зориулж SystemD эхлүүлэх файлыг үүсгэсэн callme.service, үүнийг /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 скриптийн хүсэлтийг хүлээн авах үед дуудлага хийх (Битрикс өөрөө "Дуудлага" товчлуурыг ашиглах гэх мэт). Энэ нь вэб сервергүйгээр ажиллахгүй, хүсэлтийг 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 цаг хүртэл) хүлээх хэрэгтэй. Дотоодын үйлчилгээ үзүүлэгчтэй ажиллах туршлагаас харахад - 1 цагаас өдөрт.

Суурилуулалтын автоматжуулалт

Суулгацыг илүү хялбар болгох үүднээс github дээр суулгагчийг боловсруулсан. Гэхдээ энэ нь цаасан дээр гөлгөр байсан - бид бүгдийг гараар суулгаж байх үед энэ бүх зүйлийг сайтар судалсны дараа хэнтэй найзалж, хэн хаана очиж, хэрхэн дибаг хийх нь тодорхой болсон. Одоогоор суулгагч байхгүй байна

Docker

Хэрэв та шийдлийг хурдан туршиж үзэхийг хүсвэл - 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 API-г, ялангуяа үнэгүй суурилуулсан PBX - ShugarCRM болон Vtiger-ийг судалж үзсэн, тийм ээ! тиймээ, зарчим нь адилхан. Гэхдээ энэ бол өөр түүх бөгөөд бид дараа нь github-д тусад нь оруулах болно.

лавлагаа

Анхааруулга: Бодит байдалтай төстэй зүйл нь зохиомол бөгөөд би биш байсан.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх