-1

I have created a fb bot which simply echoes the user input. I want it to echo the user inputs continuously and stop when the user types in "bye". How do I do that? Please help out. Code : ```import os import sys import json

import requests
import time
from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['GET'])
def verify():
    if request.args.get("hub.mode") == "subscribe" and request.args.get("hub.challenge"):
        if not request.args.get("hub.verify_token") == os.environ["VERIFY_TOKEN"]:
            return "Verification token mismatch", 403
        return request.args["hub.challenge"], 200

    return "Hello world", 200


@app.route('/', methods=['POST'])
def webhook():
    data = request.get_json()
    if data["object"] == "page":
        for entry in data["entry"]:
            for messaging_event in entry["messaging"]:
                if messaging_event.get("message"):  # someone sent us a message
                    sender_id = messaging_event["sender"]["id"]        
                    recipient_id = messaging_event["recipient"]["id"]  
                    message_text = messaging_event["message"]["text"]  

                    reply = "Received : " + message_text

                    if "bye" in message_text.lower():
                        reply = "Good-bye"
                    send_message(sender_id, reply)

    return "ok", 200


def send_message(recipient_id, message_text):

    log("sending message to {recipient}: {text}".format(recipient=recipient_id, text=message_text))

    params = {
        "access_token": os.environ["PAGE_ACCESS_TOKEN"]
    }
    headers = {
        "Content-Type": "application/json"
    }
    data = json.dumps({
        "recipient": {
            "id": recipient_id
        },
        "message": {
            "text": message_text
        }
    })
    r = requests.post("https://graph.facebook.com/v2.6/me/messages", params=params, headers=headers, data=data)
    if r.status_code != 200:
        log(r.status_code)
        log(r.text)



if __name__ == '__main__':
    app.run(debug=True) ```
  • I have created a fb bot which simply echoes the user input. I want it to echo the user inputs continuously and stop when the user types in "bye". What I mean by this is that the user input is echoed back infinite number of times and the infinite loop breaks only when a "bye" is encountered. – Kaustabh Datta Choudhury Nov 12 '16 at 18:06

2 Answers2

0

How about return without send_message(sender_id, reply) function? Like this

if "bye" in message_text.lower():
     return "bye", 200
dohvis
  • 164
  • 2
  • 7
  • In that case, the user cannot see the "Goodbye" message. Also, when I am making this into a infinite echo, it doesn't break the infinite loop. Breaking the infinite loop as soon as a bye is sent, is the purpose of the question. – Kaustabh Datta Choudhury Nov 12 '16 at 18:03
0

This code is very similar to yours, except the fact that I used class based view

To break the loop add fbid of the user in a file or a DB after he/she says bye. Everytime a message is posted check fbid to see whether user had already said "bye". If yes return empty response

def post_facebook_message(fbid, recevied_message):
    """
    takes a user fb id and posts the bot message as response
    """
    post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token='+PAGE_ACCESS_TOKEN
    response_msg = json.dumps({"recipient":{"id":fbid}, "message":{"text":recevied_message}})
    status = requests.post(post_message_url, headers={"Content-Type": "application/json"},data=response_msg)
    print status.json()

class FBBotView(generic.View):
    #this is to verify your FB account with your program
    #use ythe same verify token used while registering the bot
    @method_decorator(csrf_exempt)
    def get(self, request, *args, **kwargs):
        if self.request.GET['hub.verify_token'] == VERIFY_TOKEN:
            return HttpResponse(self.request.GET['hub.challenge'])
        else:
            return HttpResponse('Error, invalid token')
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return generic.View.dispatch(self, request, *args, **kwargs)

    # Post function to handle Facebook messages
    def post(self, request, *args, **kwargs):
        # Converts the text payload into a python dictionary
        incoming_message = json.loads(self.request.body.decode('utf-8'))
        # Facebook recommends going through every entry since they might send
        # multiple messages in a single call during high load
        for entry in incoming_message['entry']:
            for message in entry['messaging']:
                # Check to make sure the received call is a message call
                # This might be delivery, optin, postback for other events
                if 'message' in message:
                    if recieved_message.lower() == "bye":
                         #sends an empty response
                         message = "Good bye"

                    post_facebook_message(message['sender']['id'],message)
        #this line is important because many times FB checks validity of webhook.
        return HttpResponse()
Bhavani Ravi
  • 2,130
  • 3
  • 18
  • 41