How I keep my mom updated on my travel schedule with Python, Twilio, and Google Calendar – Twilio Cloud Communications Blog

posted in: Quickbooks Online 0

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