AGI Portabilidade para números móveis em Asterisk
Postei estes dias um source em python para descobrir a portabilidade de números móveis na comunidade Asterisk e meu email começou a lotar sobre perguntas de como construir um AGI para rotear as chamadas por um gateway GSM etc etc.
Cada um tem um cenário diferente do outro vou postar a essencia do Script em Perl + Agi para descobrir para qual operadora um número móvel pertence a partir disso é simples, mas se precisarem de ajuda para algo estamos ae …
Já tem nego me Perguntado pq nao fez em Python o AGI??
R: Acordei com vontade de fazer em perl …
Script Perl
#!/usr/bin/perl -w
use Asterisk::AGI;
use WWW::Mechanize;
use MIME::Base64;
my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
my @operadoras = (“Eder”, “Claro”, “Tim”, “Vivo”, “Telemig”, “Oi”, “Nextel”, “Brasil telecom”, “Sercomtel”, “CTBC”);
my $num_saida = $AGI->get_variable(‘EXTEN’);
$num_saida = substr($num_saida,3,10);
$m = WWW::Mechanize->new();
my $data = decode_base64(‘aHR0cDovL3dlYnNlcnZpY2VzLnR3d3dpcmVsZXNzLmNvbS5ici9yZWx1emNhcC93c3JlbHV6Y2FwL’ . ‘mFzbXg=’);
$m->add_header(Referer => $data);
my $s = $data . “/VerOperadora?celular=55” . $num_saida;
$m->get($s);
$c = $m->content;
$c =~ m/>(\d+)</;
$AGI->exec(“NoOp”,”$num_saida”);
$AGI->exec(“NoOp”,”$operadoras[$1]”);
# O codigo se adapta conforme o cenario de cada um, mudar o DIAL para rotear a saida da operadora em questao
####$AGI->exec(“Dial”,”SIP/MUDE AQUI PARA SUA SAIDA SIP ou GSM ou ZAP ou DAHDI ou UNICALL ou DVG etc etc|10″);
# FIM
Extensions.conf
minha linha para a chamada do AGI de testes
exten => _999.,1,agi,pega.pl
ou seja só discar no seu telefoneIP ou sftphone “999+num_do_celular”
Tela:
UPDATE:
12/03/2014
É incrível a quantidade de emails que recebo pedindo para encontrar meios de mostrar números portados, hoje eu tive um tempinho e escrevi um novo código, se olharem no código vão perceber que eu inclui um proxy para enviar as requisições, o site é bem “esperto” e bloqueia todo o range de IP de sua rede pública se ocorrer muitos requests, (descobri isso da pior maneira enquanto debugava o site), então vocês podem criar uma lista randômica com vários IPs que tenham proxy aberto para enviar as solicitações, código em https://gist.github.com/ederwander/9512693 !
Fui
Eng Eder de Souza
Boa tarde Eder, eu tambem desenvolvi um sistema para portabilidade e roteamento de chamadas. Gostaria de poder conversar contigo para trocarmos idéias sobre o assunto.
eu nao entendo de programacao, mas eu me interesso
de qualquer forma me surgiu uma duvida: este codigo faz busca em algum banco de dados oficial da portabilidade pra saber qual a operadora de um numero, é isso?
entendo… mas o que eu nao entendi é onde aparece essa consulta ao DBO no seu programa.
vlw por ter respondido da outra vez
Olá Eder. Estou com a mesma dúvida do Felipe. Onde consigo consultar via algoritmo a operadora a que um número pertence? A única fonte de consulta que conheço é web based e depende de validação humana.
Vamos lá neste meu Source eu estou criptografando o lugar de onde estou buscando a consulta, dessa maneira minimiza as chances de o source ser encontrado por alguns robts…
Repare nesta linha: aHR0cDovL3dlYnNlcnZpY2VzLnR3d3dpcmVsZXNzLmNvbS5ici9yZWx1emNhcC93c3JlbHV6Y2FwL’ . ‘mFzbXg=
é nesta linha que a mágica acontece ela esta criptografada 🙂
nao sei se já viu mas eu fiz um source publicado aqui neste Blog sobre outro método de pegar essa consulta diretamente do http://consultanumero.abr.net.br
Esta aqui
Essa técnica demonstra como é possivel passar pela validação humana (captcha)
[]’s
Eng Eder de Souza
passar pela validacao humana é mt bom
eu imaginei um software (nao sou programador!) que fizesse uma busca ao consultanumero toda vez q fosse feita uma ligacao pra celular, guardar esse numero em um BD interno e fazer nova consulta pra esse numero depois de um ou dois meses para reciclagem, caso fosse solicitado nova chamada. entao, faria a melhor rota de ligacao, utilizando chips de celular de varias operadoras
mas se eles mudarem a forma de validação, deveria ser necessario um novo programa pra validar, ai daria prejuizo ate contornar o problema de novo.não seria bom para clientes de PBX IP saber que existe esse risco. o programa nao saberia pra onde rotear as chamadas e no final do mês viria o boom na conta
vc sabe qnt ta custando o banco de dados do consultanumero?
eu me correspondi com o noel rocha, criador do PORTABILIDADE FACIl para IPHONE. ele me falou que atualiza o BD dele de mes em mes pra poder prestar o servico do Iphone.
[]s
Felipe Consultar via DBO nao sairia menos de 4 mil reais por mês, por este motivo a existencia dos riscos as vezes compensa.
Quando falamos em TelefoniaIP logo pensamos “Reduzir Custos”, imagine você chegar para um diretor ou Superior e falar “quer fazer chamadas mais baratas sabendo qual rota mais economica tomar? para isso tem que pagar a bagatela de 4 MIL” isso sim seria um BOOOMMM….
Varias pessoas entraram em contato comigo para iniciar projetos livres para consultas, mas ultimamente nao ando tento muito tempo, estou fortemente envolvido com o FreeSwitch e varias outras coisas!
Uma idéia sobre como desenvolver consultas universais seria o uso do DUNDI na qual funcionaria como um DNS para números de telefone ….
Isso ae se precisar de algo estamos ae !
[]’s
Eng Eder de Souza
eu assumo que pensei que seria bem mais caro, afinal sao dezenas de milhoes de numeros de celulares.
o caso é que para UMA empresa o BDO seria custoso, mas esse serviço poderia ser vendido nao? pelo menos pelo preço de custo, ou com uma versao free e outra paga etc
vai do empreendedorismo no assunto
acho que eu li sobre o DUNDI. mas eu pensei que esse DNS para numeros telefonicos era o ENUM. vou me informar
seja la ql seja, seria importante uma normalizacao… porque qualquer um poderia pegar o numero do banco do brasil por exemplo e cadastrar como seu. e os que usam o serviço poderiam se dar mal. só um exemplo
eu assumo que pensei que seria bem mais caro, afinal sao dezenas de milhoes de numeros de celulares.
o caso é que para UMA empresa o BDO seria custoso, mas esse serviço poderia ser revendido nao? pelo menos pelo preço de custo, ou com uma versao free e outra paga etc
vai do empreendedorismo no assunto
acho que eu li sobre o DUNDI. mas eu pensei que esse DNS para numeros telefonicos era o ENUM. vou me informar
seja la ql seja, seria importante uma normalizacao… porque qualquer um poderia pegar o numero do banco do brasil por exemplo e cadastrar como seu. e os que usam o serviço poderiam se dar mal. só um exemplo
desculpa a mensagem duplicada, coisas de navegador
No Problem
em tempo da uma olhada em
http://mirror.su.lt/voip-info/wiki/index04bdcbe9de6fa65346e6d028c18bd2ed.html?page=Asterisk+func+dundilookup
http://pt.wikipedia.org/wiki/E.164
[]’s
Eng Eder de Souza
amigo vi seu codigo perl mas nao consegui executar no meu asterisk
quando dei alguns comandos ali ele informou que nao encontrou alguns arquivos como o Mechanizer e Base64
Poderia explicar melhor o funcionamento, sou meio leigo.
grato
Esta faltando esta dependencia !
como root execute
perl -MCPAN -e shell
install WWW::Mechanize::Cached
quit
agora apareceu isso :S
Cannot unzip, no unzip program available
cara, to ficando maluco com isso :s
se puder me dar uma luz agradeço.
faz uma semana q nao saio de cima disso
valeu
por ultimo consegui isso:
[root@elastix html]# python port.py 19-3323-3233
Traceback (most recent call last):
File “port.py”, line 20, in ?
r = ClientCookie.urlopen(“http://consultanumero.abr.net.br:8080/consultanumero/jCaptcha.do?metodo=carregar”)
File “build/bdist.linux-i686/egg/ClientCookie/_urllib2_support.py”, line 824, in urlopen
File “/usr/lib/python2.4/site-packages/httpsproxy_urllib2-1.0-py2.4.egg/urllib2.py”, line 393, in open
response = meth(req, response)
File “build/bdist.linux-i686/egg/ClientCookie/_urllib2_support.py”, line 625, in http_response
File “/usr/lib/python2.4/site-packages/httpsproxy_urllib2-1.0-py2.4.egg/urllib2.py”, line 431, in error
return self._call_chain(*args)
File “/usr/lib/python2.4/site-packages/httpsproxy_urllib2-1.0-py2.4.egg/urllib2.py”, line 366, in _call_chain
result = func(*args)
File “/usr/lib/python2.4/site-packages/httpsproxy_urllib2-1.0-py2.4.egg/urllib2.py”, line 512, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
O Site do Consultanumero esta fora do AR consultanumero.abr.net.br
Provável mudança no site ou atualizações internas deles.
o URLOPEN tenta abrir o site sem sucesso e lhe reporta este erro
[]’s
Tem saída ?
A única Saída é reescrever todo o código …
Quando tiver com mais tempo poderei olhar isso, mas meus dias estão corridos.
[]’s
Eng Eder de Souza
Atualizado!!
source para consultanumero.abr.net.br
Qual o temp oem segundos que leva para descobrir a operadora ?
Meus testes mostram um tempo médio de 4-5 segundos.
eu uso em conjunto com Fast-AGI demorando 2 Mili-Segundos
Eu estava falando sobre o seu python script. O outro eu não podia testar porque o endereço mudou.
não consigo me me comunicar com a operadora.
não consigo me me comunicar com a operadora A OI retém meu nº de telefone desde dia 31.08. 2010 as 18h 56 minutos. tenho 72 anos e preciso do nº deste telefone que utilizo a cerca de 12 anos. Pelo Regulamento Geral de Portabilidade , anexo a Resolução nº 460 de 19.03 2007, está incorrendo no art.13 ,I -assegurar ao usuário o direito à Portabilidade de forma não discriminatória. v- dar ampla divulgação das condições de oferta da Portabilidade.IX-garantir a continuidade e qualidade do serviço de telecomunicação durante o Processo de Portabilidade, considerando o disposto neste regulamento.Agradeço ajuda possivel.
Este script não esta funcionando mais. O serviço não está mais disponível no endereço codificado.
Tenho usuário e senha para esta consulta Funcionar um dia verei a possibilidade de compartilhar ou montar um gateway para o retorno global …
Eder, tem jeito de modificar este pythno script para usar como crawler verificando números em seqüências e dump isso num logfile para treinar um banco de dados proprio? Serra qeu vc pode modifica-lo? Alguma coisa por exemplo usando cron para executar o script…algo assim.
Tem sim, mas o grande problema de se fazer isso é que a origem vai descolfiar do alto volume de consultas, seu IP pode ser bloqueado por Firewall ou a origem pode mudar todo o sistema colocando verificação por Capctha e até mesmo podendo cobrar pela consulta como é o caso deste link agora só quem paga por este serviço pode consultar você recebe um login e senha para fazer conexao e poder consultar a operadora 😦
Vs ta falando do serviço aqui http://consultanumero.abr.net.br ou do serviço no URL codificado ( melhor não postar ele no blog ). De qualquer jeito to procurando alguem que fornece DBO com um preço razoável. Vc tem informação sobre esta empresa ( do url codificado) quais são os preços deles?
URL codificada entre em contato com eles mas nao espere por preços razoáveis !!
Caro Eng. Eder,
Estive a ler algo sobre o AGI, e como estou desenvolvendo o meu Asterisk para que este possa comunicar com um servidor de domótica. Acha que o posso conseguir através do AGI? Se sim, como?
Obrigado
Olá,
Respondendo a sua questão você conseguira fazer muitas coisas com AGI, para domótica você conseguira uma interface bem simples via controles por USB ou porta Paralela, se utilizar algum módulo tts podera fazer controles por voz a distancia, sem falar que nativamente podera controlar (ligar, desligar, etc) via DTMF…
Na faculdade eu desenvolvi uma central telefonica com controle via DTMF que funcionava em qualquer modem instalado e controlava equipamentos via teclas DTMF, o trabalho foi brutal hoje com o Asterisk o seu trabalho sera bem otimizado você poderá se concentrar totalmente em um AGI escolha sua linguagem de programação na qual você mais gosta e escreva seu AGI!!
[]’s
Eng Eder de Souza
Eng. Eder,
Desde já agradeço a sua rapidez na resposta. No entanto tenho dúvidas na utilização do AGI. Como posso configurar qualquer coisa através dele? É possivel da um exemplo de como poderei fazer um tipo de configuração?
Peço desculpa, mas ainda não entendi bem isto do AGI.
Obrigado
Entenda que os programas feitos em AGI são uma interface poderosa para se integrar ao Asterisk…
um simples AGI escrito em perl tem esta estrutura
Arquivo teste.pl
#!/usr/bin/perl -w
use Asterisk::AGI;
my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
$AGI->exec(“NoOp”,”Teste Eng Eder”);
##FIMM
em seu extensions.conf vc chama o agi simplesmente adicionando uma linha parecida com esta:
exten => 1234,1,agi,teste.pl
quando discar para o número 1234 este AGI escrito em perl apenas irá imprimir no console do asterisk a frase “Teste Eng Eder” !!
Então imagine as possibilidades você podera integrar linguagem de programação neste exemplo escrito em perl mas poderá ser em C, python, pascal, ruby, etc, etc, etc…
Então você terá em um source em qualquer linguagem de programação interligado com todas as funções do Asterisk é isto que um AGI faz, você podera interagir com banco de dados, hardware, interfaces USB, portas paralelas e manter as funcionalidades de um PABX-IP!
Já que vc está trabalhando com domótica eu disponibilizei aqui https://ederwander.wordpress.com/2009/08/20/teste/ um código que interage com movimentos da webcam para disparar chamadas via Asterisk, este eu fiz por meios de sockets puro sem necessitar de AGI, as possibilidades são infinitas !!
[]’s
Eng Eder de Souza
Olá a todos,
Eu alterei o meu código assim:
exten => xxxx,1,Answer ;
exten => xxxx,n,Set(DB(test/count)=1234)
exten => xxxx,n,Set(COUNT=${DB(test/count)})
exten => xxxx,n,Authenticate(${COUNT}) ;
A questão é a seguinte como carreguei a variável test/count=1234. Como posso agora encontra-la no Mysql de modo a altera-la via Mysql?
Alguém pode dar uma ajuda?
já testou a APP mysql dentro do seu extensions.conf com ele vc consegue fazer updates existem vários exemplos aqui …
http://www.voip-info.org/wiki/view/Asterisk+cmd+MYSQL
Eng. Eder
Não, não testei…O que é o APP mysql, já estive a ver o link do Voip-info, mas não fquei esclarecido.
Obrigado
Permite integrar consultas, inserções, updates, via banco de dados mysql dentro de seu dial plan, os exemplos do voip-info são bem claros e demonstram bem como utiliza-lo !!!
[]’s
Eng Eder de Souza
Eng. Eder,
Antes de mais, agradeço a sua ajuda.
Necessito que o Asterisk, comunique com um Web Service, ou seja, tenho um Menu opcional composto por IVR´S, que quando escolho uma qualquer opção esta acção efectue uma pergunta ao Web Service e que o Web service a responda.
Isto é possível? Se sim, como?
Obrigado
Olá
É possível sim, você vai precisar da resposta entre a comunicação do seu web server via porta 80 !
Você poderá fazer um AGI que faça requisições pela porta 80 e que envie algum método de consulta como o GET por exemplo você passa os parâmetros necessários para sua consulta web e pega o retorno, após isso você toma uma ação correspondente ao retorno em seu IVR !!
É bem simples de se fazer !
[]’s
Eng Eder de Souza
Eng. Eder,
Não quero de modo algum abusar da sua boa vontade e ajuda, mas será possível postar algum exemplo de como poderei fazer isto? Já efectuei algumas pesquisas sobre AGI e Web service, mas ainda não consegui perceber de que forma poderei obter o resultado que necessito.
Obrigado
Eng. Eder,
Já percebi que posso aceder ao Web Service através do comando AGI exten => _X.,1,AGI(agi://192.168.2.1:1048/TestAGI|${EXTEN}|{VAR2}. No meu Web service tenho uma “função”, que necessito que conforme o comando inserido por mim esta função chamada “Luzes” altere de 1 para 0 ou vice-versa. Pode dar uma ajuda de como o poderei fazer?
Obrigado
Eder tem script para o novo captcha da ABR?rs
Em que pé está esta questão das consultas a portabilidade. Parece que o Capcha, mais complexo, não deixa mais consultar. Alguém sabe de alguma alternativa barata?
Eu acho que esta ´segurada´ das operadoras tem por objetivo induzir o usuário ao erro. Tudo bem que dá para consultar individualmente, mas temos que provar na justiça que usar o Asterisk é de interesse público, tanto quanto conectar por um aparelho móvel. Vamos ver se nos organizamos para forçar a liberação do BDO.
Ola. Encontrei na web um site que disponibiliza a consulta com um captcha mais simples. Isso seria o suficiente para fazer o script funcionar?
Olá Fernando,
Dependendo da forma como o captcha esta se apresentando pode ser possível sim!
Envie o Link para que eu possa dar uma olhada …
Com a análise posso tentar escrever algo para o retorno do captcha e enviar as requisições para posteriormente pegar as operadoras !
Eng Eder de Souza
E ai estamos sem fazer consulta, ou alguem tem uma luz no fundo do tunnel?
Eder, bom dia
Eu tentei implementar um script com base neste teu, mas estou com alguns problemas, não sei se poderias me ajudar.
A idéia do script é utilizar a consulta através do serviço Telein.ConsultaNumero
Eu tenho uma tabela no MySQL com o código das operadoras (baseado no resultado da consulta do Telein.ConsultaNumero) e um campo em que vai conter o nome do Trunk que precisa ser utilizado.
Toda a ligação que for feita para celular, automaticamente deverá passar por este script, para verificar qual a operadora, e com isto, direcionar a realização da chamada para o trunk correto.
Olhando no log do Asterisk aparece isto:
[2012-05-18 02:06:17] VERBOSE[7583] res_agi.c: — AGI Script Executing Application: (NoOp) Options: (Vou mandar a URL)
[2012-05-18 02:06:17] VERBOSE[7583] res_agi.c: AGI Tx >> 200 result=0
[2012-05-18 02:06:22] VERBOSE[7583] res_agi.c: AGI Rx << Abrir conexao MySQLSelecionar databaseSELECT * FROM operadora where OperadoraID=999Executou a query999Chave invalida
[2012-05-18 02:06:22] VERBOSE[7583] res_agi.c: AGI Tx >> 510 Invalid or unknown command
[2012-05-18 02:06:22] ERROR[7583] utils.c: write() returned error: Broken pipe
[2012-05-18 02:06:22] VERBOSE[7583] res_agi.c: — AGI Script verificaoperadora.pl completed, returning 0
Sempre dá a mensagem 510 Invalid or unknown command e também aparece utils.c: write() returned error: Broken pipe
Não conheço nada de Perl e está complicado de identificar o que poderia estar errado.
Se puderes dar uma ajuda, agradeço antecipadamente.
Abraço.
Opa Eng Eder de Souza,
Muito boas suas contribuições para o mundo Asterisk.
Gostaria de saber se esse script da portabilidade ainda roda?
[ ]’s
Oi Leandro este em específico não !
Tem outro que funciona, olha ai:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Operadora.py
hosted with ❤ by GitHub
Eder como funciona ou melhor qual a saída do resultado para utilizar no dialplan. Fiz o teste e não retornou nada. Pode me ajudar?
Coloque o script “operadora.py” https://gist.github.com/3306926 na pasta “agi-bin”
Em seu extensions.conf coloque assim para chamar o agi e pegar o retorno dele no asterisk :
exten=>_0.,1,Answer()
exten=>_0.,n,AGI(operadora.py,${EXTEN:1})
exten=>_0.,n,NoOP(Operadora = ${Operadora})
exten=>_0.,n,Hangup()
Eder utilizei e não deu resultado, será que fiz algo erro ou o script não esta tendo retorno do site http://magnussolution.com?
Segue log console asterisk:
— Executing [007199703610@teste:1] Answer(“SIP/200-0000000b”, “”) in new stack
— Executing [007199703610@teste:2] AGI(“SIP/200-0000000b”, “operadora.py,7199703610”) in new stack
— Launched AGI Script /var/lib/asterisk/agi-bin/operadora.py
— AGI Script operadora.py completed, returning 0
— Executing [007199703610@teste:3] NoOp(“SIP/200-0000000b”, “OP = “) in new stack
O Script esta funcionando perfeitamente o retorno foi o código 55399 este número é da vivo ?
se sim inclua este código no dicionário do script para o retorno correto !
No site sim, mas via script o NoOp sai “em branco” conforme log:
— Executing [007199703610@teste:3] NoOp(“SIP/200-0000000b”, “OP = “) in new stack
Cara foi problema no linux, após boot funcionou perfeito. Você é o “Cara”. Valeu abrigado pela atenção.
Outra pergunta essa consulta pela magnussolution tem limite por hora/dia ou por região?
Legal bom saber que funcionou, Não tem limites, mas é aconselhado você fazer um cache das consultas para economizar banda e consultas 🙂
Boa noite Eng Eder, verifiquei seu código e achei interessante, estou implementando algo no meu Elastix sobre isto e estou com dúvidas pois quando você publicou foi em 2010 e acho que muitos discutiram e hoje o código é o mesmo ou tem alguma alteração a ser feita para que eu venha a testar se está rodando normal. Preciso disto inicialmente para testes caseiros para poucas consultas, pra depois pensar em armazenar em cache… Se poder postar a solução completa novamente com o código final ficarei grato. Abraços…
Oi Pablo
O novo código é este https://gist.github.com/ederwander/3306926
Eder
O Magnus fechou a porta, não tá mais permitindo consulta grátis, dava pra fazer alguma coisa com este site?
http://www.qualoperadora.net/
cara voce conseguiu algo a respeito estou procurando algo paracido grato
My brother suggested I would possibly like this web site. He was totally right.
This post actually made my day. You cann’t imagine just how much time I had spent for this information! Thanks!
Jardel;
Conseguiu alguma coisa com o site sugerido ?
Santhiago
Não sei programar cara, esperava que o Éder fizesse algo, mas parece que ele abandonou o projeto.
Prezados,
Se tiver algum bom programador que possa desenvolver uma soluçao em Python ou PHP para a consulta dos dados portados eu consigo a base atualizada diariamente e disponibilizo no meu servidor para a comunidade em geral, contudo preciso de integarir com o programador para que possamos fazer algo administrativo, ou seja como vou disponibilizar isso preciso de algo pra cada pessoa realizar seu cadastro e receber um login e senha para integrar com cada asterisk… Se alguem se disponibilizar eu tenho a Database diariamente.
Olá pessoal,
Eu ainda não tive tempo de olhar o site enviado pelo Jardel, a principio é possível pegar informação de qualquer site, só é preciso saber os campos de submit do form, prometo olhar está semana e dou um retorno aqui.
Sobre a solução do Pablo é bastante interessante, não posso me comprometer a programar o lado administrativo, infelizmente não tenho tempo, estou envolvido e liderando muitos projetos. Ainda sobre o desenvolvimento administrativo qualquer estagiário de TI com o mínimo conhecimento em programação consegue fazer, ou seja não será difícil encontrar alguém …
Pessoal eu tive um tempinho hoje e olhei com carinho o site que o Jardel passou, fiz Crawler para o site, aqui o novo script AGI https://gist.github.com/ederwander/9512693, vejam o Update deste Post !
Blz Éder, agora vamos ver se eles bloqueiam o ip se der muitas consultas seguidas !
Éder, mais uma opção !
http://www.portabilidadecelular.com/
Olá Eder!
Gostaria de saber tem interesse em fazer uma consultoria projeto simples?
Deixei meu e-mail para contato.
Grato.
obrigado pelo post Eder! Usei parte do seu código do git, mas a API magnussolution.com/portabilidade.php nao ta mais funcionando, minha alterantiva foi o site http://api-portabilidade.com.br/