quarta-feira, 8 de junho de 2016

0800WEB / click-to-call com asterisk

Resumindo... O 0800Web é uma ferramenta que qualquer site pode ter para que os usuários digitem seus números telefônicos e recebam ligação da equipe da empresa ou do site no mesmo momento ou quando desejarem.

Aqui utilizaremos uma conexão AMI com o servidor responsável por efetur a chamada.

Sem delongas, vamos logo ao que interessa:


Na área do site, teremos 2 arquivos, o primeiro contém apenas o html do site e irei chamar aqui de ligame.html e o segundo é o que faz a conexão do PHP com o asterisk.


ligame.html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>0800WEB DRAsterisk</title>
</head>
<body>
<form action="ligar.php" method="post">
<h3>DRAsterisk Liga-me</h3>
<label>Telefone com DDD:</label>
<input type="number" name="fone" required="required"/>
<button type="submit">Liga-me</button>
</form>
</body>

</html>


O arquivo ligar.php, é o segundo arquivo da área do site e é reponsável pela conexão com o asterisk e o envio da chamada. Ele também faz uma pequena validação afim de encontrar algum erro no retorno da conexão e envio da ligação.

ligar.php


<?php
//RECEBENDO NUMERO
$num = $_POST['fone'];
    echo "Dialing $num\r\n";
    $timeout = 10;
    $asterisk_ip = "192.168.1.201";
$user_manager = "drasterisk";
$senha_manager = "teste";
$channel = "SIP/4000"; //Canal interno que irá receber a chamada
$context = 'contexto-ligame';

//FAZENDO CONEXAO COM ASTERISK
$socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, 10);
    if (!$socket){
echo "$errstr ($errno)\n";
}else{
   fputs($socket, "Action: Login\r\n");
   fputs($socket, "UserName: ".$user_manager."\r\n");
   fputs($socket, "Secret: ".$senha_manager."\r\n\r\n");
            //ORIGINANDO A CHAMADA
            fputs($socket, "Action: Originate\r\n" );
   fputs($socket, "Channel: ".$channel."\r\n" );
   fputs($socket, "Exten: ".$num."\r\n" );
   fputs($socket, "Context: ".$context."\r\n" );
   fputs($socket, "Priority: 1\r\n" );
   fputs($socket, "Async: yes\r\n\r\n" );
            fputs($socket, "Action: Logoff\r\n\r\n");
            /****************DEBUGAR*****************/
            //while (!feof($socket)){
            //  $retorno[] = fgets($socket);
            //}
            fclose($socket);
       }
       //VERIFICANDO SE TEM ALGUM ERRO
$result = '';
for ($i=0; $i < count($retorno) ; $i++) {
$result = (preg_match("/Response: Error/",$retorno[$i]))?'erro':$result;
echo $retorno[$i]."<br/>"; //para debugar
}
if($result == "erro"){
echo "Não foi possíve efetuar a ligação";
}else{
echo "Aguarde o retorno da chamada";
}

sleep(5);
header("Location: ligame.html");

?>


Do lado do asterisk, iremos alterar dois arquivo também (manager.conf e extensions.conf).

O manager.conf é responsável por liberar a conexão realizada pelo PHP através de um usuário e senha de autenticação, procuro também limitar somente aos IPs permitos.

/etc/asterisk/manager.conf


[general]
enabled = yes
;webenabled = yes
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
permit = 192.168.1.0/255.255.255.0
port = 5038

[drasterisk]
secret = teste
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user

No extensions.conf, criaremos um contexto para tratar as chamadas realizadas pela interface. Aqui criei apenas um básico, mais pode-se adequar para a sua necessidade.

/etc/asterisk/extensions.conf

[contexto-ligame]
exten => _ZZ[2-9].,1,NoOp(---> NOVA LIGACAO 0800WEB <--)
same => n,Set(CDR(accountcode)=0800WEB)
same => n,Dial(SIP/operadora/0${EXTEN},60,Tg) ;SAINDO PELO VOIP
;same => n,Dial(Khomp/b0l0/021${EXTEN},60,Tg) ; SAINDO PELO HARDWARE KHOMP
;same => n,Dial(Dahdi/g0/021${EXTEN},60,Tg) ; SAINDO PELO HARDWARE DIGIUM
same => n,Hangup


É isso ai, agora basta fazer algumas modificações para adaptar da forma que precisa.

Para quem usa Elastix, ao invés de alterar o arquivo extensions.conf, altere o arquivo extensions_custom.conf (se não me falha a memória).

Para consultoria em asterisk: daniloricalmeida@gmail.com e skype danilo.almeida33

Abraços!


11 comentários:

  1. Muito bom, Funcionou!! excelente post!!!

    ResponderExcluir
  2. Danilo, ficou muito bom. me ajudou bastante. Mas deixa te perguntar uma coisa. Se no lugar de um ramal Sip eu quisesse que fosse para uma queue, como faria nesse caso ?
    Obrigado

    ResponderExcluir
    Respostas
    1. Blz Adriano!! Nesse caso, você altera o channel (canal interno) do seu script mandando para um contexto local criado no seu extensions. Ex:

      $channel = "Local/2000@contexto-fila"; //Canal interno que irá receber a chamada

      Onde o 2000 seria a extensão que vc pegaria no contexto-fila do seu arquivo extensions.conf.

      Voce poderia criar um contexto da seguinte maneira:

      [contexto-fila]
      exten => _2000,1,NoOp(---> NOVA LIGACAO 0800WEB PARA FILA 2000 <--)
      same => n,Set(CDR(accountcode)=0800WEB)
      same => n,Queue(ATENDIMENTO,t,,,320)
      same => n,Hangup

      Excluir
  3. Opa. Danilo. Fiz e deu certinho. Muito obrigado pela ajuda. Aproveitando, só mais uma coisa. Nesse caso como eu faria para o numero do telefone aparecer no bina? pois quando a pessoa na fila recebe a chamada está aparecendo como Unknown. Teria como aparecer o numero do telefone da pessoa que digitou no clicktocall ?

    ResponderExcluir
    Respostas
    1. Adriano, adicione a seguinte linha no arquivo ligar.php

      fputs($socket, "Callerid: ".$num."\r\n" );

      Pode ser logo abaixo da linha:
      "fputs($socket, "Exten: ".$num."\r\n" );"

      Talvez resolva!

      Excluir
    2. Danilo, testei e deu certinho. Muito obrigado pela ajuda.

      Excluir
  4. No caso do Elastix o Funcionamento e Igual ?

    ResponderExcluir
    Respostas
    1. trabalhei com elastix a muito tempo, não sei exatamente como está agora, mais com alguns ajustes deve funcionar sim.

      Excluir
  5. Danilo Almeida, Parabéns pelo artigo.
    Como eu faço para discar para o "cliente" e quando a chamada for atendida encaminhar para o atendente? grato pelo retorno.

    ResponderExcluir
  6. Primeiramente, Parabéns pelo artigo.

    Agora uma dúvida, como posso fazer para encaminhar para uma URA e esperar o "cliente" atender e só depois disso começar a tocar a gravação?

    Desde já obrigado!

    ResponderExcluir