reconocer la compañia a la que pertenece un numero

ago 03

Buenas, hace un tiempo que no escribía algo por aquí, voy a tratar de escribir cosas un poco más seguido.

Ahora les traigo una mini-aplicacion que reconoce la compañia del numero a la que se esta llamando, por ahora sólo funciona con números de teléfonos móviles chilenos, más adelante agregaré los teléfonos fijos y quizá los de otros países. Lo primero que haremos es descargar una base de datos en SQLite3 hecha por mi en base a la numeración publica entregada por la Subtel

Descargar Base

Tienes que descargar el archivo anterior en el directorio /var/lib/asterisk/agi-bin o bien donde tengas los archivos AGI (ver /etc/asterisk/asterisk.conf), ahora veremos el programa que se encarga de realizar las consultas y determina cual es la compañía.

  1. #!/usr/bin/php -q
  2. <?php
  3. /**
  4.  * Determina la compania del celular ingresado
  5.  * Uso:
  6.  * ./cia.php digitos celular
  7.  * digitos: cantidad de digitos a ignorar en celular, desde la izquierda.
  8.  * celular: celular a chequear
  9.  *
  10.  * @author     Mario Hernandez <mario@spooky.cl>
  11.  * @since      03/08/2009
  12.  * @copyright  Creative Commons 2.0 Chile – Atribucion-Compartir Igual
  13.  *
  14.  */
  15.  
  16. // true para guardar la compania en el campo userfield del cdr
  17. $userfield = true;
  18.  
  19. // String donde se encuentra la base
  20. $dbString = "sqlite:numeracion.db";
  21.  
  22. // ruta absoluta de la clase phpAGI
  23. $phpAgi = "./phpagi.php";
  24.  
  25. if ($argc != 3 || in_array($argv[1],array("-h","–help"))) {
  26.     echo "Uso: ./cia.php digitos celular\n";
  27. } else {
  28.     include_once($phpAgi);
  29.  
  30.     //Creando objeto
  31.     $agi = new AGI();
  32.     $numero = substr($argv[2],$argv[1]);
  33.     $prefijo = substr($numero,0,4);
  34.     $prefijo2 = substr($numero,4,1);
  35.     //echo "El numero es: $argv[2]\n";
  36.     //echo "El prefijo es: $prefijo\n";
  37.     //echo "El prefijo2 es: $prefijo2\n";
  38.     $db = new PDO($dbString);
  39.     $query = "SELECT fkCompania,prefijo, prefijo2 FROM prefijos WHERE prefijo = '{$prefijo}'";
  40.     $resultado = $db->query($query,PDO::FETCH_ASSOC);
  41.     $filas = $resultado->fetchAll();
  42.     $totalRegistros = count($filas);
  43.     if ($totalRegistros <= 0) {
  44.         // Menor o igual a 0, no hay registros
  45.         //echo "Ese prefijo no esta en la base\n";
  46.         $agi->verbose("No se encontro el prefijo");
  47.         exit(1);
  48.     } else {
  49.         if ($totalRegistros > 1) {
  50.             // mayor que 1, hay mas de un resultado
  51.             foreach ($filas as $fila) {
  52.                 if ($fila['prefijo2'] == $prefijo2) {
  53.                     //echo "Mas de 1 Cia: {$fila['fkCompania']}\n";
  54.                     $q = "SELECT nombreCompania, tipoCompania FROM companias WHERE idCompanias = '{$fila['fkCompania']}'";
  55.                 }
  56.             }
  57.         } else {
  58.             //solo una coincidencia
  59.             //echo "Solo 1 Cia: {$filas[0]['fkCompania']}\n";
  60.             $q = "SELECT nombreCompania, tipoCompania FROM companias WHERE idCompanias = '{$filas[0]['fkCompania']}'";
  61.         }
  62.         if (!isset($q)) {
  63.             $agi->verbose("No se encontro el prefijo");
  64.             exit(1);
  65.         } else {
  66.             $res = $db->query($q,PDO::FETCH_ASSOC);
  67.             $info = $res->fetchAll();
  68.             //echo "Compania: {$info[0]['nombreCompania']}\n";
  69.             //echo "Tipo: {$info[0]['tipoCompania']}\n";
  70.             $agi->verbose("Tipo: {$info[0]['tipoCompania']} – Compania: {$info[0]['nombreCompania']}");
  71.             if ($userfield == true) {
  72.                 $agi->set_variable("CDR(userfield)",$info[0]['nombreCompania']);
  73.             }
  74.         }
  75.     }
  76. }
  77. exit(1);
  78. ?>

o puedes descargarlo

recuerda dejarlo con permisos de ejecución (o asterisk no será capaz de ejecutarlo), puedes probarlo ejecutando ./cia.php 0 74567890

Ahora debemos integrarlo al dialplan de asterisk, esto se hace escribiendo algo como esto dentro del contexto de las llamadas (voy a poner el ejemplo de una llamada a celular)

  1. exten => 09.,1,AGI(cia.php,2,${EXTEN})

dentro del contexto que tienes habilitado para llamar, dentro de la llamada AGI tenemos el primer parametro del AGI mismo, el segundo parametro es la cantidad de digitos a ignorar desde la izquierda, y el tercer parámetro es el numero de celular, en este caso con formato 09+Celular.

lo que hace el programa es toma el numero completo (0974567890) e ignora los 2 primeros digitos (09) y realiza las verificaciones con los restantes (74567890)

Requisitos:

  • El programa usa PHP5 y phpagi, necesitas descargar e instalar la librería al directorio /var/lib/asterisk/agi-bin/
  • Necesitas la extension PDO de PHP5. php5-pdo en Debian php-pdo en CentOS, si usas elastix u otra versión empaquetada es probable que ya la tengas instalada.

2 comments

  1. José Vergara /

    Alexandra, eso puedes hacerlo con otra aplicación, y esta muy bueno esto mario.

    Saludos.

  2. alexandra /

    Saludos, Mario
    Lei tu post que esta muy interesante, yo actualmente estoy trabajando con trixbox y quiero crear un archivo php que me permita reconocer quien esta llamando y luego almacenar este numero en una base de datos para que ejecute un ivr especifico para el usuario llamante, no se si podrias guiarme en esto ya que soy nueva en programacion en php para uso del Agi de asterisk.

    Att:
    Alexandra
    kchorrita25@yahoo.es

Leave a Reply