Skip to content

Instantly share code, notes, and snippets.

@theriley106
Created March 9, 2023 04:25
Show Gist options
  • Save theriley106/b696e6d8ae7b957d6d2d675253b350dd to your computer and use it in GitHub Desktop.
Save theriley106/b696e6d8ae7b957d6d2d675253b350dd to your computer and use it in GitHub Desktop.
Twilio WhatsApp Rain Water Collection Bot
from __future__ import print_function
import os
from twilio.rest import Client
from datetime import datetime
from urllib import parse
import requests
import base64
import re
import pymongo
try:
from keys import *
except:
AUTH = os.environ["auth_token"]
SID = os.environ["account_sid"]
MONGO_URL = os.environ("mongo_url")
client = pymongo.MongoClient(MONGO_URL)
db = client.test
db = client['RainWater']
collection = db['RainWaterCollection']
def extract_image_base64(url):
if url != None:
response = requests.get(url).content
return base64.b64encode(response)
def extract_measurement_from_body(body):
if body != None:
digits = re.findall("\d+", body)
if len(digits) == 0:
return
return int(digits[0])
def twilio_response_to_dict(event):
toKeep = {"ProfileName", "Body", "From", "MediaUrl0", "To"}
db = {k: None for k in toKeep}
for k, v in [(str(k.decode('utf-8')), str(v.decode('utf-8'))) for k, v in parse.parse_qsl(base64.b64decode(event.get("body")))]:
if k in toKeep:
db[k] = v
if db['MediaUrl0'] == None:
return db.get("From"), db.get("To"), "Reporting Failed. Please attach a photo."
measurement = extract_measurement_from_body(db.get("Body"))
if measurement == None:
return db.get("From"), db.get("To"), "No measurement found in text."
db['base64Image'] = extract_image_base64(db.get("MediaUrl0"))
db['measurement'] = measurement
db['date'] = datetime.now().strftime("%I:%M%p %B %d, %Y")
collection.insert_one(db)
return db.get("From"), db.get("To"), "Thanks for reporting! I've added your measurement of volume [{}] to our database!".format(measurement)
def lambda_handler(event, context):
fromVal, toVal, message = twilio_response_to_dict(event)
client = Client(SID, AUTH)
client.messages.create(
body=message,
from_=toVal,
to=fromVal,
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment