Skip to content

Instantly share code, notes, and snippets.

@qooba
Last active July 22, 2018 21:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qooba/13d6ca793723d06f96350625ce0f2daf to your computer and use it in GitHub Desktop.
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/
"""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("'")
{
"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