ทำความเข้าใจกับ FreePBX และผสานรวมกับ Bitrix24 และอีกมากมาย

Bitrix24 เป็นการรวมกันขนาดใหญ่ที่รวม CRM เวิร์กโฟลว์ การบัญชี และสิ่งอื่นๆ อีกมากมายที่ผู้จัดการชอบและพนักงานไอทีไม่ชอบจริงๆ พอร์ทัลนี้ถูกใช้โดยบริษัทขนาดเล็กและขนาดกลางจำนวนมาก รวมถึงคลินิกขนาดเล็ก ผู้ผลิต และแม้แต่สถานเสริมความงาม หน้าที่หลักที่ผู้จัดการ "รัก" คือการรวมระบบโทรศัพท์และ CRM เมื่อมีการบันทึกการโทรใดๆ ลงใน CRM ทันที การ์ดลูกค้าจะถูกสร้างขึ้น เมื่อมีสายเข้า ข้อมูลเกี่ยวกับลูกค้าจะปรากฏขึ้น และคุณสามารถดูได้ทันทีว่าเขาเป็นใคร อะไร ขายได้และเป็นหนี้เท่าไร แต่ระบบโทรศัพท์จาก Bitrix24 และการผสานรวมกับ CRM ทำให้เสียเงิน บางครั้งก็มาก ในบทความฉันจะบอกคุณถึงประสบการณ์การรวมเข้ากับเครื่องมือแบบเปิดและ IP PBX ยอดนิยม ฟรีและพิจารณาตรรกะของการทำงานของส่วนต่างๆ

ฉันทำงานเป็นเอาท์ซอร์สในบริษัทที่ขายและกำหนดค่า รวมระบบโทรศัพท์ IP เมื่อฉันถูกถามว่าเราสามารถเสนอบางอย่างให้กับบริษัทนี้และบริษัทนี้เพื่อผสานรวม Bitrix24 กับ PBX ที่ลูกค้ามี รวมถึง PBX เสมือนในบริษัท VDS ต่างๆ ได้หรือไม่ ฉันไปที่ Google และแน่นอนเขาให้ลิงค์กับฉัน บทความใน Habrซึ่งมีคำอธิบายและ GitHub และทุกอย่างดูเหมือนจะใช้งานได้ แต่เมื่อลองใช้โซลูชันนี้ ปรากฎว่า Bitrix24 ไม่เหมือนเดิมอีกต่อไป และจำเป็นต้องทำใหม่อีกมาก นอกจากนี้ FreePBX ไม่ใช่เครื่องหมายดอกจันเปล่าๆ สำหรับคุณ คุณต้องคิดเกี่ยวกับวิธีการรวมการใช้งานง่ายและแผนการโทรแบบฮาร์ดคอร์ในไฟล์กำหนดค่า

เราศึกษาตรรกะของการทำงาน

ดังนั้นสำหรับผู้เริ่มต้น มันควรจะทำงานอย่างไร เมื่อรับสายจากภายนอก PBX (เหตุการณ์ SIP INVITE จากผู้ให้บริการ) การประมวลผลของแผนการโทร (แผนการโทร, แผนการโทร) จะเริ่มต้นขึ้น - กฎของสิ่งที่ต้องทำกับการโทร จากแพ็กเก็ตแรก คุณจะได้รับข้อมูลจำนวนมาก ซึ่งสามารถนำไปใช้ในกฎได้ เครื่องมือที่ยอดเยี่ยมสำหรับการศึกษาภายในของ SIP คือตัววิเคราะห์ งู (ลิงค์) ซึ่งติดตั้งง่ายๆ ในการกระจายยอดนิยมผ่าน 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 สำเร็จ สายจะเดินทางผ่านแผนหมุนหมายเลขใน "บริบท" ที่แตกต่างกัน บริบทจากมุมมองของ Asterisk คือชุดคำสั่งที่มีตัวเลข ซึ่งแต่ละชุดมีตัวกรองตามหมายเลขที่โทรออก (เรียกว่า exten สำหรับการโทรภายนอกที่ระยะเริ่มต้น exten=DID) คำสั่งในบรรทัด Dialplan สามารถเป็นอะไรก็ได้ - ฟังก์ชันภายใน (เช่น โทรหาสมาชิกภายใน - Dial()วางโทรศัพท์ลง - Hangup()) ตัวดำเนินการตามเงื่อนไข (IF, ELSE, ExecIF และอื่น ๆ ที่คล้ายกัน) การเปลี่ยนไปใช้กฎอื่น ๆ ของบริบทนี้ (Goto, GotoIF) เปลี่ยนไปใช้บริบทอื่นในรูปแบบของการเรียกใช้ฟังก์ชัน (Gosub, Macro) คำสั่งแยกต่างหาก include имя_контекста, ซึ่งเพิ่มคำสั่งจากบริบทอื่นต่อท้ายบริบทปัจจุบัน คำสั่งที่รวมอยู่ในการรวมจะถูกดำเนินการเสมอ หลังจาก คำสั่งของบริบทปัจจุบัน

ตรรกะทั้งหมดของ FreePBX สร้างขึ้นจากการรวมบริบทที่แตกต่างกันเข้าด้วยกันผ่านการรวมและการเรียกผ่านตัวจัดการ Gosub, Macro และ Handler พิจารณาบริบทของการโทร FreePBX ที่เข้ามา

ทำความเข้าใจกับ FreePBX และผสานรวมกับ Bitrix24 และอีกมากมาย

การโทรจะผ่านบริบททั้งหมดจากบนลงล่าง ในแต่ละบริบทสามารถเรียกไปยังบริบทอื่นๆ เช่น มาโคร (Macro) ฟังก์ชัน (Gosub) หรือเพียงแค่การเปลี่ยนผ่าน (Goto) ดังนั้นแผนผังที่แท้จริงของสิ่งที่เรียกว่าทำได้เท่านั้น ติดตามได้ในบันทึก

ไดอะแกรมการตั้งค่าทั่วไปสำหรับ PBX ทั่วไปแสดงอยู่ด้านล่าง เมื่อโทร DID จะถูกค้นหาในเส้นทางขาเข้าเงื่อนไขชั่วคราวจะถูกตรวจสอบหากทุกอย่างเรียบร้อยเมนูเสียงจะเปิดขึ้น จากนั้นกดปุ่ม 1 หรือหมดเวลาออกไปยังกลุ่มตัวดำเนินการโทรออก หลังจากการโทรสิ้นสุดลง มาโครแฮงอัพคอลจะถูกเรียก หลังจากนั้นไม่สามารถดำเนินการใดๆ ในไดอัลแพลนได้ ยกเว้นตัวจัดการพิเศษ (ตัวจัดการแฮงอัป)

ทำความเข้าใจกับ FreePBX และผสานรวมกับ Bitrix24 และอีกมากมาย

ที่ใดในอัลกอริทึมการโทรนี้ เราควรให้ข้อมูลเกี่ยวกับการเริ่มต้นการโทรไปยัง CRM ที่ใดที่จะเริ่มบันทึก ที่ใดที่จะสิ้นสุดการบันทึก และส่งพร้อมกับข้อมูลเกี่ยวกับการโทรไปยัง CRM

บูรณาการกับระบบภายนอก

การรวม PBX และ CRM คืออะไร นี่คือการตั้งค่าและโปรแกรมที่แปลงข้อมูลและเหตุการณ์ระหว่างสองแพลตฟอร์มนี้และส่งข้อมูลให้กันและกัน วิธีทั่วไปที่สุดสำหรับระบบอิสระในการสื่อสารคือผ่าน API และวิธีที่ได้รับความนิยมมากที่สุดในการเข้าถึง API คือ HTTP REST แต่ไม่ใช่สำหรับเครื่องหมายดอกจัน

เครื่องหมายดอกจันด้านในคือ:

  • AGI - การเรียกใช้โปรแกรม/คอมโพเนนต์ภายนอกแบบซิงโครนัส ใช้เป็นหลักในแผนการโทร มีไลบรารีเช่น phpagi, เพจจิ

  • AMI - ซ็อกเก็ตข้อความ TCP ที่ทำงานบนหลักการสมัครรับเหตุการณ์และป้อนคำสั่งข้อความ คล้ายกับ SMTP จากภายใน สามารถติดตามเหตุการณ์และจัดการการโทร มีไลบรารี ปามิ - เป็นที่นิยมมากที่สุดสำหรับการสร้างการเชื่อมต่อกับ Asterisk

ตัวอย่างเอาต์พุต AMI

เหตุการณ์: ช่องใหม่
สิทธิพิเศษ: โทรทั้งหมด
ช่อง: PJSIP/VMS_pjsip-0000078b
สถานะช่อง: 4
ChannelStateDesc: แหวน
หมายเลขผู้โทร: 111222
หมายเลขผู้โทร: 111222
เชื่อมต่อ LineNum:
ชื่อสายที่เชื่อมต่อ:
ภาษา: อังกฤษ
รหัสบัญชี:
บริบท: from-pstn
ขยาย: s
ลำดับความสำคัญ: 1
รหัสเฉพาะ: 1599589046.5244
รหัสลิงค์: 1599589046.5244

  • ARI เป็นส่วนผสมของทั้งสองอย่างทั้งหมดผ่าน REST, WebSocket ในรูปแบบ JSON - แต่ด้วยไลบรารี่และ wrapper ใหม่ไม่ค่อยดีนัก (เพาพาเรีย, พปาริ) ซึ่งเริ่มพัฒนาเมื่อประมาณ 3 ปีที่แล้ว

ตัวอย่างเอาต์พุต ARI เมื่อเริ่มการโทร

{ "ตัวแปร":"CallMeCallerIDName", "value":"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″ }, "connected":{ "name":"", "number" :"" }, "รหัสบัญชี":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appชื่อ":"ชะงักงัน", "แอปdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "เครื่องหมายดอกจันid":"48:5b:aa:aa:aa:aa", "แอปพลิเคชัน":"สวัสดีชาวโลก" }

ความสะดวกหรือความไม่สะดวก ความเป็นไปได้หรือความเป็นไปไม่ได้ในการทำงานกับ API หนึ่งๆ จะถูกกำหนดโดยงานที่ต้องแก้ไข งานสำหรับการรวมเข้ากับ CRM มีดังนี้:

  • ติดตามจุดเริ่มต้นของการโทร, ตำแหน่งที่โอน, ดึงเอาหมายเลขผู้โทร, 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

เชื่อมต่อ LineNum:

ชื่อสายที่เชื่อมต่อ:

ภาษา: อังกฤษ

รหัสบัญชี:

บริบท: from-pstn

ขยาย: s

ลำดับความสำคัญ: 1

รหัสเฉพาะ: 1599589046.5244

รหัสลิงค์: 1599589046.5244

แอปพลิเคชัน: ตั้งค่า AppData:

โทรเริ่ม=1599571046

เนื่องจาก FreePBX จะเขียนทับไฟล์เพิ่มเติม.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

คุณสมบัติและความแตกต่างจากแผนโทรดั้งเดิมของผู้เขียนบทความต้นฉบับ -

  • Dialplan ในรูปแบบ .conf ตามที่ FreePBX ต้องการ (ใช่ มันสามารถ .ael ได้ แต่ไม่ใช่ทุกเวอร์ชัน และไม่สะดวกเสมอไป)

  • แทนที่จะประมวลผลการสิ้นสุดผ่าน exten=>h การประมวลผลถูกนำมาใช้ผ่าน hangup_handler เนื่องจากแป้นหมุนหมายเลข FreePBX ใช้งานได้กับมันเท่านั้น

  • แก้ไขสตริงการเรียกสคริปต์ เพิ่มเครื่องหมายคำพูด และหมายเลขเรียกภายนอก ExtNum

  • การประมวลผลจะถูกย้ายไปที่ _custom บริบท และอนุญาตให้คุณไม่แตะต้องหรือแก้ไขการกำหนดค่า FreePBX - ที่เข้ามาผ่าน [อดีตไม่ได้กำหนดเอง] ขาออกผ่าน [ขาออก allroutes กำหนดเอง]

  • ไม่มีการผูกกับตัวเลข - ไฟล์เป็นสากลและจำเป็นต้องกำหนดค่าสำหรับพาธและลิงก์ไปยังเซิร์ฟเวอร์เท่านั้น

ในการเริ่มต้น คุณต้องเรียกใช้สคริปต์ใน 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 กัน

การเริ่มต้นสคริปต์และการสร้างบริการ

เนื่องจากรูปแบบการทำงานกับ Bitrix 24 ซึ่งเป็นบริการสำหรับ AMI นั้นไม่เรียบง่ายและโปร่งใสโดยสิ้นเชิง จึงควรมีการหารือแยกกัน เครื่องหมายดอกจัน เมื่อเปิดใช้งาน AMI เพียงแค่เปิดพอร์ต แค่นั้น เมื่อไคลเอ็นต์เข้าร่วม ไคลเอ็นต์จะขออนุญาต จากนั้นไคลเอ็นต์จะสมัครรับข้อมูลกิจกรรมที่จำเป็น เหตุการณ์มาในรูปแบบข้อความธรรมดา ซึ่ง PAMI แปลงเป็นวัตถุที่มีโครงสร้างและให้ความสามารถในการตั้งค่าฟังก์ชันการกรองเฉพาะสำหรับเหตุการณ์ที่น่าสนใจ ฟิลด์ ตัวเลข ฯลฯ

ทันทีที่มีการโทรเข้ามา เหตุการณ์ NewExten จะเริ่มทำงานโดยเริ่มจากบริบทพาเรนต์ [from-pstn] จากนั้นเหตุการณ์ทั้งหมดจะดำเนินไปตามลำดับของบรรทัดในบริบท เมื่อได้รับข้อมูลจากตัวแปร CallMeCallerIDName และ CallStart ที่ระบุใน _custom dialplan

  1. ฟังก์ชั่นขอ UserID ตรงกับเบอร์ต่อที่โทรเข้ามา เกิดอะไรขึ้นถ้าเป็นกลุ่มการโทร? คำถามคือเรื่องการเมือง คุณต้องสร้างการโทรถึงทุกคนพร้อมกัน (เมื่อทุกคนโทรพร้อมกัน) หรือสร้างตามที่พวกเขาโทรเมื่อโทรถึงกัน ลูกค้าส่วนใหญ่มีกลยุทธ์ Fisrt Available ดังนั้นจึงไม่มีปัญหากับสิ่งนี้ เพียงเรียกเพียงครั้งเดียว แต่ปัญหาต้องได้รับการแก้ไข

  2. ฟังก์ชันการลงทะเบียนการโทรใน Bitrix24 ซึ่งส่งคืน CallID ซึ่งจำเป็นต่อการรายงานพารามิเตอร์การโทรและลิงก์ไปยังการบันทึก ต้องการหมายเลขต่อหรือ UserID

ทำความเข้าใจกับ 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 (รวมถึงการใช้ปุ่ม "โทร" ใน Bitrix เอง) มันไม่ทำงานหากไม่มีเว็บเซิร์ฟเวอร์ คำขอได้รับผ่าน HTTP POST คำขอมีโทเค็น

  • ข้อความเกี่ยวกับการโทร พารามิเตอร์ และบันทึกใน Bitrix เรียกใช้โดยเครื่องหมายดอกจันในแผนการโทร [sub-call-internal-ended] เมื่อสิ้นสุดการโทร

ทำความเข้าใจกับ 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 - สร้างคอนเทนเนอร์อย่างรวดเร็ว ปล่อยพอร์ตภายนอก ส่งไฟล์การตั้งค่า และลองใช้ (นี่คือตัวเลือกสำหรับคอนเทนเนอร์ 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 APIs อื่น ๆ หลายตัว โดยเฉพาะ PBX ในตัวฟรี - ShugarCRM และ Vtiger และใช่! ใช่หลักการเหมือนกัน แต่นี่เป็นอีกเรื่องหนึ่งซึ่งเราจะอัปโหลดไปยัง GitHub แยกต่างหากในภายหลัง

การอ้างอิง

ข้อจำกัดความรับผิดชอบ: ความคล้ายคลึงกับความเป็นจริงใดๆ นั้นเป็นเรื่องสมมติและไม่ใช่ฉัน

ที่มา: will.com

เพิ่มความคิดเห็น