์ ๋ IP ํ
๋ ํฌ๋๋ฅผ ํ๋งค ๋ฐ ๊ตฌ์ฑํ๊ณ ํตํฉํ๋ ํ์ฌ์์ ์์์์ฑ ์
์ฒด๋ก ์ผํ๊ณ ์์ต๋๋ค. Bitrix24๋ฅผ ๊ณ ๊ฐ์ด ๋ณด์ ํ PBX ๋ฐ ๋ค์ํ VDS ํ์ฌ์ ๊ฐ์ PBX์ ํตํฉํ๊ธฐ ์ํด ์ด๊ฒ๊ณผ ์ด ํ์ฌ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ํ ์ ์๋์ง ์ง๋ฌธ์ ๋ฐ์์ ๋ ์ ๋ Google๋ก ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๊ทธ๋ ๋์๊ฒ ๋งํฌ๋ฅผ ์ฃผ์๋ค
์ฐ๋ฆฌ๋ ์ผ์ ๋ ผ๋ฆฌ๋ฅผ ์ฐ๊ตฌํฉ๋๋ค
๋ฐ๋ผ์ ์ฐ์ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. PBX(์ ๊ณต์์ SIP INVITE ์ด๋ฒคํธ)์์ ์ธ๋ถ๋ก๋ถํฐ ์ ํ๋ฅผ ๋ฐ์ผ๋ฉด ๋ค์ด์ผํ๋(๋ค์ด์ผ ํ๋, ๋ค์ด์ผ ํ๋) ์ฒ๋ฆฌ๊ฐ ์์๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํจํท์์ ๊ท์น์ ์ฌ์ฉํ ์ ์๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค. SIP์ ๋ด๋ถ๋ฅผ ์ฐ๊ตฌํ๊ธฐ ์ํ ํ๋ฅญํ ๋๊ตฌ๋ ๋ถ์๊ธฐ์
๋๋ค. sngrep (
๋จ์ํ๋ ํํ์์ ๋ค์ด์ผํ๋์ ์ฒซ ๋ฒ์งธ ํจํท๋ง ์ฒ๋ฆฌํ๋ฉฐ ๋๋ก๋ ๋ํ ์ค์ ํตํ๊ฐ ์ ์ก๋๊ณ ๋ฒํผ ๋๋ฆ(DTMF), FollowMe, RingGroup, IVR ๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ํฅ๋ฏธ๋ก์ด ์ฌํญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ํฉ ๋ด์ฉ๋ฌผ
์ค์ ๋ก ๋๋ถ๋ถ์ ๊ฐ๋จํ ๋ค์ด์ผ ํ๋์ ์ฒ์ ๋ ํ๋์์ ์๋ํ๋ฉฐ ์ ์ฒด ๋ ผ๋ฆฌ๋ DID ๋ฐ CallerID๋ฅผ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. DID - ์ฐ๋ฆฌ๊ฐ ์ ํํ๋ ๊ณณ, CallerID - ์ ํํ๋ ์ฌ๋.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ํ๋์ ์ ํ๊ฐ ์๋ ํ์ฌ๊ฐ ์์ต๋๋ค. ์ฆ, PBX์๋ ๋์ ๋ฒํธ (Ring Group), IVR (Hello, you called ... Press)์ ํตํ ๊ทธ๋ฃน (์ฌ๋ฌ ์ฅ์น์ ๋์ / ์ฐ์ ๋ฒจ ์ธ๋ฆผ)์ด์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค ํ๋๋ ...), ์๋ต๊ธฐ(๋ฌธ๊ตฌ), ์๊ฐ ์กฐ๊ฑด, ๋ค๋ฅธ ๋ฒํธ ๋๋ ์ ๋ก ์ฐฉ์ ์ ํ(FollowMe, ์ฐฉ์ ์ ํ). ์ฆ, ์ค์ ๋ก ์ ํ๋ฅผ ๋ฐ์ ์ฌ๋๊ณผ ์ ํ๊ฐ ์์ ๋ ๋ํ๋ฅผ ๋๋ ์ฌ๋์ ๋ช ํํ๊ฒ ๊ฒฐ์ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๋ค์์ ๊ณ ๊ฐ์ PBX์์ ์ผ๋ฐ์ ์ธ ํตํ ์์์ ์์ ๋๋ค.
ํตํ๊ฐ PBX์ ์ฑ๊ณต์ ์ผ๋ก ๋ค์ด๊ฐ ํ ๋ค๋ฅธ "์ปจํ
์คํธ"์์ ๋ค์ด์ผ ํ๋์ ํตํด ์ด๋ํฉ๋๋ค. Asterisk์ ๊ด์ ์์ ์ปจํ
์คํธ๋ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง ๋ช
๋ น ์งํฉ์ด๋ฉฐ ๊ฐ ๋ช
๋ น์๋ ์ ํ๋ฅผ ๊ฑด ๋ฒํธ๋ณ๋ก ํํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค(exten=DID ์ด๊ธฐ ๋จ๊ณ์์ ์ธ๋ถ ํธ์ถ์ ๊ฒฝ์ฐ exten์ด๋ผ๊ณ ํจ). ๋ค์ด์ผํ๋ ๋ผ์ธ์ ๋ช
๋ น์ ๋ฌด์์ด๋ ๋ ์ ์์ต๋๋ค - ๋ด๋ถ ๊ธฐ๋ฅ(์: ๋ด๋ถ ๊ฐ์
์ ํธ์ถ - Dial()
, ์ ํ๊ธฐ ๋ด๋ ค๋ - Hangup()
), ์กฐ๊ฑด๋ถ ์ฐ์ฐ์(IF, ELSE, ExecIF
๋ฑ), ์ด ์ปจํ
์คํธ์ ๋ค๋ฅธ ๊ท์น์ผ๋ก ์ ํ(Goto, GotoIF
), ํจ์ ํธ์ถ(Gosub, Macro)์ ํํ๋ก ๋ค๋ฅธ ์ปจํ
์คํธ๋ก ์ ํํฉ๋๋ค. ๋ณ๋์ ์ง์นจ include ะธะผั_ะบะพะฝัะตะบััะฐ
, ๋ค๋ฅธ ์ปจํ
์คํธ์ ๋ช
๋ น์ ํ์ฌ ์ปจํ
์คํธ์ ๋์ ์ถ๊ฐํฉ๋๋ค. include๋ฅผ ํตํด ํฌํจ๋ ๋ช
๋ น์ ํญ์ ์คํ๋ฉ๋๋ค. ํ ํ์ฌ ์ปจํ
์คํธ์ ๋ช
๋ น.
FreePBX์ ์ ์ฒด ๋ ผ๋ฆฌ๋ Gosub, Macro ๋ฐ Handler ํธ๋ค๋ฌ๋ฅผ ํตํ ํฌํจ ๋ฐ ํธ์ถ์ ํตํด ์๋ก ๋ค๋ฅธ ์ปจํ ์คํธ๋ฅผ ํฌํจํ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ค์ด์ค๋ FreePBX ํธ์ถ์ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
ํธ์ถ์ ์์์ ์๋๋ก ์ฐจ๋ก๋ก ๋ชจ๋ ์ปจํ ์คํธ๋ฅผ ํต๊ณผํฉ๋๋ค. ๊ฐ ์ปจํ ์คํธ์์ ๋งคํฌ๋ก(Macro), ํจ์(Gosub) ๋๋ ์ ํ(Goto)๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ปจํ ์คํธ์ ๋ํ ํธ์ถ์ด ์์ ์ ์์ผ๋ฏ๋ก ํธ์ถ๋๋ ํญ๋ชฉ์ ์ค์ ํธ๋ฆฌ๋ ๋ก๊ทธ์์ ์ถ์ ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ PBX์ ์ผ๋ฐ์ ์ธ ์ค์ ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ ํ๋ฅผ ๊ฑธ๋ฉด ๋ค์ด์ค๋ ๊ฒฝ๋ก์์ DID๋ฅผ ๊ฒ์ํ๊ณ ์์ ์กฐ๊ฑด์ ํ์ธํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ฉด ์์ฑ ๋ฉ๋ด๊ฐ ์์๋ฉ๋๋ค. ๊ทธ๊ฒ์์ ๋ฒํผ 1์ ๋๋ฅด๊ฑฐ๋ ์๊ฐ ์ด๊ณผํ์ฌ ์ ํ ๊ฑธ๊ธฐ ์ด์์ ๊ทธ๋ฃน์ผ๋ก ๋๊ฐ๋๋ค. ํตํ๊ฐ ๋๋๋ฉด hangupcall ๋งคํฌ๋ก๊ฐ ํธ์ถ๋๊ณ ๊ทธ ํ์๋ ํน์ ์ฒ๋ฆฌ๊ธฐ(hangup ์ฒ๋ฆฌ๊ธฐ)๋ฅผ ์ ์ธํ๊ณ ๋ค์ด์ผ ํ๋์์ ์๋ฌด ์์ ๋ ์ํํ ์ ์์ต๋๋ค.
์ด ํตํ ์๊ณ ๋ฆฌ์ฆ์์ CRM์ ํตํ ์์์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ๋ น์์ ์์ํ ์์น, ๋ น์์ ์ข ๋ฃํ๊ณ CRM์ ๋ํ ํตํ์ ๋ํ ์ ๋ณด์ ํจ๊ป ์ ์กํด์ผ ํ๋ ์์น๋ ์ด๋์ ๋๊น?
์ธ๋ถ ์์คํ ๊ณผ์ ํตํฉ
PBX ๋ฐ CRM ํตํฉ์ด๋ ๋ฌด์์ ๋๊น? ์ด ๋ ํ๋ซํผ ์ฌ์ด์์ ๋ฐ์ดํฐ์ ์ด๋ฒคํธ๋ฅผ ๋ณํํ์ฌ ์๋ก์๊ฒ ์ ์กํ๋ ์ค์ ๋ฐ ํ๋ก๊ทธ๋จ์ ๋๋ค. ๋ ๋ฆฝ ์์คํ ์ด ํต์ ํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ API๋ฅผ ํตํ๋ ๊ฒ์ด๋ฉฐ API์ ์ก์ธ์คํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ HTTP REST์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ณํ๋ ์๋๋๋ค.
๋ด๋ถ ๋ณํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
AGI - ๋ค์ด์ผํ๋์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์ธ๋ถ ํ๋ก๊ทธ๋จ/๊ตฌ์ฑ ์์์ ๋๊ธฐ์ ํธ์ถ, ๋ค์๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
ํ์ง ,ํ์ด์ง -
AMI - ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ํ ์คํธ ๋ช ๋ น์ ์ ๋ ฅํ๋ ์์น์ ๋ฐ๋ผ ์๋ํ๋ ํ ์คํธ TCP ์์ผ์ผ๋ก ๋ด๋ถ์์ SMTP์ ์ ์ฌํ๋ฉฐ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๊ณ ํธ์ถ์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
ํ๋ฏธ - Asterisk์์ ์ฐ๊ฒฐ์ ๋ง๋๋ ๋ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋
AMI ์ถ๋ ฅ ์์
์ด๋ฒคํธ: ์ ์ฑ๋
๊ถํ: ํธ์ถ, ๋ชจ๋
์ฑ๋: PJSIP/VMS_pjsip-0000078b
์ฑ๋ ์ํ: 4
ChannelStateDesc: ๋ง
๋ฐ์ ๋ฒํธ: 111222
๋ฐ์ ๋ฒํธ: 111222
์ฐ๊ฒฐ๋ ๋ผ์ธ ๋ฒํธ:
์ฐ๊ฒฐ๋ ํ์ ์ด๋ฆ:
์ธ์ด : English
๊ณ์ ์ฝ๋:
์ปจํ
์คํธ: from-pstn
์ฐ์ฅ: s
์ฐ์ ์์ : 1
๊ณ ์ ID: 1599589046.5244
๋งํฌ๋ID: 1599589046.5244
-
ARI๋ ๋ชจ๋ REST, WebSocket์ ํตํด JSON ํ์์ผ๋ก ํผํฉ๋์ด ์์ง๋ง ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํผ๊ฐ ์์ด ๊ทธ๋ค์ง ์ข์ง๋ ์์ต๋๋ค.
ํํ๋ฆฌ์ ,ํํ๋ฆฌ ) ์ฝ 3๋ ์ ์ ๊ฐ๋ฐ๋์์ต๋๋ค.
ํตํ ์์ ์ ARI ์ถ๋ ฅ์ ์
{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id ยป:ยป1599644315.5334โณ, ยซ์ด๋ฆยป:ยปPJSIP/VMSpjsip-000007b6โณ, "์ํ":"๋ง", "๋ฐ์ ์":{ "์ด๋ฆ":"111222โณ, "๋ฒํธ":"111222โณ }, "์ฐ๊ฒฐ๋จ":{ "์ด๋ฆ":"", "๋ฒํธ" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "์ฑ์ด๋ฆ":"์คํ ์ด์์ค", "์ฑdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"ko" }, "๋ณํid":"48:5b:aa:aa:aa:aa", "์์ฉ ํ๋ก๊ทธ๋จ":"hello-world" }
ํธ์์ฑ ๋๋ ๋ถํธํจ, ํน์ API๋ก ์์ ํ ์ ์๋์ง ์ฌ๋ถ๋ ํด๊ฒฐํด์ผ ํ๋ ์์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. CRM๊ณผ์ ํตํฉ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
ํตํ ์์, ์ ์ก๋ ์์น ์ถ์ , CallerID, DID, ์์ ๋ฐ ์ข ๋ฃ ์๊ฐ, ๋๋ ํฐ๋ฆฌ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(์ ํ์ CRM ์ฌ์ฉ์ ๊ฐ์ ์ฐ๊ฒฐ ๊ฒ์)
-
ํตํ ๋ น์ ์์ ๋ฐ ์ข ๋ฃ, ์ํ๋ ํ์์ผ๋ก ์ ์ฅ, ๋ น์ ์ข ๋ฃ ์ ํ์ผ ์์น ์๋ฆผ
-
ํ๋ก๊ทธ๋จ์์ ์ธ๋ถ ์ด๋ฒคํธ์ ๋ํ ํธ์ถ ์์, ๋ด๋ถ ๋ฒํธ, ์ธ๋ถ ๋ฒํธ ํธ์ถ ๋ฐ ์ฐ๊ฒฐ
-
์ ํ ๊ณผ๋ชฉ: CRM, ๋ค์ด์ผ๋ฌ ๊ทธ๋ฃน ๋ฐ FollowME์ ํตํฉํ์ฌ ์ฅ์๊ฐ ์์ ๋ ์๋์ผ๋ก ํตํ๋ฅผ ์ ํํฉ๋๋ค(CRM์ ๋ฐ๋ฆ).
์ด๋ฌํ ๋ชจ๋ ์์
์ AMI ๋๋ ARI๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ง๋ง ARI๋ ํจ์ฌ ์ ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ด๋ฒคํธ๊ฐ ๋ง์ง ์์ผ๋ฉฐ AMI๊ฐ ์ฌ์ ํ ๊ฐ์ง๊ณ ์๋ ๋ง์ ๋ณ์(์: ๋งคํฌ๋ก ํธ์ถ, ๋งคํฌ๋ก ๋ด๋ถ ๋ณ์ ์ค์ , ํธ์ถ ๋
น์ ํฌํจ)๊ฐ ์ถ์ ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํํ๊ณ ์ ํํ ์ถ์ ์ ์ํด ์ง๊ธ์ AMI๋ฅผ ์ ํํฉ์๋ค(์์ ํ์ง๋ ์์). ๋ํ (์, ๊ทธ๊ฒ ์์ด๋ ๊ฒ์ผ๋ฅธ ์ฌ๋๋ค์
๋๋ค)-์์์์ (
ํตํฉ ์ฌ์ฐฝ์กฐ
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
์ฐ๊ฒฐ๋ ๋ผ์ธ ๋ฒํธ:
์ฐ๊ฒฐ๋ ํ์ ์ด๋ฆ:
์ธ์ด : English
๊ณ์ ์ฝ๋:
์ปจํ ์คํธ: from-pstn
์ฐ์ฅ: s
์ฐ์ ์์ : 1
๊ณ ์ ID: 1599589046.5244
๋งํฌ๋ID: 1599589046.5244
์ ํ๋ฆฌ์ผ์ด์ : AppData ์ค์ :
ํตํ์์=1599571046
FreePBX๋ extension.conf ๋ฐ extension_ ํ์ผ์ ๋ฎ์ด ์ฐ๊ธฐ ๋๋ฌธ์additional.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 ํ์์ Dialplan(์, .ael์ ๊ฐ๋ฅํ์ง๋ง ๋ชจ๋ ๋ฒ์ ์ด ์๋๊ณ ํญ์ ํธ๋ฆฌํ ๊ฒ์ ์๋๋๋ค)
-
exten=>h๋ฅผ ํตํด ์ข ๋ฃ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ hangup_handler๋ฅผ ํตํด ์ฒ๋ฆฌ๊ฐ ๋์ ๋์์ต๋๋ค. ์๋ํ๋ฉด FreePBX ๋ค์ด์ผํ๋์ ๊ทธ๊ฒ์ผ๋ก๋ง ์๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
์คํฌ๋ฆฝํธ ํธ์ถ ๋ฌธ์์ด ์์ , ๋ฐ์ดํ ์ถ๊ฐ ๋ฐ ์ธ๋ถ ํธ์ถ ๋ฒํธ ExtNum
-
์ฒ๋ฆฌ๊ฐ _custom ์ปจํ ์คํธ๋ก ์ด๋๋์ด FreePBX ๊ตฌ์ฑ์ ๊ฑด๋๋ฆฌ๊ฑฐ๋ ํธ์งํ ์ ์์ต๋๋ค. [ext-d-custom], [๋ฅผ ํตํด ๋ฐ์ ์์๋ฐ์ด๋-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๋ ์ด๋ฅผ ๊ตฌ์กฐํ๋ ๊ฐ์ฒด๋ก ๋ณํํ๊ณ ๊ด์ฌ ์๋ ์ด๋ฒคํธ, ํ๋, ์ซ์ ๋ฑ์ ๋ํด์๋ง ํํฐ๋ง ๊ธฐ๋ฅ์ ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํธ์ถ์ด ๋ค์ด์ค๋ฉด ๋ถ๋ชจ [from-pstn] ์ปจํ ์คํธ์์ ์์ํ์ฌ NewExten ์ด๋ฒคํธ๊ฐ ์์๋๊ณ ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ์ปจํ ์คํธ์ ์ค ์์๋๋ก ์งํ๋ฉ๋๋ค. _custom ๋ค์ด์ผํ๋์ ์ง์ ๋ CallMeCallerIDName ๋ฐ CallStart ๋ณ์๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์์ ํ๋ฉด
-
์ ํ๊ฐ ์จ ๋ด์ ๋ฒํธ์ ํด๋นํ๋ UserID๋ฅผ ์์ฒญํ๋ ๊ธฐ๋ฅ. ์ ํ ์ ์ ๊ทธ๋ฃน์ธ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ฉ๋๊น? ์ง๋ฌธ์ ์ ์น์ ์ ๋๋ค. ํ ๋ฒ์ ๋ชจ๋ ์ฌ๋์๊ฒ ํตํ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น(๋ชจ๋ ์ฌ๋์ด ํ ๋ฒ์ ํตํํ ๋) ์๋๋ฉด ์ฐจ๋ก๋๋ก ํตํํ ๋ ํตํ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น? ๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ์๋ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ ๊ฐ๋ฅ ์ ๋ต์ด ์์ผ๋ฏ๋ก ์ด์ ๋ํ ๋ฌธ์ ๋ ์์ผ๋ฉฐ ํ ๋ฒ๋ง ํธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ด์ผ ํฉ๋๋ค.
-
CallID๋ฅผ ๋ฐํํ๋ Bitrix24์ ํตํ ๋ฑ๋ก ๊ธฐ๋ฅ์ ํตํ ๋งค๊ฐ ๋ณ์์ ๋ น์์ ๋ํ ๋งํฌ๋ฅผ ๋ณด๊ณ ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๋ด์ ๋ฒํธ ๋๋ ์ฌ์ฉ์ ID๊ฐ ํ์ํฉ๋๋ค.
ํตํ ์ข ๋ฃ ํ ๋ น์ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ด ํธ์ถ๋์ด ํตํ ์๋ฃ ์ํ(ํตํ ์ค, ์๋ต ์์, ์ฑ๊ณต)๋ฅผ ๋์์ ๋ณด๊ณ ํ๊ณ ๋ น์์ด ์๋ mp3 ํ์ผ(์๋ ๊ฒฝ์ฐ)์ ๋ํ ๋งํฌ๋ ๋ค์ด๋ก๋ํฉ๋๋ค.
CallMeIn.php ๋ชจ๋์ ์ง์์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ์ํ SystemD ์์ ํ์ผ์ด ์์ฑ๋์์ต๋๋ค. ์ฝ๋ฏธ.์๋น์ค, /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] ๋ค์ด์ผํ๋์ Asterisk์ ์ํด ์คํ๋ฉ๋๋ค.
์น ์๋ฒ๋ Bitrix ๋ ์ฝ๋ ํ์ผ ๋ค์ด๋ก๋(HTTPS๋ฅผ ํตํด) ๋ฐ CallMeOut.php ์คํฌ๋ฆฝํธ ํธ์ถ์ ๋ ๊ฐ์ง์๋ง ํ์ํฉ๋๋ค. ํ์ผ์ด /var/www/html์ธ ๋ด์ฅ FreePBX ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์๋ฒ๋ฅผ ์ค์นํ๊ฑฐ๋ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์น ์๋ฒ
๋
๋ฆฝ์ ์ธ ํ์ต์ ์ํด ์น ์๋ฒ ์ค์ ์ ๋จ๊ฒจ๋ก์๋ค(
์ค์น ์๋ํ
์ค์น ํ๋ก๊ทธ๋จ์ github์์ ๊ฐ๋ฐํ์ฌ ์ค์น๋ฅผ ๋์ฑ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ข ์ด์ ์์กฐ๋ก ์ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ๊ฒ์ ์๋์ผ๋ก ์ค์นํ๋ ๋์์ด ๋ชจ๋ ๊ฒ์ ์์ ํ ํ์ ๋๊ตฌ์ ์น๊ตฌ๊ฐ ๋๊ตฌ์ธ์ง, ๋๊ฐ ์ด๋๋ก ๊ฐ๊ณ ์ด๋ป๊ฒ ๋๋ฒ๊น ํ๋์ง ๋ช ํ ํด ์ก๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ง ์ค์น ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค
๋์ปค
์๋ฃจ์
์ ๋น ๋ฅด๊ฒ ์๋ํ๊ณ ์ถ๋ค๋ฉด Docker ์ต์
์ด ์์ต๋๋ค. ์ปจํ
์ด๋๋ฅผ ๋น ๋ฅด๊ฒ ์์ฑํ๊ณ ์ธ๋ถ์ ํฌํธ๋ฅผ ์ ๊ณตํ๊ณ ์ค์ ํ์ผ์ ๋ฐ์ด๋ฃ๊ณ ์๋ํฉ๋๋ค(LetsEncrypt ์ปจํ
์ด๋์ ์ต์
์
๋๋ค. ์ด๋ฏธ ์ธ์ฆ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ FreePBX ์น ์๋ฒ๋ก ๋ฆฌ๋๋ ์
ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(๋ค๋ฅธ ํฌํธ๋ 88๋ก ์ง์ ). Docker์์ 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์ ์ ๋ก๋ํ ๊ฒ์ ๋๋ค.
์ฐธ์กฐ
-
์ฝ๋ ์์ฒด๋ github์ ์์ต๋๋ค.
https://github.com/CrezZ/bitrix24-freepbx-php -
์จ์์ ์ถ์ฒ ๊ธฐ์ฌ
https://habr.com/ru/post/349316/
๋ฉด์ฑ ์กฐํญ: ํ์ค๊ณผ ๋ฎ์ ์ ์ ํ๊ตฌ์ด๋ฉฐ ์ ๊ฐ ํ ๊ฒ์ด ์๋๋๋ค.
์ถ์ฒ : habr.com