Enviando mensagens para celulares TIM
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.
Descrição
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
# 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?
[]'s