# -*- coding: cp1252 -*- # #---------Importamos los modulos necesarios------------ from VideoCapture import Device import time, string import quopri # quoted printable emails import getpass, poplib # simple pop3 handling import httplib, urllib, urlparse #-------------Variables y configuracion--------------- #Usuarios autorizados segun número de movil usuarios=['34646615225','34620620620'] #Intervalo de tiempo en minutos del bucle principal. intervalo = 1 #Variables de la cuenta de correo pop3url = 'mail.miservidor.com' # Servidor popuser = 'usuario' #Usuario poppass = 'clave' #Clave #Definimos la webcam que detecta VideoCapture,(0..n) cam = Device(devnum=2,showVideoWindow=0) #Vars y envio MMS log='6xxxxxxxx' # MSISDN passw='xxxxxx' # password de acceso a la web de copiagenda subject='webcamMMS' # asunto del mensaje msg='texto del mensaje' # texto del mensaje nombreImg='imagen' # nombre de la imagen que vamos a insertar pathImg='c:\\wcmms\\imagen.jpg' # path de la imagen que vamos a insertar #---------Fin de variables y configuracion------------ #-----------------Clases------------------------------ class MensajeriaMultimediaWeb : login = '' user = '' sk = '' cookie = '' server = 'www.multimedia.movistar.es' def Login(self, login, pwd) : """Realiza el login al servicio MMS Entrada: login=cadena con el numero de telefono, pwd=cadena con el password de acceso a la web""" if verbose: print 'Iniciando Login... (http://' + self.server + '/)' # Intentamos entrar en www.multimedia.movistar.es para que nos diga a cual tenemos que ir headers = {"User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive"} conn=httplib.HTTPConnection(self.server) conn.request ("GET", "/", None, headers) resp=conn.getresponse() if resp.status == 302 : respuesta=resp.read() ## Nos redirecionan (imagino que al servidor con menos carga) location = '' headresp=resp.getheaders() for n in headresp : if n[0] == 'location' : location = n[1] if verbose: print resp.status, ' => ', location components = urlparse.urlsplit(location) server = components[1] self.server = server self.login = login # Enviamos los datos de login params = urllib.urlencode ({'source': 'olduid', 'TM_ACTION': 'LOGIN', 'TM_LOGIN': self.login, 'TM_PASSWORD': pwd}) headers = {"Content-type":"application/x-www-form-urlencoded", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive"} conn=httplib.HTTPConnection(self.server) conn.request ("POST", "/login", params, headers) resp=conn.getresponse() if resp.status == 302 : respuesta=resp.read() ## Nos redirecionan y nos dan una cookie (la necesitaremos para las peticiones posteriores) location = '' cookie = '' headresp=resp.getheaders() for n in headresp : if n[0] == 'location' : location = n[1] elif n[0] == 'set-cookie' : cookie = n[1] if verbose: print resp.status, ' => ', location components = urlparse.urlsplit(location) server = components[1] path = components[2] cookieList = cookie.split(';') cookie = cookieList[0] # Usamos la primera parte de la lista porque después vienen las condiciones self.cookie = cookie if verbose: print '\tCookie: ' + self.cookie # Tenemos que conservar los valores uid y sk para el resto de las peticiones variables = components[3].split('&') for n in variables : lista = n.split('=') if lista[0] == 'uid' : self.user = lista[1] elif lista[0] == 'sk' : self.sk = lista[1] elif lista[0] == 'error' : print 'Se ha producido un error (' + lista[1] + ')' if verbose: print '\tuid: ' + self.user print '\tsk: ' + self.sk if self.user != '' : params2 = urllib.urlencode ({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''}) headers2 = {"Accept": "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie} conn2=httplib.HTTPConnection(server) conn2.request ("GET", '/main/?'+params2, None, headers2) resp2=conn2.getresponse() if resp2.status == 200 : params3 = urllib.urlencode ({'uid': self.user, 'sk': self.sk}) headers3 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie} conn3=httplib.HTTPConnection(self.server) conn3.request("GET", '/compose/send?'+params3, None, headers3) resp3=conn3.getresponse() status3 = resp3.status respuesta3=resp3.read() conn3.close() conn2.close() conn.close() return self.user def InsertaImagen(self, nombreObj, pathObj) : """Inserta un objeto en el mensaje MMS Entrada: nombreObj=cadena con el nombre del objeto, pathObj=cadena con el path local del archivo""" listaContentType = {'gif': 'image/gif', 'jpg': 'image/pjpeg', 'jpeg': 'image/pjpeg', 'png': 'image/x-png', 'bmp': 'image/bmp'} # en principio sólo enviaremos estos tipos path = pathObj.split('.') extension = path[-1] # usando números negativos recorremos la lista en orden inverso (el elemento -1 es el último) contentType = listaContentType[extension] if verbose: print 'Insertando imagen...' params2 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'folderid': '', 'uploadtofolder': 'false', 'foldertype': '1', 'rnd': '74065'}) referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1' headers2 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer} conn2=httplib.HTTPConnection(self.server) conn2.request("GET", '/folders/upload_frame?' + params2, None, headers2) resp2=conn2.getresponse() if resp2.status == 200 : separador="---------------------------7d77df567a4b9" # generamos los datos del objeto userPart = '--' + separador + '\r\nContent-Disposition: form-data; name="user"\r\n\r\n34' + self.login + '\r\n' limitPart = '--' + separador + '\r\nContent-Disposition: form-data; name="limit"\r\n\r\n307200\r\n' urlReturn = 'http://' + self.server + '/folders/upload_close?uid=' + self.user + '&sk=' + self.sk + '&uploadtofolder=false' urlReturnPart = '--' + separador + '\r\nContent-Disposition: form-data; name="url_return"\r\n\r\n' + urlReturn +'\r\n' namePart = '--' + separador + '\r\nContent-Disposition: form-data; name="name"\r\n\r\n' + nombreObj + '\r\n' filenamePart = '--' + separador + '\r\nContent-Disposition: form-data; name="filename"; filename="' + pathObj + '"\r\nContent-Type: ' + contentType + '\r\n\r\n' final = '\r\n--' + separador + '--\r\n' f=open(pathObj, 'rb') contenido = f.read() f.close() data = userPart + limitPart + urlReturnPart + namePart + filenamePart + contenido + final # es necesario crear la cabecera Referer con los parámetros de la petición anterior referer = 'http://' + self.server + '/folders/upload_frame?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1&rnd=74065' contentType = "multipart/form-data; boundary="+separador headers = {"Content-type": contentType, "Accept-Language": "es", "Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Accept-Encoding": "gzip, deflate", "Cache-Control": "no-cache", "Cookie": self.cookie, "Referer": referer} conn=httplib.HTTPConnection(self.server) conn.request ("POST", "/mas/messaging_as/temporalcontentservlet", data, headers) resp=conn.getresponse() respuesta = resp.read() # Tenemos que recibir la cabecera oid con el identificador del objeto insertado oid = '' headresp=resp.getheaders() for n in headresp : if n[0] == 'oid' : oid = n[1] if verbose: print '\toid: ' + oid if oid != '' : if verbose: print '\tImagen insertada' params3 = urllib.urlencode ({'uploadtofolder': 'false', 'uid': self.user, 'sk': self.sk, 'status': 'success', 'oid': oid}) referer = 'http://' + self.server + '/folders/upload?uid=' + self.user + '&sk=' + self.sk + '&folderid=&uploadtofolder=false&foldertype=1' headers3 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer} conn3=httplib.HTTPConnection(self.server) conn3.request("GET", '/folders/upload_close?' + params3, None, headers3) resp3=conn3.getresponse() conn3.close() params4 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'slide_num': '1', 'function_name': 'img', 'value': oid}) referer = 'http://' + self.server + '/compose?uid=' + self.user + '&sk=' + self.sk + '&fr=ns&pathstring=+:+Env%EDo+Mensaje+MultiMedia&adultcheckparam=no' headers4 = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection": "Keep-Alive", "Cookie": self.cookie, 'Referer': referer} conn4=httplib.HTTPConnection(self.server) conn4.request("GET", '/compose/ms?' + params4, None, headers4) resp4=conn4.getresponse() conn4.close() conn.close() conn2.close() def EnviaMensaje(self, subject, dest, msg) : """Realiza el envío del mensaje MMS Entrada: subject=asunto del mensaje dest=cadena con el destinatario del mensaje msg=cadena con el texto del mensaje""" print 'Enviando mensaje...' params4 = urllib.urlencode ({'user': self.user, 'sk': self.sk, 'function_name': 'send', 'text_function': 'update', 'text_value': msg, 'slide_num': '1', 'subject': subject, 'to1': dest, 'to2': '', 'to3': '', 'frag': ''}) # es necesario crear la cabecera Referer con sus parámetros paramsReferer = urllib.urlencode({'uid': self.user, 'sk': self.sk, 'fr': 'ns', 'pathstring': 'Envío Mensaje MultiMedia', 'adultcheckparam': 'no'}) referer = 'http://' + self.server + '/compose?'+paramsReferer headers4 = {"Content-type":"application/x-www-form-urlencoded", "Accept": "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie, "Referer": referer} conn4=httplib.HTTPConnection(self.server) conn4.request ("POST", '/compose/ms', params4, headers4) resp4=conn4.getresponse() respuesta4 = resp4.read() if respuesta4.find('is_sent_ok=true') : print '\tMensaje enviado' elif respuesta4.find('is_sent_ok=false') : print '\tEl mensaje no se ha podido enviar' if resp4.status == 200 : params5 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'is_sent_ok': 'true', 'to1': dest}) headers5 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie} conn5=httplib.HTTPConnection(self.server) conn5.request("GET", '/compose/send/confirm?'+params5, None, headers5) resp5=conn5.getresponse() if resp5.status == 200 : paramsReferer = urllib.urlencode({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''}) referer = 'http://' + self.server + '/main/?'+paramsReferer params6 = urllib.urlencode ({'uid': self.user, 'sk': self.sk}) headers6 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie} conn6=httplib.HTTPConnection(self.server) conn6.request("GET", '/login_frame?'+params6, None, headers6) resp6=conn6.getresponse() conn6.close() params7 = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'fr': 'ns', 'pathstring': ' : Envío Mensaje Multimedia', 'adultcheckparam': 'no'}) headers7 = {"Accept": "*/*", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive","Cookie" : self.cookie} conn7=httplib.HTTPConnection(self.server) conn7.request("GET", '/compose?'+params7, None, headers7) resp7=conn7.getresponse() conn7.close() conn5.close() conn4.close() def Logout(self) : if verbose: print 'Iniciando Logout...' # hacemos el logout paramsLogout = urllib.urlencode ({'uid': self.user, 'sk': self.sk, 'TM_ACTION': 'LOGOUT'}) # es necesario crear la cabecera Referer con sus parámetros paramsRefererLogout = urllib.urlencode({'sk': self.sk, 'uid': self.user, 'source': '', 'olduid': ''}) refererLogout = 'http://' + self.server + '/main/?' + paramsRefererLogout headersLogout = {"Content-type":"application/x-www-form-urlencoded", "User-Agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Connection" : "Keep-Alive", 'Referer': refererLogout} connLogout=httplib.HTTPConnection(self.server) connLogout.request ("POST", "/logout",paramsLogout, headersLogout) respLogout=connLogout.getresponse() connLogout.close() #----------------Fin de clases---------------------------- #----------------Funciones-------------------------------- #Guardamos el snapshot de la webcam def tomaimagen(): cam.saveSnapshot('imagen.jpg', timestamp=1, boldfont=1) return # Convierte el formato email en la variable msg y extrae el SMS # en formato ('numero de movil', 'mensaje de text sms') def lee_SMS(msg): for i in range(len(msg)): # Leemos Content-Type y encoding "al paso" if msg[i].startswith('Content-Type:'): try: ctype, encoding = map(str.strip, msg[i].split(':')[1].split(';')) encoding = encoding.split('=')[1].strip() except: encoding = 'ascii' # Encuentro el final de cabeceras (primera línea en blanco) if not msg[i]: break #cabeceras #heads=msg[:i] #cuerpo body=msg[i+1:] # primer match numero = body[0].split(':',1) if len(numero)>1: numero = numero[1] mensaje = body[1].split(':',1) if len(mensaje)>1: mensaje = unicode(quopri.decodestring(mensaje[1]),'utf8') return numero, mensaje else: return None # no es un SMS def lee_mailbox(): M = poplib.POP3(pop3url) M.user(popuser) M.pass_(poppass) if verbose: print M.list()[0] print "###### SMS recibidos #######" msisdnlist = [] textolist = [] for mid, longitud in [i.split() for i in M.list()[1]]: mid = int(mid) ret, msg, size = M.retr(mid) msisdn, texto = lee_SMS(msg) if verbose: print mid,msisdn,texto msisdnlist.append(msisdn) textolist.append(texto) if verbose: print msisdnlist print textolist print "#############" return msisdnlist, textolist def borra_mailbox(): M = poplib.POP3(pop3url) M.user(popuser) M.pass_(poppass) stat= M.stat () for n in range(stat[0]): msgnum = n+1 M.dele(msgnum) M.quit() #print M.list()[0] return None #Comprobamos si es usuario atorizado def checkuser(numero): if usuarios.count(numero)!=0: return True else: return False #--------------Fin de funciones-------------------- #-------- Bucle principal chequeos y envios------------ def bucle(): msisdnlist, textolist = lee_mailbox() mlist = msisdnlist + [] tlist = textolist + [] mlist.sort() tlist.sort() print "####### Lista de moviles y mensajes recibidos #######" a = [] for i in mlist: if a != i: if checkuser(i)==True: print i,"* Autorizado *" tomaimagen() user = mms.Login(log, passw) dest= i # destinatario del mensaje mms.InsertaImagen(nombreImg, pathImg) mms.EnviaMensaje(subject, dest, msg) mms.Logout() else: print i, "<- Desconocido" a = i print "#####################################################" borra_mailbox() mms = MensajeriaMultimediaWeb() verbose = False print "Pulse Control+C para terminar" #No me convence el while asi que uso un for largo for n in range(10000): print " " pass bucle() time.sleep(intervalo*60) #---------This is the end...the end...my friend...------