Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨
āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ IP-PBX Asterisk āĻāĻŦāĻ‚ CRM Bitrix24 āĻ¸āĻ‚āĻšāĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻ¨āĻ“ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤

āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻžāĻ° āĻĒāĻ°āĻŋāĻĒā§āĻ°ā§‡āĻ•ā§āĻˇāĻŋāĻ¤ā§‡, āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻŽāĻžāĻ¨āĻ•:

  • Bitrix24-āĻ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĢā§‹āĻ¨ āĻ¨āĻŽā§āĻŦāĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ˛āĻŋāĻ™ā§āĻ•ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡, Asterisk āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¨āĻŽā§āĻŦāĻ°āĻ•ā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ° āĻĒāĻ•ā§āĻˇā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĢā§‹āĻ¨ āĻ¨āĻŽā§āĻŦāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ Bitrix24-āĻ, āĻ•āĻ˛ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ•āĻ˛ā§‡āĻ° āĻļā§‡āĻˇā§‡, āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻŸāĻžāĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤
  • Asterisk āĻŦāĻžāĻ‡āĻ°ā§‡ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛ āĻĒāĻžāĻ¯āĻŧ - Bitrix24 āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸ā§‡āĻ‡ āĻ•āĻ°ā§āĻŽāĻšāĻžāĻ°ā§€āĻ•ā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ•āĻžāĻ°ā§āĻĄ āĻĻā§‡āĻ–āĻžāĻ‡ āĻ¯āĻžāĻ° āĻ¨āĻŽā§āĻŦāĻ°ā§‡ āĻāĻ‡ āĻ•āĻ˛ āĻāĻ¸ā§‡āĻ›ā§‡āĨ¤
    āĻ¯āĻĻāĻŋ āĻāĻŽāĻ¨ āĻ•ā§‹āĻ¨ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ˛āĻŋāĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ°ā§āĻĄ āĻ–ā§āĻ˛āĻŦāĨ¤
    āĻ•āĻ˛āĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻĄā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻĢāĻ˛āĻŋāĻ¤ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻŸāĻžāĻ¨āĨ¤

āĻ•āĻžāĻŸā§‡āĻ° āĻ¨ā§€āĻšā§‡ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ—āĻŋāĻĨā§āĻŦā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ˛āĻŋāĻ™ā§āĻ• āĻĻāĻŋāĻ¤ā§‡ āĻšāĻŦā§‡ - āĻšā§āĻ¯āĻžāĻ, āĻšā§āĻ¯āĻžāĻ, āĻāĻŸāĻŋ āĻ¨āĻŋāĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨!

āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻŋāĻŦāĻ°āĻŖ

āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨āĻ•ā§‡ āĻ•āĻ˛āĻŽāĻŋ āĻŦāĻ˛ā§‡āĻ›āĻŋāĨ¤ CallMe āĻšāĻ˛ āĻĒāĻŋāĻāĻ‡āĻšāĻĒāĻŋ-āĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻž āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĨ¤

āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž

  • āĻĒāĻŋāĻāĻ‡āĻšāĻĒāĻŋ 5.6
  • āĻĒāĻŋāĻāĻ‡āĻšāĻĒāĻŋ āĻāĻāĻŽāĻ†āĻ‡ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ
  • āĻ¸ā§āĻ°āĻ•āĻžāĻ°
  • Nginx + php-fpm
  • āĻ…āĻ§ā§€āĻ•ā§āĻˇāĻ•
  • AMI (āĻ¸ā§āĻŸāĻžāĻ°āĻŋāĻ¸ā§āĻ• āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ° āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸)
  • āĻŦāĻŋāĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• (āĻ¸āĻ°āĻ˛ā§€āĻ•ā§ƒāĻ¤ REST API āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨)

āĻĒā§āĻ°āĻžāĻ•-āĻ¸ā§‡āĻŸāĻŋāĻ‚

Asterisk āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ nginx+php-fpm), āĻ¸ā§āĻĒāĻžāĻ°āĻ­āĻžāĻ‡āĻœāĻžāĻ° āĻāĻŦāĻ‚ āĻ—āĻŋāĻŸāĨ¤

āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ā§‡āĻļāĻ¨ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ (CentOS):

yum install nginx php-fpm supervisor git

āĻ†āĻŽāĻ°āĻž āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ¤ā§‡ āĻ¯āĻžāĻ‡, āĻ—āĻŋāĻŸ āĻĨā§‡āĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻŸā§‡āĻ¨ā§‡ āĻ†āĻ¨āĻŋ āĻāĻŦāĻ‚ āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻŋ:


cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻ¸ā§āĻ¨ nginx āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻŋ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨āĻŸāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻŋāĻ¤

/etc/nginx/conf.d/pbx.vistep.ru.conf

server {
	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;
		}
}

āĻ†āĻŽāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻ‚, āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž, āĻāĻ•āĻŸāĻŋ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ¸ā§āĻ¯ā§‹āĻ—ā§‡āĻ° āĻŦāĻžāĻ‡āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻ›ā§‡āĻĄāĻŧā§‡ āĻĻā§‡āĻŦ - āĻāĻ‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ° āĻ•ā§‹āĻ¨ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻ¨ā§‡āĻ‡, āĻāĻŸāĻŋ http āĻāĻŦāĻ‚ https āĻ‰āĻ­āĻ¯āĻŧ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻŽāĻ°āĻž https āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ†āĻ¸ā§āĻ¨ āĻ¸āĻžāĻ°ā§āĻŸāĻŋāĻĢāĻŋāĻ•ā§‡āĻŸ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻŋāĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻ˛āĻŋāĻ™ā§āĻ•āĻŸāĻŋāĻ¤ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ°āĻ•āĻŽ āĻ•āĻŋāĻ›ā§ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻšāĻŦā§‡

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

Bitrix24 āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ†āĻ¸ā§āĻ¨ āĻĻā§āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋāĨ¤

āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•āĨ¤

āĻ…ā§āĻ¯āĻžāĻĄāĻŽāĻŋāĻ¨āĻŋāĻ¸ā§āĻŸā§āĻ°ā§‡āĻŸāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ (āĻ†āĻ‡āĻĄāĻŋ 1 āĻ¸āĻš), āĻĒāĻĨāĻŸāĻŋ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨: āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ -> āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• -> āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨ -> āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨āĻļāĻŸā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•ā§‡āĻ° āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°ā§āĻ¨:

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻāĻŦāĻ‚ save āĻ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, Bitrix24 āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•ā§‡āĻ° URL āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŦā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ:

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ /āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛/ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ° URL āĻāĻ° āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨ - āĻāĻŸāĻŋ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ā§ˇ

āĻ†āĻŽāĻžāĻ° āĻ†āĻ›ā§‡ āĻāĻŸāĻž https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•āĨ¤

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ -> āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• -> āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨ -> āĻ†āĻ‰āĻŸāĻ—ā§‹āĻ¯āĻŧāĻŋāĻ‚ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•ā§ˇ

āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ†āĻŦāĻžāĻ° āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨āĻļāĻŸāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ•ā§‹āĻĄ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§āĻ¨

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻ†āĻŽāĻžāĻ° āĻ†āĻ›ā§‡ āĻāĻŸāĻž xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¨āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ“ āĻāĻŸāĻŋ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡; āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ•āĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ!

Bitrix24 āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ SSL āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ†āĻŦāĻļā§āĻ¯āĻ• (āĻ†āĻĒāĻ¨āĻŋ letsencrypt āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨), āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ Bitrix api āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž - āĻāĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻāĻ¸āĻāĻ¸āĻāĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ!

"āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ°ā§‡āĻ° āĻ āĻŋāĻ•āĻžāĻ¨āĻž" āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸āĻ¯ā§‹āĻ—ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡!

āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻ†āĻ¸ā§āĻ¨ āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° CallMeOut āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻŋ (āĻ¯āĻžāĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻ–āĻ¨ PBX-āĻāĻ° āĻ¨āĻŽā§āĻŦāĻ°ā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°āĻŦā§‡āĻ¨, āĻ•āĻ˛āĻŸāĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻŸāĻŋ āĻ‰āĻĄāĻŧā§‡ āĻ¯āĻžāĻŦā§‡)āĨ¤

āĻŽā§‡āĻ¨ā§āĻ¤ā§‡, āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°ā§āĻ¨: āĻ†āĻ°āĻ“ -> āĻŸā§‡āĻ˛āĻŋāĻĢā§‹āĻ¨āĻŋ -> āĻ†āĻ°āĻ“ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸, "āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ†āĻ‰āĻŸāĻ—ā§‹āĻ¯āĻŧāĻŋāĻ‚ āĻ•āĻ˛ āĻ¨āĻŽā§āĻŦāĻ°" āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨: CallMeOut āĻāĻŦāĻ‚ "āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨" āĻ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§āĻ¨

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨

āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

Asterisk āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻĢāĻ˛ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻāĻŽāĻ†āĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ•āĻ˛āĻŽā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ 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

āĻāĻ°āĻĒāĻ°ā§‡, āĻŦā§‡āĻļ āĻ•āĻŋāĻ›ā§ āĻ•ā§ŒāĻļāĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻĄāĻžāĻ¯āĻŧāĻžāĻ˛āĻĒā§āĻ˛ā§āĻ¯āĻžāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻšāĻ˛ extensions.ael)āĨ¤

āĻ†āĻŽāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŦ, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻĻā§‡āĻŦ:

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});
}

};

āĻļā§āĻ°ā§ āĻĨā§‡āĻ•ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•: āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛.

āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ URLRECORDS āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ URL āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ Bitrix24 āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤āĻŋ āĻ•āĻžāĻ°ā§āĻĄā§‡ āĻŸāĻžāĻ¨āĻŦā§‡āĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ†āĻŽāĻ°āĻž āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹ āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚.

āĻāĻ–āĻžāĻ¨ā§‡, āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻžāĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āĻ†āĻŽāĻ°āĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻŦ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻžāĻŽ.

Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);

āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ URL āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡ (āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹āĻ•ā§‡ āĻ¸āĻ°ā§āĻŦāĻ¤ā§āĻ° āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ)āĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ•āĻ˛ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

_. => {
	&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});
}

āĻ§āĻ°āĻž āĻ¯āĻžāĻ• āĻ†āĻŽāĻ°āĻž 89991234567 āĻ•āĻ˛ āĻ•āĻ°āĻŋ, āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻžāĻ‡:

&recording(${CALLERID(number)},${EXTEN});

āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ…āĻ§āĻŋāĻ•āĻ¤āĻ°

        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});

āĻ†āĻŽāĻ°āĻž āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻŋ āĻ•ā§‡ āĻ•āĻ˛āĻŸāĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ•āĻ˛ āĻļā§āĻ°ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻŋāĨ¤

āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĒāĻ°ā§‡, āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—ā§‡ 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});
}

āĻāĻ‡ āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŋāĻĄāĻŋāĻ†āĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ…āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§āĻ¨ (āĻāĻŸāĻŋ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡), āĻ•āĻ˛ā§‡āĻ° āĻļā§‡āĻˇ āĻ¸āĻŽāĻ¯āĻŧ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨, āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°ā§āĻ¨, āĻ¯āĻĻāĻŋ āĻ•āĻ˛ā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻœāĻžāĻ¨āĻž āĻ¨āĻž āĻĨāĻžāĻ•ā§‡ - āĻ¸ā§‡āĻŸ (āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ CallMeDISPOSITION) āĻāĻŦāĻ‚, āĻļā§‡āĻˇ āĻ§āĻžāĻĒā§‡, āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āĻžāĻ°ā§āĻ˛ āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻŦāĻŋāĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ā§‡ āĻĒāĻžāĻ āĻžāĻ¨āĨ¤

āĻāĻŦāĻ‚ āĻāĻ•āĻŸā§ āĻŦā§‡āĻļāĻŋ āĻ¯āĻžāĻĻā§ - āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ•āĻ˛:

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();
        }

āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻ¨ āĻ†āĻ—ā§āĻ°āĻšā§€.

ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());

āĻ¸ā§‡ āĻĒāĻŋāĻŦāĻŋāĻāĻ•ā§āĻ¸āĻ•ā§‡ āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻ˛ā§‡ CallerID(āĻ¨āĻžāĻŽ) āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨ CallMeCallerIDName.

CallMeCallerIDName āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¨āĻŋāĻœā§‡āĻ‡ CallMe āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ (āĻ¯āĻĻāĻŋ Bitrix24-āĻāĻ° āĻ•āĻ˛āĻžāĻ°ā§‡āĻ° āĻ¨āĻŽā§āĻŦāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻžāĻŽ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻŸāĻŋāĻ•ā§‡ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨ CallerID(āĻ¨āĻžāĻŽ), āĻ¨āĻž - āĻ†āĻŽāĻ°āĻž āĻ•āĻŋāĻ›ā§āĻ‡ āĻ•āĻ°āĻŦ āĻ¨āĻž)āĨ¤

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¸ā§‡āĻŸāĻ†āĻĒ

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĢāĻžāĻ‡āĻ˛ - /var/www/pbx.vistep.ru/config.php

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž:

  • āĻ•āĻ˛MeDEBUG — āĻ¯āĻĻāĻŋ 1, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•ā§ƒāĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻ˛āĻ— āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻŦā§‡, 0 — āĻ†āĻŽāĻ°āĻž āĻ•āĻŋāĻ›ā§ āĻ˛āĻŋāĻ–āĻŋ āĻ¨āĻž
  • āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ - SIP/PJSIP/IAX/āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ
  • authToken — Bitrix24 āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻŸā§‹āĻ•ā§‡āĻ¨, āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ• āĻ…āĻ¨ā§āĻŽā§‹āĻĻāĻ¨ āĻ•ā§‹āĻĄ
  • bitrixApiUrl — āĻ†āĻ—āĻ¤ āĻ“āĻ¯āĻŧā§‡āĻŦāĻšā§āĻ•ā§‡āĻ° URL, āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ āĻ›āĻžāĻĄāĻŧāĻž/
  • āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨āĻļāĻ¨ - āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ• āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž
  • āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ— - āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛ā§‡āĻ° āĻ‰āĻĻā§āĻ­āĻŦā§‡āĻ° āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—
  • āĻļā§āĻ°ā§‹āĻ¤āĻž_āĻ¸āĻŽāĻ¯āĻŧ āĻļā§‡āĻˇ — āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻ—āĻ¤āĻŋ
  • āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ — āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡:
  • āĻ¨āĻŋāĻŽāĻ¨ā§āĻ¤ā§āĻ°āĻŖāĻ•āĻ°ā§āĻ¤āĻž — āĻ†āĻ‡āĻĒāĻŋ āĻŦāĻž āĻ¤āĻžāĻ°āĻ•āĻžāĻšāĻŋāĻšā§āĻ¨ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻšā§‹āĻ¸ā§āĻŸāĻ¨āĻžāĻŽ
  • āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž — āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻšāĻŋāĻ¤ā§āĻ° (tcp://, tls://)
  • āĻŦāĻ¨ā§āĻĻāĻ° - āĻŦāĻ¨ā§āĻĻāĻ°
  • āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ - āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ¨āĻžāĻŽ
  • āĻ—ā§‹āĻĒāĻ¨ - āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ
  • āĻ¸āĻ‚āĻ¯ā§‹āĻ—_āĻ¸āĻŽāĻ¯āĻŧ āĻļā§‡āĻˇ - āĻ†āĻ‰āĻŸ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻŽāĻ¯āĻŧ
  • read_timeout - āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻĒāĻĄāĻŧā§āĻ¨

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĢāĻžāĻ‡āĻ˛:

 <?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

);

āĻ¸ā§āĻĒāĻžāĻ°āĻ­āĻžāĻ‡āĻœāĻžāĻ° āĻ¸ā§‡āĻŸāĻ†āĻĒ

āĻ¸ā§āĻĒāĻžāĻ°āĻ­āĻžāĻ‡āĻœāĻžāĻ° Asterisk CallMeIn.php āĻĨā§‡āĻ•ā§‡ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ Bitrix24 āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°ā§‡ (āĻ•āĻžāĻ°ā§āĻĄ āĻĻā§‡āĻ–āĻžāĻ¨, āĻ•āĻžāĻ°ā§āĻĄ āĻ˛ā§āĻ•āĻžāĻ¨, āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ)āĨ¤

āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

/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.log

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨:

supervisorctl start callme
supervisorctl restart callme

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĻā§‡āĻ–āĻž āĻšāĻšā§āĻ›ā§‡:

supervisorctl status callme
callme                           RUNNING   pid 11729, uptime 17 days, 16:58:07

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻāĻŸāĻŋ āĻŦā§‡āĻļ āĻœāĻŸāĻŋāĻ˛ āĻŦāĻ˛ā§‡ āĻĒā§āĻ°āĻŽāĻžāĻŖāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻāĻ•āĻœāĻ¨ āĻ…āĻ­āĻŋāĻœā§āĻž āĻĒā§āĻ°āĻļāĻžāĻ¸āĻ• āĻāĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ–ā§āĻļāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĻ¨āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤, github āĻ˛āĻŋāĻ™ā§āĻ•.

āĻĒā§āĻ°āĻļā§āĻ¨, āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ - āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ›ā§‡āĻĄāĻŧā§‡ āĻĻāĻŋāĻ¨. āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻāĻ•ā§€āĻ•āĻ°āĻŖā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¨ āĻ¤āĻŦā§‡ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻŋ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŦāĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨