import datetime import httplib2 import urllib import os import requests import shutil from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage import icalendar TIMEDELTA_SYNCHRO = datetime.timedelta(days=4) # Number of days to look for # for synchronization with open('ntnoe_credentials') as f: NTNOE_ID,NTNOE_PASS,_ = f.read().split('\n') SCOPES = 'https://www.googleapis.com/auth/calendar' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Google Calendar API Python Quickstart' class Event: # ColorId corresponding to course code EVENT_COLOR = { '9' : '9', # Amphi '11' : '10', # TL '10' : '6', # TD '13' : '5', # Autre '12' : '3', # Exam } def __init__(self, e): """ Initialize an event from a `icalendar.cal.Event`.""" self.summary = e.decoded('SUMMARY').decode('utf-8') self.start = e.decoded('DTSTART') self.end = e.decoded('DTEND') self.location = e.decoded('LOCATION').decode('utf-8') self.colorid = self.EVENT_COLOR.get(e.decoded('DESCRIPTION').decode('utf-8'), '1') def __str__(self): return str(self.as_google()) def as_google(self): return { 'summary' : self.summary, 'location' : self.location, 'start' : { 'dateTime' : self.start.isoformat(), 'timeZone' : 'Europe/Paris', }, 'end' : { 'dateTime' : self.end.isoformat(), 'timeZone' : 'Europe/Paris', }, 'colorId' : self.colorid, 'reminders': { 'useDefault': False, 'overrides': [], }, } def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'ntnoe.json') store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME print('Storing credentials to ' + credential_path) credentials = tools.run_flow(flow, store) return credentials def get_ntnoe(): url = "http://ntnoe.metz.supelec.fr/ical/EdTcustom/Eleves/edt_{}.ics" url = url.format(NTNOE_ID) data = {'envoyer':'Utf8_All','submit':'Générer'} r = requests.get( "https://ntnoe.metz.supelec.fr/ical/index.php", data=urllib.parse.urlencode(data), auth=(NTNOE_ID, NTNOE_PASS), ) url = "https://ntnoe.metz.supelec.fr/ical/EdTcustom/Eleves/edt_{id}.ics".format(id=NTNOE_ID) r = requests.get(url, auth=(NTNOE_ID, NTNOE_PASS), stream=True) with open("edt_{}.ics".format(NTNOE_ID), 'wb') as f: f.write(r.content) def main(): """Get the events on NTNOE the puts them on Google Calendar. """ get_ntnoe() credentials = get_credentials() http = credentials.authorize(httplib2.Http()) service = discovery.build('calendar', 'v3', http=http) with open("edt_" + NTNOE_ID + ".ics") as f: c = icalendar.Calendar.from_ical(f.read()) now = datetime.datetime.now() then = now + TIMEDELTA_SYNCHRO time_search = datetime.datetime(now.year, now.month, now.day, 1) response = service.events().list( calendarId='primary', timeMin=time_search.isoformat()+'Z', timeMax=then.isoformat()+'Z', ).execute() existing_events = set() for e in response['items']: if 'summary' in e.keys(): existing_events.add(e['summary']) for e in c.walk('VEVENT'): event = Event(e) t = ( event.summary, event.start.isoformat(), event.end.isoformat(), event.location ) if now >= event.end or event.start >= then: continue if existing_events.intersection({event.summary}): continue event = service.events().insert( calendarId='primary', body=event.as_google() ).execute() print("Added event : {}".format(event.get('htmlLink'))) if __name__ == '__main__': main()