Arquivos
Portabilidade + DBO + Descobrir Operadoras
Já faz um bom tempo que tento rotear chamadas de acordo com a operadora na qual o número discado pertence, as rotas ficaram uma bagunça com a chegada da portabilidade, como não tenho dinheiro para pagar um DBO tentei improvisar.
O Script feito em Python ainda falha algumas vezes, mas já é um começo o correto seria treinar o banco de dados do gocr para capturar o captcha com mais precisão mas nao estou tendo tempo de brincar com isso…
# -*- coding: iso-8859-1 -*-
#Eder de Souza 23/11/2009
import re
import ClientCookie
import commands
import sys
import os
import re
inc = 0
MaxTentativas = 15
tel=sys.argv[1]
while inc < MaxTentativas:
inc = inc + 1
cj = ClientCookie.MozillaCookieJar()
opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cj))
ClientCookie.install_opener(opener)
r = ClientCookie.urlopen(“http://consultanumero.abr.net.br:8080/consultanumero/jCaptcha.do?metodo=carregar“)
fp = open(‘Captcha.jpg’,'w’)
fp.write(r.read())
fp.close()
cj.save(“infer”, ignore_discard=True, ignore_expires=True)
commands.getoutput(‘convert Captcha.jpg Captcha.png’)
commands.getoutput(‘pngtopnm Captcha.png > Captcha.pnm’)
commands.getoutput(‘ppmchange -remainder black -closeness 20 rgbi:.91/.8/.58 white rgbi:.8/.8/.91 white rgbi:.69/.91/.91 white Captcha.pnm > Captcha_End.pnm’)
captcha = commands.getoutput(‘gocr -C a-zA-Z0-9 -m 2 -a 90 -d 2 Captcha_End.pnm’)
rmspace = captcha.replace(‘ ‘, ”)
rmreturn = rmspace.replace(‘\n’, ”)
rmunderline = rmreturn.replace(‘_’,”)
res = re.search(‘([a-zA-Z0-9]+)’, rmunderline)
result = res.group(1)
cj = ClientCookie.MozillaCookieJar()
cj.load(“infer”, ignore_discard=True, ignore_expires=True)
opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cj))
ClientCookie.install_opener(opener)
pagina = opener.open(‘http://consultanumero.abr.net.br:8080/consultanumero/consultarTnSemLogin.do?tn=’+tel+’&captcha=’+result+’&metodo=consultar’).read()
if “Nome da prestadora” in pagina:
pagina = pagina.replace(‘<br>’,”)
find = re.search(‘Nome da prestadora: (.*)’, pagina)
operadora = find.group(1)
print operadora
sys.exit()
segue uma tela dele funcionando:
Até mais
Eder
Monitor Realtime + Asterisk
Bom só quem brincou com AMI no Asterisk sabe como é complicado, Eventos jogados na tela nada parece ter sentido uma avalanche de informações sem padrões definidos, construir aplicações genéricas se torna uma missão.
Eu iniciei a pouco mais de dois anos um projeto monitor em Realtime a principio era para monitoramento só para verificar quem estava fazendo ou recebendo ligações, pensei “Moleza Delphi + Socket + AMI”.
Dores e mais dores de cabeça na época tinha um link R2 com uma placa da digium rodando com o Unicall para quem tinha placa E1 Digium era a única saida de conversar com a sinalização R2. Então olhando o retorno do AMI iniciei um esboço de como pegar o retorno no buffer do meu Socket em Delphi 6.0 e montar algo bonitinho para usuários ficarem vendo tudo que acontece de atividade no canal Unicall do Asterisk !!
Então vamos ver o que um core show channels verbose nos retorna !!
Channel Context Extension Prio State Application Data CallerID Duration Accountcode BridgedTo
UniCall/16-1 default 1579 1 Up Bridged Call SIP/6007-00f839c0 80151333623971 SIP/6007-00f839c0
SIP/6007-00f839c0 default 80151333623971 22 Up Dial Unicall/g1/0151333623971 6007 00:02:40 UniCall/16-1
UniCall/14-1 default 1599 1 Up Bridged Call SIP/6004-00d2fe00 80151938622970 SIP/6004-00d2fe00
SIP/6004-00d2fe00 default 80151938622970 22 Up Dial Unicall/g1/0151938622970 6004 00:03:52 UniCall/14-1
UniCall/11-1 default 1599 1 Up Bridged Call SIP/6006-00ea6650 80151335689403 SIP/6006-00ea6650
SIP/6006-00ea6650 default 80151335689403 22 Up Dial Unicall/g1/0151335689403 6006 00:05:18 UniCall/11-1
SIP/6008-00e46a10 default 1 Up Bridged Call UniCall/12-1 1938323241 UniCall/12-1
UniCall/12-1 default 91000 3 Up Queue atendimento|r|||90 1938323241 00:06:10 SIP/6008-00e46a10
UniCall/10-1 default 1599 1 Up Bridged Call SIP/6002-00f034c0 881895124 SIP/6002-00f034c0
SIP/6002-00f034c0 default 881895124 22 Up Dial Unicall/g1/81895124 6002 00:06:37 UniCall/10-1
UniCall/13-1 default 1599 1 Up Bridged Call SIP/6005-00f15800 808007771007 SIP/6005-00f15800
SIP/6005-00f15800 default 808007771007 22 Up Dial Unicall/g1/08007771007 6005 00:09:02 UniCall/13-1
12 active channels
6 active calls
Bagunça !!!!
Então a idéia seria filtrar essa bagunça e procurar por palavras chaves Criando uma funçao Busca para isso !!
Function BuscaTexto(Text,Busca : string) : string;
var n : integer;
begin
for n := 1 to length(Text) do
begin
if Copy(Text,n,length(Busca)) = Busca then
begin
Result := ‘ok’;
RetornoBuscaPos:=n;
end;
end;
end;
Agora eu poderia pegar dentro do Buffer do socket qualquer palavra chave como a “Unicall/g1″ e depois caminhar com um ponteiro para recortar isso em qualquer lugar e depois só teria que colocar o valor no GRID.
Entao como ficaria:
if BuscaTexto(Msg,’Unicall/g1/’) = ‘ok’ then
begin
if Copy(Msg,86,RetornoBuscaPos-79) = ‘Unicall’ then
//pega o ramal que originou a chamada
MainForm.StringGrid1.Cells[0,contador]:= Copy(Msg,5,RetornoBuscaPos-82);
//pega o numero discado para fora destino ‘ ‘Unicall/g1/’
MainForm.StringGrid1.Cells[1,contador]:= Copy(Msg,97,RetornoBuscaPos-71);
Extremamente Trabalhoso Marinheiro de Primeira viagem um colega de cuiaba o Juniou tbm embarcou nessa aventura ele mal dormia, por fim segue algumas telas depois de todo o trabalho …
Tela com opção de verificar chamadas recebidas
Assim tudo em AMI eu teria o retorno de 5 em 5 segundos do comando “core show channels verbose” na qual montaria a tela de ligações em um intervalo de 5 em 5 segundos….
Até a Proxima
Eng Eder de Souza
