from oauth2client.service_account import ServiceAccountCredentials
from apiclient import discovery
from flask import Flask, Response, request
from datetime import datetime, timedelta
from twilio.rest import Client
from twilio.twiml.messaging_response import MessagingResponse
app = Flask(__name__)
app.config.from_object(‘app_config’)
client = Client(app.config.get("TWILIO_ACCOUNT_SID"), app.config.get("TWILIO_AUTH_TOKEN"))
def _build_service():
scope = ‘https://www.googleapis.com/auth/calendar.readonly’
credentials = ServiceAccountCredentials.from_json_keyfile_name(‘client_secret.json’, scope)
service = discovery.build(‘calendar’, ‘v3’, credentials=credentials)
return service
def where_you_at(service, calendar_id):
"""Find out if I’m traveling right now, respond with current location or the next trip if not currently traveling."""
now = datetime.utcnow()
today = now.isoformat() ‘Z’
tomorrow = (now timedelta(days=1)).isoformat() ‘Z’
# let google do the datetime math
currentEvent = service.events().list(
calendarId=calendar_id,
timeMin=today,
timeMax=tomorrow,
maxResults=1,
singleEvents=True,
orderBy=‘startTime’
).execute()
currentlyTravelingTo = currentEvent.get(‘items’, [])
if not currentlyTravelingTo:
futureEvents = service.events().list(
calendarId=calendar_id,
timeMin=today,
maxResults=1,
singleEvents=True,
orderBy=‘startTime’
).execute()
event = futureEvents.get(‘items’, [])[0]
start = event[‘start’].get(‘dateTime’, event[‘start’].get(‘date’))
msg = "Doesn’t look like {} is currently traveling. The next trip is to {} on {}".format(
app.config.get("TRAVELER"),
event[‘summary’],
start)
else:
event = currentlyTravelingTo[0]
end = event[‘end’].get(‘dateTime’, event[‘end’].get(‘date’))
msg = "{} is currently in {} until {}".format(
app.config.get("TRAVELER"),
event[‘summary’],
end)
resp = MessagingResponse()
resp.message(msg)
return str(resp)
def _event_info(event):
start = event[‘start’].get(‘date’)
end = event[‘end’].get(‘date’)
summary = event[‘summary’]
return "{} from {} to {}".format(summary, start, end)
def travel_schedule(service, calendar_id):
"""Look up the next 5 events in our calendar and format them as a message."""
now = datetime.utcnow()
today = now.isoformat() ‘Z’
tomorrow = (now timedelta(days=1)).isoformat() ‘Z’
# let google do the datetime math
event_list = service.events().list(
calendarId=calendar_id,
timeMin=today,
maxResults=5,
singleEvents=True,
orderBy=‘startTime’
).execute()
event_response = ["My next five planned events are:n"]
for event in event_list.get("items", []):
event_response.append(_event_info(event))
msg = "n".join(event_response)
resp = MessagingResponse()
resp.message(msg)
return str(resp)
def help_response():
"""The default response if the user texts in an unknown command."""
resp = MessagingResponse()
resp.message("Ask me ‘Where is {}?’ to see my current whereabouts or ‘Travel schedule’ to see what’s coming up.".format(app.config.get("TRAVELER")))
return str(resp)
@app.route("/sms", methods=["GET", "POST"])
def main():
"""Respond to an incoming SMS message based on the body of the message."""
incoming_message = request.values.get("Body")
service = _build_service()
calendar_id = app.config.get("CALENDAR_ID")
normalized_message = incoming_message.lower()
if "where" in normalized_message:
return where_you_at(service, calendar_id)
elif "schedule" in normalized_message:
return travel_schedule(service, calendar_id)
else:
return help_response()
if __name__ == ‘__main__’:
app.run(debug=True)
Source: https://www.twilio.com/blog/2018/06/how-i-keep-my-mom-updated-on-my-travel-schedule-with-twilio-and-google-calendar.html