Cursos Asterisk en México

Script php para ejecutar macros

Colapsar

Anuncio

Colapsar
No hay anuncio todavía.
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Script php para ejecutar macros

    Hola, soy nuevo en el foro y la verdad no se donde poner mi consulta. Estuve en uno de los cursos de Asteriskmx y mi consulta es la siguiente:

    Estoy realizando un script en php que ejecuta una macro, la cual ejecuta una llamada al usuario (almacenado en una base de datos MySQL), lee su saldo y lo manda a un menú en el que pregunta al usuario si quiere pagar su cuenta.
    El problema es que cuando pulso una opción de ese menú me saca de la llamada.
    De antemano muchas gracias.

  • #2
    Para brindarte mas info deberás proveer la saluda del cli y el código de php que estas usando. Sin ver algo es difícil establecer la causa o la falla. La salida del cli de preferencia con el AGI debug activado.

    Comentario


    • #3
      Hola, muchas gracias por responder, éste es el código:

      #!/usr/bin/php -q
      <?php

      // Variables de configuración
      $dbhost= '127.0.0.1';
      $dbuser='root';
      $dbpass='asterisk';
      $dbname='pago';
      $tmpDir='/tmp/';
      $outDir='/var/spool/asterisk/outgoing/';

      // Conexión con la base
      $link = mysql_connect($dbhost, $dbuser, $dbpass);
      if (!$link)
      die('Conexión fallida: ' . mysql_error());

      // Escoger BD
      mysql_select_db($dbname);

      // Hacer query
      $query = "SELECT * FROM transacciones";
      $result = mysql_query($query,$link);
      if(!$result)
      die('Query inválido: ' . mysql_error());

      // Esqueleto del archivo de texto
      $file = "
      Channel: %s
      Application: Macro
      Data: pago,%s,%s,%s,%s";

      // Recorremos el resultado arrojado por el query y creamos un archivo
      // de texto por cada fila obtenida.
      // Movemos el archivo resultado a donde debe ir
      while($row = mysql_fetch_assoc($result)) {
      $randomFilename = md5(print_r($row,1));
      $fileResult = sprintf($file, $row['dialString'], $row['Tratamiento'], $row['apPatCliente'], $row['pagoServ'], $row['montoTrans']);
      $handle = fopen($tmpDir.$randomFilename, 'w+');
      fputs($handle,$fileResult);
      fclose($handle);
      // touch($tmpDir.$randomFilename,time()+10*++$n);
      rename($tmpDir.$randomFilename, $outDir.$randomFilename);
      }

      // Cerrar conexión.
      mysql_close($link);

      ?>

      Y ésta es la pantalla del CLI:

      -- Executing [s@macro-pago:1] Playback("SIP/100-00000001", "good") in new stack
      -- <SIP/100-00000001> Playing 'good.gsm' (language 'es')
      -- Executing [s@macro-pago:2] GotoIfTime("SIP/100-00000001", "0:00-11:59,*,*,*?dia") in new stack
      -- Executing [s@macro-pago:3] GotoIfTime("SIP/100-00000001", "12:00-23:59,*,*,*?tarde") in new stack
      -- Goto (macro-pago,s,6)
      -- Executing [s@macro-pago:6] Playback("SIP/100-00000001", "afternoon") in new stack
      -- <SIP/100-00000001> Playing 'afternoon.gsm' (language 'es')
      -- Executing [s@macro-pago:7] GotoIf("SIP/100-00000001", "tarde?cont") in new stack
      -- Goto (macro-pago,s,8)
      -- Executing [s@macro-pago:8] Playback("SIP/100-00000001", "welcome") in new stack
      -- <SIP/100-00000001> Playing 'welcome.gsm' (language 'es')
      -- Executing [s@macro-pago:9] Festival("SIP/100-00000001", "Se�or") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:10] Festival("SIP/100-00000001", "Benitez") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:11] Festival("SIP/100-00000001", "Ha llegado su cuenta de") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:12] Festival("SIP/100-00000001", "Agua") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:13] Festival("SIP/100-00000001", "Con un saldo de") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:14] SayNumber("SIP/100-00000001", "3456") in new stack
      -- <SIP/100-00000001> Playing 'digits/3.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/thousand.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/400.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/50.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/and.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/6.gsm' (language 'es')
      -- Executing [s@macro-pago:15] Playback("SIP/100-00000001", "dollars") in new stack
      -- <SIP/100-00000001> Playing 'dollars.gsm' (language 'es')
      -- Executing [s@macro-pago:16] SayNumber("SIP/100-00000001", "78") in new stack
      -- <SIP/100-00000001> Playing 'digits/70.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/and.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/8.gsm' (language 'es')
      -- Executing [s@macro-pago:17] Playback("SIP/100-00000001", "cents") in new stack
      -- <SIP/100-00000001> Playing 'cents.gsm' (language 'es')
      -- Executing [s@macro-pago:18] Festival("SIP/100-00000001", "Desea pagarla") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@macro-pago:19] Gosub("SIP/100-00000001", "menu,s,1") in new stack
      -- Executing [s@menu:1] Wait("SIP/100-00000001", "1") in new stack
      -- Executing [s@menu:2] Festival("SIP/100-00000001", "Por favor") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:3] Festival("SIP/100-00000001", "Diga un comando de voz") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:4] Festival("SIP/100-00000001", "para aceptar diga si") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:5] Festival("SIP/100-00000001", "o") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:6] Festival("SIP/100-00000001", "para rechazar diga no") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:7] Festival("SIP/100-00000001", "o siga las instrucciones") in new stack
      == Parsing '/etc/asterisk/festival.conf': Found
      -- Executing [s@menu:8] Set("SIP/100-00000001", "x=0") in new stack
      -- Executing [s@menu:9] Set("SIP/100-00000001", "x=1") in new stack
      -- Executing [s@menu:10] GotoIf("SIP/100-00000001", "0?Cuelga") in new stack
      -- Executing [s@menu:11] BackGround("SIP/100-00000001", "for-yes-press&digits/1") in new stack
      -- <SIP/100-00000001> Playing 'for-yes-press.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/1.gsm' (language 'es')
      -- Executing [s@menu:12] BackGround("SIP/100-00000001", "for-no-press&digits/2") in new stack
      -- <SIP/100-00000001> Playing 'for-no-press.gsm' (language 'es')
      -- <SIP/100-00000001> Playing 'digits/2.gsm' (language 'es')
      -- Executing [s@menu:13] WaitExten("SIP/100-00000001", "3") in new stack
      [May 6 21:40:38] NOTICE[5307]: pbx_spool.c:402 attempt_thread: Call completed to SIP/100
      alxbmart*CLI>

      Básicamente lo que sucede es que al teclear alguna opción del menú me saca de la llamada.
      De antemano muchas gracias.

      Comentario


      • #4
        Después de los 2 backgrounds no veo que hayan presionado algún dígito. Muestranos el dialplan y también habilita el Log de dtmf, es probable que quieras usar READ en lugar de background ya que este se usa para obtener una extensión ingresada por el usuario quizás por ahí esta el problema. No uses dos background seguidos puedes concatenar audios usando & en un background.

        Comentario


        • #5
          Ese es precisamente el punto, cuando oprimo una tecla me saca de la llamada y me da éste mensaje:

          [May 6 21:40:38] NOTICE[5307]: pbx_spool.c:402 attempt_thread: Call completed to SIP/100

          Ya he probado READ y me ha funcionado, pero me gustaría saber si hay alguna manera de implementar con Background.

          Éste es el dialplan, básicamente el script ejecuta ésta Macro y ésta salta al menu através de un GoSub.

          Econtré algo de información al respecto http://www.voip-info.org/wiki/view/A...cmd+BackGround. Habla acerca de
          utilizar background dentro de las macros, pero no se como implementarlo por que no me ha funcionado como lo describe la explicación. Saludos y muchas gracias.

          [macro-pago]
          ;Revisa el horario para enviar el saludo correcto
          same => n,GotoIfTime(0:00-11:59,*,*,*?dia)
          same => n,GotoIfTime(12:00-23:59,*,*,*?tarde)
          same => n(dia),Playback(days)
          same => n,GotoIf(dia?cont)
          same => n(tarde),Playback(afternoon)
          same => n,GotoIf(tarde?cont)
          same => n(cont),Playback(welcome)
          ;Recibe los parámetros de la tabla clientes
          same => n,Festival(${ARG1})
          same => n,Festival(${ARG2})
          same => n,Festival(Ha llegado su cuenta de)
          ;Recibe parámetros de la tabla servicios
          same => n,Festival(${ARG3})
          same => n,Festival(Con un saldo de)
          same => n,SayNumber(${CUT(ARG4,.,1)})
          same => n,Playback(dollars)
          same => n,SayNumber(${CUT(ARG4,.,2)})
          same => n,Playback(cents)
          same => n,Festival(Desea pagarla)
          ;Salta al menú de pago
          same => n,GoSub(menu,s,1)

          [menu]
          ;Inicia conteo para digitar opciones
          exten => n,Set(x=0)
          same => n(opciones),Set(x=$[${x}+1])
          same => n,GotoIf($[${x}>3]?Cuelga)
          same => n,Background(for-yes-press&digits/1&for-no-press&digits/2)
          same => n,WaitExten(3)
          same => n,Goto(opciones)
          same => n(Cuelga),Playback(vm-goodbye)
          same => n,Hangup

          exten => 1,1,Festival(Por favor diga su password de voz)
          same => n,Festival(o digite su clave numerica)

          exten => 2,1,Festival(Le llamaremos posteriormente)
          same => n,Playback(vm-goodbye)
          same => n,Hangup

          Comentario


          • #6
            El problema es tu plan de llamadas. Tienes esta línea
            Código:
            same => n,GoSub(menu,s,1)
            Pero la extensión s,1 no existe porque tu sintaxis está mal:
            Código:
            [menu]
            ;Inicia conteo para digitar opciones
            exten => n,Set(x=0)
            Reemplázalo por esto:
            Código:
            exten => s,1,Set(x=0)
            dCAP Christian Cabrera R.
            Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
            Si deseas asesoría pagada, por favor contáctame

            Comentario


            • #7
              Hola Christian, ese fue un pequeño error que tuve al copiar el código, ya que quise recortarlo un poco y cometí el error de no corregirlo, éste es el original:

              [menu]
              exten => s,1,Wait(1)
              same => n,Festival(Por favor)
              same => n,Festival(siga las instrucciones)
              ;Inicia conteo para digitar opciones
              exten => n,Set(x=0)
              same => n(opciones),Set(x=$[${x}+1])
              same => n,GotoIf($[${x}>3]?Cuelga)
              same => n,Background(for-yes-press&digits/1&for-no-press&digits/2)
              same => n,WaitExten(3)
              same => n,Goto(opciones)
              same => n(Cuelga),Playback(vm-goodbye)
              same => n,Hangup

              exten => 1,1,Festival(Por favor diga su password de voz)
              same => n,Festival(o digite su clave numerica)

              exten => 2,1,Festival(Le llamaremos posteriormente)
              same => n,Playback(vm-goodbye)
              same => n,Hangup

              Pero el problema en realidad era que al teclear alguna opción me saca de la llamada. Recibí una buena solución de navaismo, la cual fué utilizar READ en lugar de BACKGROUND, y ésta si funcionó, pero
              me gustaría saber si se puede utilizar background dentro de una macro y como implementarla en el caso de que se pueda. Muchas gracias.

              Comentario


              • #8
                Decidí al fin trabajar con READ, les agradezco su atención a navaismo y a Christian, dejo aquí el código como lo he implementado
                por si alguien con el mismo problema que yo llegase a necesitarlo. Por su atención mil gracias.

                [menu]
                exten => s,1,Set(wait=1)
                same => n,Festival(Por favor)
                same => n,Festival(siga las instrucciones)
                ;Inicia conteo para digitar opciones
                same => n,Set(x=0)
                same => n(opciones),Set(x=$[${x}+1])
                same => n,GotoIf($[${x}>3]?Cuelga)
                same => n,Playback(for-yes-press)
                same => n,Playback(digits/1)
                same => n,Playback(for-no-press)
                same => n,Playback(digits/2)
                same => n,Read(tecla1,,1,s,,${wait})
                same => n,Read(tecla2,,1,2,,${wait})
                same => n,GotoIf($["${tecla1}"="1"]?1,1)
                same => n,GotoIf($["${tecla2}"="2"]?2,1)
                same => n,Goto(opciones)
                same => n(Cuelga),Playback(vm-goodbye)
                same => n,Hangup

                exten => 1,1,Festival(Por favor diga su password de voz)
                same => n,Festival(o digite su clave numerica)

                exten => 2,1,Wait(1)
                same => n,Festival(Le llamaremos posteriormente)
                same => n,Playback(vm-goodbye)
                same => n,Hangup

                Comentario

                Principales Usuarios Activos

                Colapsar

                No hay usuarios activos superiores.
                Trabajando...
                X