Last active
July 22, 2018 21:58
-
-
Save qooba/13d6ca793723d06f96350625ce0f2daf to your computer and use it in GitHub Desktop.
Hello from serverless messanger chatbot. Read more: http://qooba.net/index.php/2018/07/22/hello-from-serverless-messanger-chatbot/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""messanger chatbot""" | |
import binascii | |
import hmac | |
import json | |
import os | |
import urllib | |
from hashlib import sha1 | |
verify_token = os.environ["verify_token"] | |
access_token = os.environ["access_token"] | |
app_secret = os.environ["app_secret"] | |
# lambda entry point | |
def lambda_handler(event, context): | |
"""lambda entrypoint""" | |
print(event) | |
try: | |
query_string_parameters = event["queryStringParameters"] | |
if query_string_parameters != None: | |
hub_mode = query_string_parameters["hub.mode"] | |
hub_challenge = query_string_parameters["hub.challenge"] | |
hub_verify_token = query_string_parameters["hub.verify_token"] | |
# handling verification request | |
if hub_mode == "subscribe" and verify_token == hub_verify_token: | |
return { | |
'statusCode': 200, | |
'body': hub_challenge, | |
'headers': { | |
'Content-Type': 'text/plain' | |
} | |
} | |
body = event["body"] | |
headers = event["headers"] | |
# here we verify the webhook signature | |
if headers["X-Hub-Signature"].replace('sha1=', '') != hmac_sha1(body): | |
return {'statusCode': 200} | |
# finally we parse the message | |
for entry in json.loads(body)["entry"]: | |
for message in entry["messaging"]: | |
if message.get("message", None) != None: | |
publish_message(message) | |
except Exception as ex: | |
print(ex) | |
return {'statusCode': 200} | |
def publish_message(message): | |
"""publish message""" | |
base_url = 'https://graph.facebook.com/v2.6/me/messages?access_token={}' | |
url = base_url.format(access_token) | |
sender_id = message['sender']['id'] | |
# here we parse the message intent | |
if parse_intent(message) == 'hungry': | |
text = "Bon Appetit :)" | |
else: | |
text = "Hello from serverless messanger chatbot !!!" | |
my_message = {"recipient": {"id": sender_id}, "message": {"text": text}} | |
req = urllib.request.Request(url) | |
data = urllib.parse.urlencode(my_message).encode('utf-8') | |
urllib.request.urlopen(req, data=data) | |
def parse_intent(message): | |
try: | |
nlp = message['message']['nlp'] | |
intent = nlp['entities']['intent'][0]['value'] | |
return intent | |
except KeyError: | |
return None | |
def hmac_sha1(input_str): | |
"""calculate hmac""" | |
raw = input_str.encode("utf-8") | |
key = app_secret.encode('utf-8') | |
hashed = hmac.new(key, raw, sha1) | |
return str(binascii.hexlify(hashed.digest())).lstrip('b').strip("'") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"object": "page", | |
"entry": [ | |
{ | |
"id": "*********************", | |
"time": 1532132321321, | |
"messaging": [ | |
{ | |
"sender": { | |
"id": "****************" | |
}, | |
"recipient": { | |
"id": "*****************" | |
}, | |
"timestamp": 1532123213213, | |
"message": { | |
"mid": "***************************", | |
"seq": 222222, | |
"text": "I want to eat pizza", | |
"nlp": { | |
"entities": { | |
"dish": [ | |
{ | |
"confidence": 0.91639471779845, | |
"value": "pizza", | |
"type": "value", | |
"_entity": "dish", | |
"_body": "pizza", | |
"_start": 15, | |
"_end": 20 | |
} | |
], | |
"intent": [ | |
{ | |
"confidence": 0.99276725775628, | |
"value": "hungry", | |
"_entity": "intent" | |
} | |
] | |
} | |
} | |
} | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment