
Misy safidy samihafa amin'ny fampidirana ny IP-PBX Asterisk sy CRM Bitrix24 amin'ny tambajotra, saingy mbola nanapa-kevitra ny hanoratra ny anay izahay.
Amin'ny lafiny fampiasa, ny zava-drehetra dia mahazatra:
- Amin'ny alΓ lan'ny fipihana rohy misy laharan-telefaonin'ny mpanjifa ao amin'ny Bitrix24, dia ampifandraisin'ny Asterisk amin'ny laharan-telefaonan'ny mpanjifa ny nomeraon'ny mpampiasa azy. Ao amin'ny Bitrix24, misy firaketana an-tsoratra momba ny antso ary amin'ny fiafaran'ny antso dia alaina ny firaketana ny resaka.
- Mandray antso avy any ivelany ny Asterisk - ao amin'ny interface Bitrix24 dia asehontsika ny karatra mpanjifa amin'ny mpiasa izay nahatongavan'ity antso ity.
Raha tsy misy mpanjifa toy izany dia hanokatra ny karatra hamoronana fitarihana vaovao izahay.
Raha vantany vao vita ny antso, dia maneho izany eo amin'ny karatra izahay ary manangana firaketana ny resaka.
Eo ambanin'ny fanapahana dia holazaiko aminao ny fomba hametrahana ny zava-drehetra ho anao ary hanome anao rohy mankany amin'ny github - eny, eny, raiso ary ampiasao izany!
Famaritana ankapobeny
Nantsoinay ny fampidiranay CallMe. CallMe dia fampiharana tranonkala kely voasoratra amin'ny PHP.
Teknolojia sy serivisy ampiasaina
- PHP 5.6
- Composer
- Nginx + php-fpm
- mpanara-maso
- AMI (Asterisk Manager Interface)
- Bitrix webhooks (fampiharana REST API notsorina)
presetting
Amin'ny mpizara misy Asterisk dia mila mametraka mpizara tranonkala ianao (ho anay dia nginx+php-fpm), mpanara-maso ary git.
Baiko fametrahana (CentOS):
yum install nginx php-fpm supervisor gitMandeha any amin'ny lahatahiry azo idirana amin'ny mpizara tranonkala izahay, misintona ny fampiharana avy amin'ny Git ary mametraka ny zo ilaina amin'ny lahatahiry:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Manaraka, andeha amboary ny nginx, ny config dia hita ao
/etc/nginx/conf.d/pbx.vistep.ru.confserver {
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;
}
}
Hiala amin'ny fanaparitahana ny config, ny olana momba ny fiarovana, ny fahazoana mari-pankasitrahana aho ary na dia ny fisafidianana mpizara tranonkala ivelan'ny sehatry ny lahatsoratra aza - betsaka no nosoratana momba izany. Tsy misy famerana ny fampiharana, miasa amin'ny http sy https.
Mampiasa https izahay, andao hanao encryption ny taratasy fanamarinana.
Raha nanao ny zava-drehetra araka ny tokony ho izy ianao dia tokony hahita zavatra toy izao amin'ny fipihana ny rohy

Fametrahana Bitrix24
Andao hamorona webhook roa.
Webhook miditra.
Eo ambanin'ny kaonty administratera (miaraka amin'ny id 1), araho ny lalana: Applications -> Webhooks -> Add webhook -> Incoming webhook

Fenoy ny mason'ny webhook miditra toy ny amin'ny pikantsary:


Ary tsindrio Save.
Aorian'ny fitahirizana, Bitrix24 dia hanome ny URL an'ny webhook miditra, ohatra:

Tehirizo ny dikan-teninao amin'ny URL raha tsy misy ny /profile/ farany - hampiasaina amin'ny fampiharana izany mba hiasa amin'ny antso miditra.
Manana ity aho https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Webhook mivoaka.
Fampiharana -> Webhooks -> Ampio webhook -> Webhook mivoaka
Ny antsipiriany indray amin'ny pikantsary:


Tehirizo ary raiso ny kaody fanomezan-dΓ lana

Manana ity aho xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Mila maka tahaka izany ho an'ny tenanao ihany koa ianao;
Zava-dehibe!
Ny taratasy fanamarinana SSL dia tsy maintsy amboarina amin'ny mpizara Bitrix24 (azonao ampiasaina ny letsencrypt), raha tsy izany dia tsy mandeha ny Bitrix api. Raha manana dikan-drahona ianao dia aza manahy - efa misy ssl.
Zava-dehibe!
Ny saha "Adiresy Processor" dia tsy maintsy misy adiresy azo idirana amin'ny Internet!
Ary ho fikasihana farany, andao hametraka ny CallMeOut ho toy ny fampiharana hanaovana antso (ka rehefa manindry ny laharana eo amin'ny PBX ianao, dia hanidina ny baikon'ny fiavian'ny antso).
Ao amin'ny menio, safidio: More -> Telephony -> More -> Settings, apetraho ao amin'ny "Laharana fiantsoana mivoaka default" Application: CallMeOut ary tsindrio ny "Save"

Fametrahana asterisk
Mba hahazoana fifandraisana mahomby eo amin'ny Asterisk sy Bitrix24, mila ampiana ny callme mpampiasa AMI amin'ny 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
Manaraka izany dia misy fika maromaro mila ampiharina amin'ny alΓ lan'ny dialplan (aminay dia extensions.ael).
Hanome ny rakitra manontolo aho, ary avy eo dia hanome fanazavana aho:
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});
}
};
Andeha isika hanomboka amin'ny voalohany: ny toromarika globaly.
Miovaova URLRECORDS mitahiry ny URL amin'ny rakitra firaketana resaka, araka izay i Bitrix24 no hisintona azy ireo ao amin'ny karatra fifandraisana.
Manaraka izany dia liana amin'ny macro macro isika peo.
Eto, ankoatry ny firaketana resaka, dia hametraka ny fari-piainana FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);Izy io dia mitahiry ny URL feno amin'ny rakitra manokana (antsoina hoe aiza ny macro).
Andeha hojerentsika ny antso nivoaka:
_. => {
&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});
}
Andeha atao hoe miantso ny 89991234567, voalohany indrindra tonga eto:
&recording(${CALLERID(number)},${EXTEN});ireo. Antsoina ny macro fandraketana resaka ary apetraka ny fari-piainana ilaina.
bebe kokoa
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Raketinay hoe iza no nanomboka ny antso ary raketinay ny ora fanombohan'ny antso.
Ary rehefa vita izany, amin'ny toe-javatra manokana 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});
}
esory ny fidirana amin'ny latabatra CDR ho an'ity fanitarana ity (tsy ilaina izany), apetraho ny fotoana fiafaran'ny antso, kajy ny faharetany, raha tsy fantatra ny valin'ny antso - napetraka (variable CallMeDISPOSITION) ary, ny dingana farany, alefaso any amin'ny Bitrix amin'ny alΓ lan'ny system curl.
Ary ody kely kokoa - antso ho avy:
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();
}
Andalana iray ihany no mahaliana antsika eto.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());Nilaza tamin'ny PBX izy mba hametraka CallerID(anarana) mitovy amin'ny miovaova CallMeCallerIDName.
Ny fari-pahaizan'ny CallMeCallerIDName, kosa, dia napetraky ny fampiharana CallMe (raha manana anarana feno ho an'ny laharan'ny mpiantso ny Bitrix24, dia apetraho ho CallerID(anarana), tsia - tsy hanao na inona na inona izahay).
Fametrahana ny fampiharana
File fisie fampiharana - /var/www/pbx.vistep.ru/config.php
Famaritana ny mari-pamantarana fampiharana:
- CallMeDEBUG - raha 1, dia hosoratana amin'ny rakitra log ny hetsika rehetra nokarakarain'ny fampiharana, 0 - tsy manoratra na inona na inona izahay
- Tech - SIP/PJSIP/IAX/sns
- authToken - Token'ny fanomezan-dΓ lana Bitrix24, kaody fanomezan-dΓ lana mivoaka amin'ny webhook
- bitrixApiUrl - URL an'ny webhook miditra, tsy misy mombamomba/
- extensionions - lisitry ny isa ivelany
- teny manodidina - contexte niavian'ny antso
- listener_time out - hafainganam-pandehan'ny hetsika avy amin'ny asterisk
- asterisk - laharana misy fika ahafahana mampifandray amin'ny asterisk:
- miaramila - ip na anaran'ny mpampiantrano ny mpizara asterisk
- tetika - kisarisary fifandraisana (tcp://, tls://)
- seranan-tsambo - seranana
- Anaran'ny mpampiasa - Anarana mpampiasa
- zava-miafina - tenimiafina
- connect_time out - fe-potoana fifandraisana
- read_time out - famakiana fotoana
ohatra fisie fichier:
<?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
);Fametrahana mpanara-maso
Ny Supervisor dia ampiasaina amin'ny fanombohana ny fizotran'ny mpikarakara hetsika avy amin'ny Asterisk CallMeIn.php, izay manara-maso ny antso miditra sy mifandray amin'ny Bitrix24 (asehoy ny karatra, afeno karatra, sns.).
Fikirakirana hoforonina:
/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.logAlefaso ary avereno indray ny fampiharana:
supervisorctl start callme
supervisorctl restart callmeMijery ny toetry ny fiasan'ny fampiharana:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07famaranana
Sarotra be izany, saingy azoko antoka fa ho afaka hampihatra izany ny mpitantana za-draharaha ary hampifaly ny mpampiasa azy.
Araka ny nampanantenaina, .
Fanontaniana, soso-kevitra - avelao izy ireo ao amin'ny fanehoan-kevitra. Ary koa, raha liana amin'ny fomba nandehanan'ny fampivoarana ity fampidirana ity ianao, soraty, ary amin'ny lahatsoratra manaraka dia hiezaka ny hanambara ny zava-drehetra amin'ny antsipiriany bebe kokoa aho.
Source: www.habr.com
