Ищу Asterisk web call

Тема в разделе "Коммерческие", создана пользователем drop, 9 янв 2015.

Информация :
Публиковать (для всех) нуленые версии, особенно от modulesgarden КАТЕГОРИЧЕСКИ не стоит. Тема мониторится оным разработчиком, а к нам приходят абузы которые нельзя игнорировать.
Модераторы: Amazko, Aste
  1. drop

    drop

    Регистр.:
    1 янв 2007
    Сообщения:
    413
    Симпатии:
    190
    Есть ли скрипт для звонков через сайт? Принцип таков: человек зайдя на сайт, нажимает на номер телефона (к примеру 1122) и в этот момент осуществляется звонок на стационарный IP телефон. Можно даже через коллбек, но что б он срабатывал на номер вызывающего абонента (так же IP телефон).
     
  2. metsys

    metsys

    Регистр.:
    27 апр 2014
    Сообщения:
    450
    Симпатии:
    434
    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>
     
    Последнее редактирование: 9 янв 2015
  3. drop

    drop

    Регистр.:
    1 янв 2007
    Сообщения:
    413
    Симпатии:
    190
    Хм, при тесте вот что я вижу
    Код:
    Notice: Undefined index: phone in \www\1.php on line 5
     
  4. metsys

    metsys

    Регистр.:
    27 апр 2014
    Сообщения:
    450
    Симпатии:
    434
    попробуй заменить
    PHP:
    $phone=$_POST['phone'];
    на
    PHP:
    if (isset($_POST['phone'])) {$phone $_POST['phone'];}
     
  5. drop

    drop

    Регистр.:
    1 янв 2007
    Сообщения:
    413
    Симпатии:
    190
    Хм... А если размещение скрипта не на одном сервере с астериском стоит? Как этот скрипт выполнить?
     
  6. metsys

    metsys

    Регистр.:
    27 апр 2014
    Сообщения:
    450
    Симпатии:
    434
    эта строка
    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 нравится это.
  7. drop

    drop

    Регистр.:
    1 янв 2007
    Сообщения:
    413
    Симпатии:
    190
    Попробую вечерком. Кстате вот паралельно искал решения своего вопроса, нашел вот такое:

    Все бы ничего, но в консоли астера при попытке звонка у меня мгновенно появляется сообщение:
    == 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

    Но звонка увы нет :(
     
  8. metsys

    metsys

    Регистр.:
    27 апр 2014
    Сообщения:
    450
    Симпатии:
    434
    включайте отладку, проверяйте настройки Перейти по ссылке
    этого недостаточно для отлова проблемы
     
  9. Mr.Shadows

    Mr.Shadows Писатель

    Регистр.:
    7 янв 2015
    Сообщения:
    1
    Симпатии:
    1
    можно так

    /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 нравится это.
  10. drop

    drop

    Регистр.:
    1 янв 2007
    Сообщения:
    413
    Симпатии:
    190
    Удивительно, но ранее пробовал этот метод и получал отлуп) А вот сегодня развернул второй астер (на виртуалке) и такой метод помог))) Остается додумать как это связать с адресной книгой AD и что б для каждого пользователя подставлялся его номер телефона при вызове)