scripts/sms.py

161 lines
6.2 KiB
Python
Raw Permalink Normal View History

#/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 lespoir quil vous sera utile, mais SANS
# AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ
# ni dADÉ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 nest pas le cas, consultez: <http://www.gnu.org/licenses/gpl.html>.
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 = """<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'>
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category>
<title type='text'>%s</title>
<content type='text'>%s</content>
<author>
<name>%s</name>
<email>%s</email>
</author>
<gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency>
<gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus>
<gd:where valueString='%s'></gd:where>
<gd:when startTime='%s' endTime='%s'><gd:reminder minutes='5' /></gd:when>
</entry>""" % (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()