Enviando mensagens para celulares TIM

Publicado por Vinicius Tavares Petrucci 13/07/2004

[ Hits: 28.552 ]

Download tim2004.zip




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.

  



Esconder código-fonte

##
## 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

Scripts recomendados

Preço do Dólar, Bitcoin e Euro em Python

hscan - Portscan em Pyhton

Git clone simplificado

Quebrador de links

2182611819


  

Comentários
[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?

[]'s

[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.

[]'s,
Vinicius

[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

[]'s

[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.

Abracos,
Vinicius

[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.

[6] Comentário enviado por viniciuspetrucci em 09/08/2004 - 22:08h

Estive fora estes dias e gostaria de saber se alguem ainda está tendo duvidas ou problemas em rodar o script e se posso ajudar.

sim.... o artigo está vago e falta melhorar. estive sem tempo.

Vinicius

[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.

[ ] 's
Falconi

[8] Comentário enviado por mauoliva em 20/08/2004 - 15:10h

Vinicius,

Sempre que execute o script aparece a seguinte mensagem :
sh: line 1: giftext: command not found

O que esta errado (mas eu recebo a mensagem " as vezes, nem sempre ")

[9] Comentário enviado por msmaximo em 27/09/2004 - 10:58h

Olá Vinicius,
Parabéns pelo script, esta sendo muito útil para mim.
Um abraço.

[10] Comentário enviado por re_linda@ig.com em 02/02/2005 - 07:39h

oi kadu sou eu Renata! stou com saudades!

[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


vc sabe o q eh e como resolvo?...obrigado

[13] Comentário enviado por Renan_ em 05/10/2005 - 14:55h

Esse serviço ainda funciona gratuitamente? Abraços!

[14] Comentário enviado por insabralde em 17/04/2006 - 09:14h

Qual é o comando pra executar o script.... Sou iniciante e não to acostumado ainda com essa linguagem.

[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#



oque pode ser ?

por favor me ajudem.

contato@enos.com.br

[17] Comentário enviado por linux.dcdinfo em 31/10/2006 - 11:32h

muito bom gostei.

[18] Comentário enviado por crodrigo22 em 09/03/2007 - 02:06h

Olá meu Fiorefox não mostra imagens de gif deste meu site..

www.crodrigo22.brasilflog.com.br

Abaixo da foto tem umas gifs que o explorer mostra mais o firefox não e ai será que alguem pode me ajudar a esclarecer este misterios..

[19] Comentário enviado por mbm em 21/04/2007 - 18:11h

to com saldades! mas q pena q ñ quero voltar atraz

[20] Comentário enviado por prilinda pinheir em 23/09/2007 - 12:12h

oieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000
0000000*****0000000*****0
00000*********000*********0
0000***********0***********0
0000***********************0
0000***********************0
00000*********EU**********0
000000*******************0
00000000***************0
0000000000***********0
0000000000000*****0
00000000000000000000000
0000000*****0000000*****0
00000*********000*********0
0000***********0***********0
0000***********************0
0000***********************0
00000*********ADORO*******0
000000*******************0
00000000***************0
0000000000***********0
0000000000000*****0
00000000000000000000000
0000000*****0000000*****0
00000*********000*********0
0000***********0***********0
0000***********************0
0000***********************0
00000*********VOCE********0
000000*******************0
00000000***************0
0000000000***********0
0000000000000*****0
00000000000000000
BJOSSS

[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.

tá ai a idéia para os mais experts.

[22] Comentário enviado por magalea em 05/01/2008 - 22:57h

podes entrar ao internet agora magali

[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!!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts