Cursos Asterisk en México

CTI - Jabber

Colapsar

Anuncio

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

  • CTI - Jabber

    Y este ya es para nota . Hace un tiempo se estuvo viendo como podríamos implementar un componente para notificar, en realidad se hablaba de CRM pero en esta ocasión vamos a intentar generalizar.

    ¿Qué se hizo? Muy facil son 3 líneas:
    Obtenemos el jid (jabber_id) del usuario al que se está llamando.
    Obtenemos información del llamante que queremos enviar.
    Enviamos la información en un mensaje jabber.

    Pasos previos o ¿Qué necesitamos?.
    1. Almacenar en la BBDD el jid de los usuarios. En esta ocasión he usado la tabla users (la del voicemail). Añadimos el campo jid_username y aquí solamente va la parte del usuario del jid, esto es así ya que el sjap usa siempre el mismo servidor jabber (no lo tiene como parámetro, aunque eso se puede arreglar facilmente)
    2. Crear un usuario jabber para que lo use el componente. Por ejemplo, igtcti@jabber.org.
    3. Un pequeño script que encontré en Libertonia y que sirve para mandar mensajes vía jabber. http://libertonia.escomposlinux.org/sto ... 181459/780

    Y ahora vamos al lío: cti.agi
    Código:
    #!/usr/bin/perl
    ## cti.agi, is an AGI script for sending via XMMP callers  information to an user with jabberid 
    ###
    #######################################################################
    ###                                                                   #
    ###  Please note that this release is incredibly alpha.  In fact, so  #
    ###  alpha, it probably shouldn't even be released.                   #
    ###                                                                   #
    #######################################################################
    ###
    ### Version : 0.01
    ###
    ### Author  : Antonio F. Cano (antonio@igestec.com)
    ### Credits : 
    ###           For sending jabber messages we use the Sjab perl script modified by atordo ([url]http://libertonia.escomposlinux.org/story/2004/9/29/181459/780[/url]) 
    ###
    ### Usage   : To send a message to a user from the dialplan
    ###           exten => 215,3,AGI(cti.agi,${DNID},${CALLERIDNUM});
    ###
    #######################################################################
    ###
    ###  This program is free software; you can redistribute it and/or
    ###  modify it under the terms of the GNU General Public License as
    ###  published by the Free Software Foundation; either version 2 of
    ###  the License, or (at your option) any later version.
    ###
    ###  This program is distributed in the hope that it will be useful,
    ###  but WITHOUT ANY WARRANTY; without even the implied warranty of
    ###  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ###  GNU General Public License for more details.
    ###
    ###  You should have received a copy of the GNU General Public License
    ###  along with this program; if not, write to the
    ###
    ###               Free Software Foundation, Inc.,
    ###               59 Temple Place - Suite 330,
    ###               Boston, MA 02111-1307, USA.
    ###
    #######################################################################
    
    use Asterisk::AGI;
    use DBI;
    
    $AGI = new Asterisk::AGI;
    
    my %input = $AGI->ReadParse();
    my ($dnid,$callerid)=@ARGV;
    
    #Obtiene el jid del usuario de la bbdd
    $jid_user = get_jid($dnid);
    if ( $jid_user ) {
    #Obtiene la información del callerid. Lo pongo en una función aparte, ya que esto puede ser todo lo complicado que nuestro sistema requiera. De forma que desde esta función se podría llamar a otro programa/script para que obtuviera esa información
            $caller_info =  get_callerid_info( $callerid );
    
            $mensaje = compose_msg( $caller_info );
            my $execf="/var/lib/asterisk/agi-bin/sjab.pl -u igtcti -p password -t $jid_user -q 'iGesTec - cti' -m '$mensaje'";
            system($execf);
    }
    
    sub compose_msg( $caller_info ) {
            my ($segundo,$minuto,$hora,$dia,$mes,$anio,$diaSemana) = (localtime(time))[0,1,2,3,4,5,6];
            my @dias = ('Domingo','Lunes','Martes','Miércoles', 'Jueves','Viernes','Sábado');
            my @meses = ('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio', 'Agosto','Septiembre','Octubre','Noviembre','Diciembre'); 
    
            my $hora = sprintf("%02d:%02d:%02d",$hora,$minuto,$segundo);
            my $fecha = "$dias[$diaSemana] $meses[$mes] $dia del $anio a las $tiempo";
    
    #Aquí si tuvieramos una Web podríamos componer la URL que modificara la ficha de la persona que está llamando
            $mensaje = "$fecha - $hora \n\n Le esta llamando " . $callerid_info;
            return $mensaje;
    }
    
    sub get_callerid_info( $callerid ) {
            %MYSQL = (
                    hostname => "localhost",
                    username => "root",
                    password => "",
                    database => "asterisk"
            );
    
            my $dbh = DBI->connect("dbi:mysql:$MYSQL{database}:$MYSQL{hostname}","$MYSQL{username}","$MYSQL{password}")
                    || die ("No pudo conectar\n");
    
            my $query = "SELECT fullname, email  FROM users WHERE mailbox=$callerid";
            my $recordset = $dbh->prepare($query);
            $recordset->execute
                    || die ("No pude ejecutar la consulta");
    
            my $caller_info = $recordset->fetchrow_hashref;
            if ( $caller_info ) {
                    $mensaje = "$callerid - $caller_info->{fullname} ($caller_info->{email})";
            } else {
                    $mensaje = "Usuario desconocido";
            }
            return $mensaje; 
    }
    
    sub get_jid( $dnid ) {
            %MYSQL = (
                    hostname => "localhost",
                    username => "root",
                    password => "",
                    database => "asterisk"
            );
    
            my $dbh = DBI->connect("dbi:mysql:$MYSQL{database}:$MYSQL{hostname}","$MYSQL{username}","$MYSQL{password}")
                    || die ("No pudo conectar\n");
    
            my $query = "SELECT jid_username FROM users WHERE mailbox=$dnid";
            my $recordset = $dbh->prepare($query);
            $recordset->execute
                    || die ("No pude ejecutar la consulta");
    
            my $jid = $recordset->fetchrow_hashref;
            return $jid->{jid_username};
    }
    Y esto como se usa, pues más facil todavía. Nos vamos al dialplan y hacemos lo siguiente:
    exten => 215,3,AGI(cti.agi,$NumeroAlQueLlamamos,${CALLERIDN UM});

    Aahhh se me olvidava. En las pruebas estoy usando el servidor jabber.org, hay que modificar el sjab.pl en la siguiente linea para poner lo que vayamos a usar:
    my $SERVER = "jabber.org";

    Cuando alguien llame al 215, me dejaría un mensajito jabber más bonico que toas las cosas.

    Y esto es todo amigos, espero que les sirva de ayuda. Estaría bien adaptar este script para que funcionase con las Colas del Asterisk, pero ese es un tema que desconozco por el momento.

  • #2
    Pequeño bug, en la línea 65 donde pone
    $mensaje = "$fecha - $hora \n\n Le esta llamando " . $callerid_info;

    Tiene que poner

    $mensaje = "$fecha - $hora \n\n Le esta llamando " . $caller_info;

    Comentario


    • #3
      Imaginate algo, que llames a un numero y escogiendo opciones puedas mandarle al jabber selecciones como agregar tiempo de vida a la cuenta, desactivarla, o enviarle un mensaje a alguien en tu lista de contacto entre otras
      Que tanto de esto lo crees posible?

      Comentario


      • #4
        Pos mira hoy me pillas optimista pero espeso.

        A ver, con todo esto se puede hacer lo que quieras. Bueno más bien diría el tener un lenguaje de porgramación que interactua con la centralita, te da una flexibilidad impresionante y puedes hacer maravillas. Pero es que la magia de AGI es que usa el STDIN/OUT para la interfaz y puedes usar casi cualquier lenguaje de programación.

        Solo hay que tener muy claro que es lo que quieres conseguir, centrarte en lo relevante y luego ya nos peleamos con la programación.

        Como dije, hoy me pillas espeso y no termino de comprender que es lo que quieres conseguir. ¿Enviar mensajes al jabber usando el teléfono? Lo único que tendrías que añadir al script anterior es un get_data() y pillar por el DTMF lo que quieras enviar, al estilo de la aplicación Directory la cual con DTMF le puedes decir las tres primeras letras de un apellido que luego va a usar para realizar la búsqueda.

        Pero no creo que sea eso lo que preguntas, porque la verdad no lo veo práctico para el usuario que llama. Igual podrías hacer para esto una llamada a VoiceMail y que llame al script sjab para mandar la alerta por jabber de la recepción de un mensaje en el buzón de voz.

        Lo de agregar tiempo de vida a la cuenta, desactivarla. Eso una sencillita IVR te lo podría hacer.

        Comentario

        Principales Usuarios Activos

        Colapsar

        No hay usuarios activos superiores.
        Trabajando...
        X