Ищу Asterisk web call

drop

Мой дом здесь!
Регистрация
1 Янв 2007
Сообщения
418
Реакции
200
Есть ли скрипт для звонков через сайт? Принцип таков: человек зайдя на сайт, нажимает на номер телефона (к примеру 1122) и в этот момент осуществляется звонок на стационарный IP телефон. Можно даже через коллбек, но что б он срабатывал на номер вызывающего абонента (так же IP телефон).
 
HTML:
<html>
<body>
  <h1>Enter phone number</h1>
    <form action=1.php>
        <input name=phone>
        <input type=submit>
      </form>
   </body>
</html>

содержимое 1.php
HTML:
<html>
<body>
  <h1>Waiting call on phone</h1>
    <?php
        $phone=$_POST['phone'];
            echo "${phone}<br>";
            system ("/usr/bin/sudo /usr/sbin/asterisk -x \"channel originate SIP/1122 extension ${phone}@default\"");
      ?>
</body>
</html>
 
Последнее редактирование:
Хм, при тесте вот что я вижу
Код:
Notice: Undefined index: phone in \www\1.php on line 5
 
попробуй заменить
PHP:
$phone=$_POST['phone'];
на
PHP:
if (isset($_POST['phone'])) {$phone = $_POST['phone'];}
 
Хм... А если размещение скрипта не на одном сервере с астериском стоит? Как этот скрипт выполнить?
 
эта строка
PHP:
system ("/usr/bin/sudo /usr/sbin/asterisk -x \"channel originate SIP/1122 extension ${phone}@default\"");
выполняет ситемную команду sudo asterisk -x "channel originate SIP/1122 extension ${phone}@default"
в моем тестовом случае действительно веб сервер и астериск стоят на одной ОС
однако, если попробовать выполнить ту же команду предварительно прописав ssh коннект к удаленному серверу с астериском, полагаю это сработает (предварительно сделав авторизацию по ключу, чтобы не просил пароль).
выглядеть должно примерно так:
PHP:
system ("/usr/bin/ssh someuser@1.2.3.4 sudo asterisk -x \"channel originate SIP/1122 extension ${phone}@default\"");
это ориентировочный/тестовый вариант, работоспособность не гарантирую.
Обратите особое внимание безопасности исполнения чего либо от пользователя apache, что бы не получить громадную дыру в безопасности серверов.
Да, плюс пути у ОС к sudo, asterisk, ssh могут отличаться, поэтому проверяйте заранее (как вариант командой which)
Код:
$ which ssh
/usr/bin/ssh

Возможно есть варианты исполнения через Для просмотра ссылки Войди или Зарегистрируйся
 
  • Нравится
Реакции: drop
Попробую вечерком. Кстате вот паралельно искал решения своего вопроса, нашел вот такое:
Скрытое содержимое доступно для зарегистрированных пользователей!

Все бы ничего, но в консоли астера при попытке звонка у меня мгновенно появляется сообщение:
== Manager 'test' logged on from 10.1.0.111
== Manager 'test' logged off from 10.1.0.111

Где test - это аккаунт созданный в /etc/asterisk/manager.conf

Вот такой формат у меня получился после правки под себя:

Код:
<?if (!empty( $_REQUEST['phone'])   && !empty( $_REQUEST['exten']  ) )
{
        $num = $_REQUEST['phone'];
        $ext = $_REQUEST['exten'];
        $num = preg_replace( "/^\+7/", "8", $num );
        $num = preg_replace( "/\D/", "", $num );
        if ( ! empty( $num ) )
        {
                echo "Dialing $num\r\n";
                $timeout = 10;
                $asterisk_ip = "10.1.2.2"; # адрес asterisk'a
                $socket = fsockopen($asterisk_ip,"5033", $errno, $errstr, $timeout); #5033 мы перебросили вместо стандартного 5038
                fputs($socket, "Action: Login\r\n");
                fputs($socket, "UserName: test\r\n"); #мой аккаунт который я создал
                fputs($socket, "Secret: password\r\n\r\n"); #пароль
                $wrets=fgets($socket,128);
                echo $wrets;
                fputs($socket, "Action: Originate\r\n" );
                fputs($socket, "Channel: Local/$ext@from-internal\r\n" );
                fputs($socket, "Exten: $num\r\n" );
                fputs($socket, "Context: from-internal\r\n" );
                fputs($socket, "Priority: 1\r\n" );
                fputs($socket, "Async: yes\r\n" );
                fputs($socket, "WaitTime: 15\r\n" );
                fputs($socket, "Callerid: $num\r\n\r\n" );
                $wrets=fgets($socket,128);
                echo $wrets;
        }
        else
        {
                echo "Unable to determine number from (" . $_REQUEST['phone'] . ")\r\n";
        }
}
else
{?>Please enter a number to dial.<br/>
<a href="http://10.1.0.111/2.php?phone=1050&exten=1053">1050</a> #урл с котрого пытаюсь звонить, мой номер 1053, звоню на 1050
<?}?>
При этом в браузере фраза: Dialing 1050 Asterisk Call Manager/1.3 Response: Success

Но звонка увы нет :(
 
можно так

/etc/asterisk/manager.conf

[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0


/etc/asterisk/manager.conf

[c2call]
secret=FrUyHn6FSaX
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
read=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate

Для применения изменений выполним reload:

asterisk -rx "module reload manager"


/etc/asterisk/sip.conf


[3200]
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
secret=3200
dtmfmode=rfc2833
canreinvite=no
context=OUT_IN1
host=dynamic
type=friend
nat=yes
port=5060
qualify=yes
callcounter=yes
faxdetect=no


После создания внутреннего номера, потребуется перечитать конфигурацию Asterisk:

asterisk -rx "sip reload"

На этом настройка Asterisk завершена.


Теперь переходим к созданию скрипта на PHP:

callback.php

<?php

# --- define globals ---
$strhost = "192.168.0.10";
$strport = "5038";
$timeout = "10";
$num=$_REQUEST['num'];
$cid=$_REQUEST['cid'];
$c=$_REQUEST['c'];
$p=$_REQUEST['p'];

$errno=0 ;
$errstr=0 ;

$sconn = fsockopen ($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed");

if (!$sconn) { echo "$errstr ($errno)<br>\n"; }

else {

fputs ($sconn, "Action: login\r\n");
fputs ($sconn, "Username: c2call\r\n");
fputs ($sconn, "Secret: FrUyHn6FSaX\r\n");
fputs ($sconn, "Events: off\r\n\r\n");
usleep(500);

fputs ($sconn, "Action: Originate\r\n");
fputs ($sconn, "Channel: SIP/$cid\r\n");
fputs ($sconn, "Callerid: $cid\r\n");
fputs ($sconn, "Timeout: 15000\r\n");
fputs ($sconn, "Context: $c\r\n");
fputs ($sconn, "Exten: $num\r\n");
fputs ($sconn, "Priority: $p\r\n\r\n");
fputs ($sconn, "Async: yes\r\n\r\n" );
fputs ($sconn, "Action: Logoff\r\n\r\n");
usleep (500);

fclose ($sconn);

}

?>


Теперь можно проверить генерацию вызова, используя следующий URL:

Для просмотра ссылки Войди или Зарегистрируйся
 
  • Нравится
Реакции: drop
Удивительно, но ранее пробовал этот метод и получал отлуп) А вот сегодня развернул второй астер (на виртуалке) и такой метод помог))) Остается додумать как это связать с адресной книгой AD и что б для каждого пользователя подставлялся его номер телефона при вызове)
 
Назад
Сверху