Através do site da TIM é possível enviar as mensagens e utilizaremos o sistema deles para o envio. Algumas proteções são a validação de cookies e imagem GIF que aparece forçando o usuário a abrir a página, ler o GIF e digitar o que está no GIF. Irei mostrar um script que fará o trabalho de analisar a informação contida no GIF e enviar mensagens SMS para celulares TIM.
##
## Biblioteca pra sistema de SMS da TIM Brasil - www.timbrasil.com.br
## por Vinicius Tavares Petrucci - vinicius@telme.com.br
## v0.3
import cPickle as pickle
import urllib, urllib2, os
def salvaMapa(mapa):
pickle.dump(mapa, file('mapa.save', 'wb'))
def abreMapa():
return pickle.load(file('mapa.save', 'rb'))
def zeraMapa():
mapa = {}
salvaMapa(mapa)
def geraMat(nomeArq):
# gerar arquivo de bytes
#
fgif = os.popen('giftext -r %s' % nomeArq)
# gerar matriz
#
mat = []
linha = []
# Imagem 100(col) x 40(lin)
for i in range(40):
for j in range(100):
r = fgif.read(1)
# azul escuro ?
if r == '\x02':
linha.append(1)
else:
linha.append(0)
mat.append(linha)
linha = []
return mat
def delimitar(mat):
# delimitar
#
# lista com pares (ini, fim) de marcacoes delimitadas
# das colunas das informacoes. 2x qt de informacoes
listaDelim = []
dentro = False
for j in range(100):
val = 0
for i in range(40):
val += mat[i][j] * (2**i)
if val > 0 and not dentro:
dentro = True
listaDelim.append(j-1)
elif val == 0 and dentro:
dentro = False
listaDelim.append(j+1)
return listaDelim
def nivelar(mat, listaDelim):
# nivelar o topo de cada informacao
#
# lista com inicio de linha de cada informacao
listaIniLinha = []
for d in range(0, len(listaDelim), 2):
sair = False
# varrer linha a linha encontrar topo
for i in range(40):
for j in range(listaDelim[d], listaDelim[d+1]):
if mat[i][j] == 1:
listaIniLinha.append(i)
sair = True
break
if sair:
break
return listaIniLinha
def geraVal(mat, listaDelim, listaIniLinha):
# calcular numero pra cada coluna
#
# lista com valor de cada coluna
listaVal = []
# d eh indice da listaDelim
# atencao: len(listaDelim) == 2 * len(listaIniLinha)
# entao, d_ini = d / 2
for d in range(0, len(listaDelim), 2):
# multiplicador por coluna
coluna = 1
# calcular valor pra cada trecho delimitado
for j in range(listaDelim[d], listaDelim[d+1]):
# valor parcial
val = 0
# multiplicador por linha
linha = 0
# indice listaIniLinha
d_ini = d / 2
for i in range(listaIniLinha[d_ini], 40):
val += mat[i][j] * (2**linha) * coluna
#print "i=%d, j=%d, val=%d" % (i, j, val)
linha += 1
coluna += 1
listaVal.append(val)
return listaVal
def separarInfo(listaVal):
# separar informacoes entre valores em 0
#
# lista com informacoes
listaInfo = []
ehInfo = False
i = 0
while i < len(listaVal):
info = listaVal[i]
if info > 0:
ehInfo = True
elif info == 0:
ehInfo = False
val = 0
while ehInfo:
val += info
i += 1
info = listaVal[i]
if info == 0 or i >= len(listaVal)-1:
break
if val > 0:
listaInfo.append(val)
i += 1
return listaInfo
def geraInfo(nomeArq):
mat = geraMat(nomeArq)
listaDelim = delimitar(mat)
listaIniLinha = nivelar(mat, listaDelim)
listaVal = geraVal(mat, listaDelim, listaIniLinha)
return separarInfo(listaVal)
def info2string(mapa, listaInfo):
string = ""
for info in listaInfo:
if mapa.has_key(info):
string += mapa[info]
return string
def getDadoCookies():
# pega cookies
url1 = urllib.urlopen('http://200.179.42.65/weblogic/services/smsmt.jsp?site=consume&service=smsmt')
try:
cook = url1.info()['set-cookie']
cook = cook[:cook.find(';')]
cookies = cook.split(',')
except:
pass
# pega dados
dado = url1.read()
url1.close()
return dado, cookies
def enviaSMS(dddd, teld, msg, dddc="", telc="", nome=""):
dado, cookies = getDadoCookies()
nomeArq = getServerGif(dado, cookies)
mapa = abreMapa()
listaInfo = geraInfo(nomeArq)
#print 'listaInfo = ', listaInfo
simbolo = info2string(mapa, listaInfo)
#print simbolo
req = urllib2.Request('http://200.179.42.65/weblogic/services/smsmtresult.jsp')
cookie = ""
for co in cookies:
cookie += co + '; '
req.add_header('Cookie', '%s' % (cookie) )
params = urllib.urlencode({'site':'consume',\
'service':'smsmt',\
'prefix':dddd,\
'destNumber':teld,\
'name':nome,\
'myNumber':dddc+telc,\
'message':msg,\
'counter':152-len(msg)-len(nome)-len(dddc)-len(telc),\
'chars':simbolo})
f = urllib2.urlopen(req, params)
resp = f.read()
if resp.find('sucesso') != -1:
os.unlink(nomeArq)
return True
else:
if simbolo:
#os.rename(nomeArq, '/tmp/'+simbolo+'.gif')
os.rename(nomeArq, simbolo+'.gif')
return False
def getServerGif(dado, cookies):
# path do gif
tmp = dado[dado.find('src="servlet')+5:]
path = tmp[tmp.find('servlet'):tmp.find('"')]
path = 'http://200.179.42.65/weblogic/services/' + path
# baixa gif
req = urllib2.Request(path)
cookie = ""
for co in cookies:
cookie += co + '; '
req.add_header('Cookie', '%s' % (cookie) )
f = urllib2.urlopen(req)
resp = f.read()
# salva gif
#nome = '/tmp/'+path[-6:]+'.gif'
nome = path[-6:]+'.gif'
fimg = open(nome, 'wb')
fimg.write(resp)
fimg.close()
return nome
[1] Comentário enviado por fabio em 13/07/2004 - 16:36h
Maneiríssimo esse script! Bom, uma pequena contribuição: para executar esse script é necessário instalar o seguinte pacote no seu Linux:
# apt-get install libungif-bin
É ele quem possui o comando giftext. Bom, tô aqui quebrando a cabeça pra tentar descobrir o mecanismo desse giftext, alguém tem um exemplo de como converter uma GIF em TXT na unha?
[2] Comentário enviado por viniciuspetrucci em 13/07/2004 - 18:44h
o giftext é um programa utilitário que vem com a biblioteca libungif, para trabalhar com imagens gif.
na verdade algumas imagens gifs vem compactadas. seria interessante fazer um script em Python para ler diretamente esta imagem e gerar a matriz de pixels... tentarei ver se consigo, qq coisa mande o que vc conseguir.
[3] Comentário enviado por fabio em 13/07/2004 - 18:51h
Pois é. No seu conjunto de arquivos há um arquivo chamado mapa.save, como ele foi gerado? Já estava pronto né? O interessante seria um script que recebesse uma imagem como argumento e imprimisse o texto dela no STDOUT. Vou tentar algo por aqui também :P
[4] Comentário enviado por viniciuspetrucci em 13/07/2004 - 22:29h
Primeira fase é o treinamento das imagens. É usado um programa chamado 'giftext', que vem com a biblioteca libungif no Linux (podendo ser compilado o fonte em windows com Cygwin). Este programa
lê um arquivo gif e gera como saída um fluxo de bytes, que são os pixels. Mais especificamente: a representação hexadecimal da sua cor na tabela de cores, que pode ser visualizada com o próprio programa (vide giftext --help).
Com isso, cria-se uma matriz binária com marcação 1 onde aparece a cor dos caracteres e 0 caso contrário. Próxima tarefa é delimitar onde começa e termina cada caracter, isto é, onde há uma separação de coluna toda preenchida com zeros. Com isso tenho uma delimitação na horizontal dos
caracteres.
Já que os caractereres aparecem em posições aleatórias no sentido vertical também, é necessário nivelar cada um em um limite superior comum, isto é, onde começa a primeira linha com valores
diferentes de zero em cada dilimitação horizontal de cada caracter.
Agora que temos a delimitação horizontal e vertical, podemos gerar um valor numérico para cada coluna onde inicia e termina a delimitação de um caracter, somamos os valores de todas as colunas e por fim temos um número único para cada caracter!
Próximo passo é criar um mapa (um dicionário em Python) que é um array associativo, amarrando um número a sua representação de caracter.
Estou pensando em fazer ou um script em Python ou aproveitar o giftext e fazer em C um programa que será o OCR... o resto (o envio da mensagem) seria feito por outro script, isto é, seprar a parte de reconhecimento da parte de envio de mensagem.
[5] Comentário enviado por musskopf em 29/07/2004 - 18:10h
Dae pessoal, ontem resolvi ver esse negocio de SMS pelo site da Tim e consegui colocar pra funcionar. Na verdade utilizei 2 pacotes o ImageMagick e o JOCR, ambos OpenSource e muito faceis. Se alguem quiser alguma dica ou se existir algum local para postar um exemplo do script por aqui... sou novo e não parei para ver os recusos deste site.
[7] Comentário enviado por falconi em 12/08/2004 - 21:12h
Comigo funcionou, vc soh esqueceu de falar como eh que usa, tive que "adivinhar" os parametros. Eh preciso passar o DDD, TELEFONE e "TEXTO" (entre aspas mesmo). Ex:
python tim2004.py 11 12345678 "Envio o texto que eu quiser aqui"
Bingo! Pegue o CEL e veja o torpedo chegando ...
Detalhe, muito bem bolado o script, parabens Vinicius.
[11] Comentário enviado por pquadros em 24/02/2005 - 09:31h
olá vinicius,
to tentando usar seu script para envio de mensagens pra celulares tim e num to conseguindo... to fazendo assim:
python tim2004.py 31 12345678 "Envio o texto que eu quiser aqui"
ele demora 1 tempo q retorna:
Traceback (most recent call last):
File "tim2004.py", line 13, in ?
sucesso = timLib.enviaSMS(dddd, teld, msg, '', '', '')
File "/home/pablo/tmp/tim2/timLib.py", line 183, in enviaSMS
nomeArq = getServerGif(dado, cookies)
File "/home/pablo/tmp/tim2/timLib.py", line 245, in getServerGif
fimg = open(nome, 'wb')
IOError: [Errno 2] No such file or directory: 'vices/.gif'
sabe como poderia resolver?
desde ja agradeço
Pablo Quadros
[12] Comentário enviado por frost em 11/04/2005 - 15:59h
cara o meu tah dando esse erro ao tentar enviar a msg
$ python tim2004.py 11 12345678 "teste"
Traceback (most recent call last):
File "tim2004.py", line 13, in ?
sucesso = timLib.enviaSMS(dddd, teld, msg, '', '', '')
File "/home/user/Desktop/Downloads/timLib.py", line 182, in enviaSMS
dado, cookies = getDadoCookies()
File "/home/user/Desktop/Downloads/timLib.py", line 178, in getDadoCookies
return dado, cookies
UnboundLocalError: local variable 'cookies' referenced before assignment
[15] Comentário enviado por edmaltros em 17/04/2006 - 16:09h
Fiz o download do Arquivo ZIP, Qual é o comando pra executar o script.... Sou iniciante... Ainda não sei muita coisa sobre o sist. Operacional...
Vlw...
[16] Comentário enviado por gregorye em 16/08/2006 - 22:13h
router:/home/sms# python tim2004.py 49 99158105 "recebeu esta msg ?"
Traceback (most recent call last):
File "tim2004.py", line 13, in ?
sucesso = timLib.enviaSMS(dddd, teld, msg, '', '', '')
File "/home/sms/timLib.py", line 182, in enviaSMS
dado, cookies = getDadoCookies()
File "/home/sms/timLib.py", line 178, in getDadoCookies
return dado, cookies
UnboundLocalError: local variable 'cookies' referenced before assignment
router:/home/sms#
[21] Comentário enviado por winckler em 31/10/2007 - 10:39h
Bem que o script que você criou podia ser mais generico, tipo, transformar ele em 2, onte o primeiro onde agente adapta os dados p/ qq operadora, chama o segundo que fica a cargo da análise da imagem.
Bom, tenho outra sujestão. Seguinte, provavelmente voc~es conheçam o programa em java jSMS, ele faz o envio de sms p/ qq operadora nacional, e no site vc consegue o fonte, ou seja, se alguam conhcece um pouco de java consegue adapta-lo, ou por exemplo, criar um shell que chame o jsms para ele então enviar a mensagem, já que o mesmo já roda em linux, só que em modo grafico.
[23] Comentário enviado por 789456123mvb em 27/01/2008 - 01:09h
Oi, como vai tudo bem estou adorando sua mudança de vida vc agora é pessoa que eu conhecia e todos gostavam está quase liberto para ser feliz esse é o cara que todos gostam, sem medo de ser feliz livre sem depender de n inguem. V aleu eu sei que vai ficar melhor seus amigos estão todos tocendo por vc. beijooooooooooooooooooooooo!!!!