Pular para o conteúdo

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.
Vinicius Tavares Petrucci viniciuspetrucci
Hits: 28.978 Categoria: Python Subcategoria: Internet
  • Download
  • Nova versão
  • Indicar
  • Denunciar

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.
Download tim2004.zip Enviar nova versão

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

Cotação do Dólar e Euro e conversão para Real

EVOSIGN - Assinatura aleatória no Evolution

Envio e recebimento de arquivos em Python

Cotação do Bitcoin

links em python

#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

Entre na sua conta para comentar.