161 lines
6.2 KiB
Python
161 lines
6.2 KiB
Python
|
#/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: <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='emilie.nerre@gmail.com'
|
|||
|
PASSWD='catpower'
|
|||
|
# 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()
|