scripts/sms.py

161 lines
6.2 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#/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()