#/usr/bin/python # -*- coding: utf-8 -*- # Script permettant d'envoyer des SMS grâce à Google Agenda. # Créez un compte google, un nouvel agenda, et configurez-le pour que la notification se fasse par SMS 5 minutes avant l'événement. # L'idée vient de http://macsim.labolinux.net/index.php/post/2008/02/15/137-smsalert-envoyer-des-sms-gratuitement-depuis-ses-serveurs # Copyright (C) 2008 Jean-Philippe Brucker — Tous droits réservés. # # Ce programme est un logiciel libre. Vous pouvez le redistribuer ou le # modifier suivant les termes de la "GNU General Public License" version 3, # telle que publiée par la Free Software Foundation. # # Ce programme est distribué dans l’espoir qu’il vous sera utile, mais SANS # AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ # ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la Licence Générale # Publique GNU pour plus de détails. # # Ce programme doit être distribué avec une copie de la # License Générale Publique GNU (fichier license.html). # Si ce n’est pas le cas, consultez: . import urllib, urllib2 import time import re import sys, getopt # Modifiez ces champs pour vous logger automatiquement. USER='MyEmail@gmail.com' PASSWD='MyPassword' # Ajoutez /private/full à la fin d'une adresse personalisée. ADRESSE="http://www.google.com/calendar/feeds/default/private/full" AIDE="""Aide : Usage : %s [-h] [-e email] [-p pass] [titre [message]] -h ou --help : Afficher l'aide. -e ou --email : spécifier un compte. -p ou --password : spécifier un mot de passe Et c'est tout. """ % sys.argv[0] def parserLdc(): global title,where, USER, PASSWD opts, args=None, None try: opts, args=getopt.getopt(sys.argv[1:], "he:p:",['help', 'email=', 'password=']) except getopt.GetoptError, e: raise 'Argument «%s» inconnu.' % e.opt for option, value in opts: if option in ('-h', '--help'): print AIDE sys.exit(0) elif option in ('-e', '--email'): USER = value elif option in ('-p', '--password'): PASSWD = value if len(args)==2: title = args[0].replace('\'', ' ') where = args[1].replace('\'', ' ') elif len(args)==1: title = args[0].replace('\'', ' ') class googleCalendar: """ Cette classe permet de créer un nouvel événement dans un agenda google.""" def __init__(self, user, passwd, adress): self.user = user self.passwd = passwd self.adress = adress self.auth = "" def connect(self): url={} url['accountType']='GOOGLE' url['Email']=self.user url['Passwd']=self.passwd url['service']='cl' url['source']='exampleCo-exampleApp-1' page = urllib.urlopen("https://www.google.com/accounts/ClientLogin", urllib.urlencode(url)) for line in page.readlines(): if line.find("Auth=")>-1: self.auth = line[5:-1] return 0 return 1 def send(self,settings): """ send prend un tuple en argument : Settings={} Settings['title'] => Affiché dans un SMS Settings['content'] Settings['where'] => Affiché dans un SMS Settings['start'] => Le SMS est envoyé 5min avant Settings['end'] """ if self.connect(): print "Connexion impossible !" return Data = """ %s %s %s %s """ % (settings['title'], settings['content'], self.user, self.user, settings['where'], settings['start'], settings['end']) Headers={} Headers['Host']='www.google.com' Headers['MIME-Version']='1.0' Headers['Accept']='text/xml' Headers['Authorization']='GoogleLogin auth='+self.auth Headers['Content-length']=str(len(Data)) Headers['Content-type']='application/atom+xml' Headers['Cache-Control']='no-cache' Headers['Connection']='close \r\n' try: req = urllib2.Request(self.adress, Data, Headers) handler = urllib2.HTTPHandler()#debuglevel=2) opener = urllib2.OpenerDirector() opener.add_handler(handler) page = opener.open(req) # Pas joli-joli, tout ça. À améliorer lien = re.compile(r'HREF=["\'](.+)["\']').findall(page.read()) if len(lien)>0: req=urllib2.Request(lien[0],Data,Headers) else: print "Impossible de récupérer l'adresse de redirection." return opener.open(req) print "Événement envoyé." except IOError, e: print e return def RFC3339(date): d=[] for i in date: d.append(str(i)) for i in xrange(1,6): if len(d[i])<2: d[i]="0"+d[i] return d[0]+'-'+d[1]+'-'+d[2]+'T'+d[3]+':'+d[4]+':'+d[5]+'.000Z' def main(): global title,where,USER,PASSWD title="" where="" parserLdc() while not USER : USER=raw_input("Entrez votre nom d'utilisateur : ") while not PASSWD: PASSWD=raw_input("Entrez votre mot de passe : ") while not title : title = raw_input("Entrez un titre : ") if not where : where = raw_input("Entrez un message ou tapez [Entrée] pour laisser vide: ") event = {'title':title, 'content': "SMS", 'where':where, 'start':RFC3339(time.gmtime(time.time()+60*5+30)), 'end':RFC3339(time.gmtime(time.time()+60*5+45))} cal = googleCalendar(USER, PASSWD, ADRESSE) cal.send(event) if __name__=="__main__": main()