Example #1
0
    def test_client_subscribe(self, mock_post):
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {'success': True}
        messenger = MessengerClient(access_token='1234')
        messenger.subscribe_app()

        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/subscribed_apps',
            params={'access_token': '1234'})
Example #2
0
    def test_client_subscribe(self, mock_post):
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {
            'success': True
        }
        messenger = MessengerClient(access_token='1234')
        messenger.subscribe_app()

        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/subscribed_apps',
            params={'access_token': '1234'}
        )
Example #3
0
    def test_client_send_error_with_no_error_data(self, mock_post):

        mock_post.return_value.status_code = 190
        mock_post.return_value.json.return_value = {
            'error': {
                u'message':
                u'This Page access token belongs to a Page that has been deleted.',
                u'code': 190,
                u'type': u'OAuthException'
            }
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        self.assertRaises(MessengerException, messenger.send, request)
        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {
                    "text": "Hello World"
                },
                "recipient": {
                    "id": "123"
                }
            },
            params={'access_token': '1234'})
Example #4
0
    def test_client_send_error_with_error_data(self, mock_post):

        mock_post.return_value.status_code = 190
        mock_post.return_value.json.return_value = {
            "error": {
                "message": "Invalid parameter",
                "type": "FacebookApiException",
                "code": 100,
                "error_data": "No matching user found.",
                "fbtrace_id": "D2kxCybrKVw"
            }
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        self.assertRaises(MessengerException, messenger.send, request)
        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {
                    "text": "Hello World"
                },
                "recipient": {
                    "id": "123"
                }
            },
            params={'access_token': '1234'})
Example #5
0
    def test_client_send(self, mock_post):

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {
            'success': True
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        messenger.send(request)

        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {"text": "Hello World"},
                "recipient": {"id": "123"}
            },
            params={'access_token': '1234'}
        )
Example #6
0
    def test_client_send(self, mock_post):

        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {
            'success': True
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        messenger.send(request)

        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {"text": "Hello World"},
                "recipient": {"id": "123"}
            },
            params={'access_token': '1234'}
        )
Example #7
0
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from messengerbot import MessengerClient, messages
from chatbot import register_call
from django.chatbot.chatbot import chat
from django.conf import settings
import json
import wikipedia
import urllib.parse
import urllib.request

# Manually initialise client
messenger = MessengerClient(access_token=settings.ACCESS_TOKEN)


def index(request):
    return render(request, "home.html")


def about(query, qtype=None):
    service_url = 'https://kgsearch.googleapis.com/v1/entities:search'
    params = {
        'query': query,
        'limit': 10,
        'indent': True,
        'key': settings.API_KEY,
    }
    url = service_url + '?' + urllib.parse.urlencode(params)
    response = json.loads(urllib.request.urlopen(url).read())
    if not len(response['itemListElement']):
Example #8
0
app = Flask(__name__)
# Configure app.
_access_token = os.environ.get('CHRONOLOGIST_ACCESS_TOKEN')
_verify_token = os.environ.get('CHRONOLOGIST_VERIFY_TOKEN')

if _access_token is None and __name__ == '__main__':
    raise RuntimeError('`CHRONOLOGIST_ACCESS_TOKEN` env var is not set')
app.config.update(DEBUG=eval(os.environ.get('CHRONOLOGIST_DEBUG', 'False')),
                  VERIFY_TOKEN=_verify_token,
                  ACCESS_TOKEN=_access_token,
                  DIALOGFLOW_PROJECT_ID='chronologist-mvqppm',
                  DIALOGFLOW_LANGUAGE_CODE='en')
api = Api(app)
history_api = History_API()
messenger = MessengerClient(access_token=app.config['ACCESS_TOKEN'])
# Logging.
gunicorn_error_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.DEBUG if app.config['DEBUG'] else logging.INFO)


class FacebookOG(Resource):
    def get(self):
        return "OK!", 200


class Bot(Resource):
    def __init__(self):
        self.bot_ai = BotAI()
Example #9
0
from kik.messages import TextMessage, PictureMessage, SuggestedResponseKeyboard,\
                        TextResponse, LinkMessage,StartChattingMessage, CustomAttribution

from bot import kik,FB_PAGE_TOKEN
from messengerbot import MessengerClient, attachments, templates, elements
from messengerbot import messages as fbmessages
fbmessenger = MessengerClient(access_token=FB_PAGE_TOKEN)

def dispatchMessage(context,msg_type,*args,**kwargs):
    kwargs['msg_type'] = msg_type
    if context['platform'] == 'KIK':
        sendKikMessages(*args,**kwargs)
    if context['platform'] == 'FB':
        sendFBMessage(*args,**kwargs)

def abstract_kik_message(to,chat_id,content,msg_type):
    if msg_type == 'text':
        return TextMessage(to=to,chat_id=chat_id,body=content)
    if msg_type == 'image':
        return PictureMessage(to=to,chat_id=chat_id,pic_url=content)
    if msg_type == 'link':
        return LinkMessage(to=to,chat_id=chat_id,url=content)
    
def sendKikMessages(chat_id,from_user,msgs,suggested_responses=[],msg_type=None):
        
    send_these = []
    for msg in msgs:
        send_these.append(abstract_kik_message(
            to=from_user,
            chat_id=chat_id,
            content=msg,
Example #10
0
 def init_bot(self):
     self._bot = MessengerClient(self.token)
Example #11
0
class MessengerBot(IntegrationBot):
    """
    Facebook Messenger integration. 
    
    Permabots only uses Page Access Token but webhook is not set. It mus be set manually in Facebook dev platform using 
    UUID generated as id of the messenger bot after creation in Permabots.
    
    This bot is used to Verify Token and  generate url https://domain/processing/messengerbot/permabots_messenger_bot_id/
    
    Read Messenger documentation `<https://developers.facebook.com/docs/messenger-platform/quickstart>` _.
    """
    token = models.CharField(_('Messenger Token'), max_length=512, db_index=True)
    
    class Meta:
        verbose_name = _('Messenger Bot')
        verbose_name_plural = _('Messenger Bots')    
    
    def __init__(self, *args, **kwargs):
        super(MessengerBot, self).__init__(*args, **kwargs)
        self._bot = None
        self.webhook = False
        if self.token:
            self.init_bot()
           
    def __str__(self):
        return "%s" % self.token
    
    def __repr__(self):
        return "(%s, %s)" % (self.id, self.token)
    
    def init_bot(self):
        self._bot = MessengerClient(self.token)
    
    def set_webhook(self, url):
        # Url is set in facebook dashboard. Just subscribe
        self._bot.subscribe_app() 

    @property
    def hook_url(self):
        return 'permabots:messengerbot'
    
    @property
    def hook_id(self):
        return str(self.id)
    
    @property
    def null_url(self):
        # not used
        return "https://example.com"
    
    @property
    def identity(self):
        return 'messenger'
    
    def message_text(self, message):
        return message.data
    
    def get_chat_state(self, message):
        try:
            return MessengerChatState.objects.select_related('state').get(chat=message.sender, state__bot=self.bot)
        except MessengerChatState.DoesNotExist:
            return None
        
    def build_keyboard(self, keyboard):     
        def traverse(o, tree_types=(list, tuple)):
            if isinstance(o, tree_types):
                for value in o:
                    for subvalue in traverse(value, tree_types):
                        yield subvalue
            else:
                yield o
                
        built_keyboard = None
        if keyboard:
            # same payload as title
            built_keyboard = [PostbackButton(element[0:20], element) for element in traverse(ast.literal_eval(keyboard))]
        return built_keyboard
    
    def create_chat_state(self, message, target_state, context):
        MessengerChatState.objects.create(chat=message.sender,
                                          state=target_state,
                                          ctx=context)

    def get_chat_id(self, message):
        return message.sender
        
    def send_message(self, chat_id, text, keyboard, reply_message=None, user=None):
        texts = text.strip().split('\\n')
        msgs = []
        for txt in texts:             
            for chunk in textwrap.wrap(txt, 320):
                msgs.append(messages.Message(text=chunk))

        if keyboard:
            if len(msgs[-1].text) <= 45:
                title = msgs.pop().text
            else:
                new_texts = textwrap.wrap(msgs[-1].text, 45)
                msgs[-1].text = " ".join(new_texts[:-1])
                title = new_texts[-1]
            elements = []
            for chunk_buttons, last in self.batch(keyboard[0:30], 3):
                elements.append(Element(title=title, buttons=chunk_buttons))
            generic_template = GenericTemplate(elements)
            attachment = TemplateAttachment(generic_template)
            msgs.append(messages.Message(attachment=attachment))
        
        for msg in msgs:
            try:
                logger.debug("Message to send:(%s)" % msg.to_dict())
                recipient = messages.Recipient(recipient_id=chat_id)
                self._bot.send(messages.MessageRequest(recipient, msg))
                logger.debug("Message sent OK:(%s)" % msg.to_dict())
            except:
                exctype, value = sys.exc_info()[:2] 
                logger.error("Error trying to send message:(%s): %s:%s" % (msg.to_dict(), exctype, value))
Example #12
0
 def __init__(self, access_token, recipient_id):
     self.access_token = access_token
     self.recipient_id = recipient_id
     self.messenger = MessengerClient(access_token=access_token)
Example #13
0
class Replies(object):

    def __init__(self, access_token, recipient_id):
        self.access_token = access_token
        self.recipient_id = recipient_id
        self.messenger = MessengerClient(access_token=access_token)

    @property
    def recipient(self):
        return messages.Recipient(recipient_id=self.recipient_id)

    def reply_msg(self, text):
        message = messages.Message(text=text)
        request = messages.MessageRequest(self.recipient, message)
        self.messenger.send(request)

    def ask_where(self):
        self.reply_msg('Xin chào! Bạn muốn ăn ở đâu?')

    def give_suggestions(self, location, negations):
        text = 'kết quả từ {district} nè'.format(district=location)
        self.reply_msg(text)
        results = quanbot.quan.Quan.search(location, negations)
        if results:
            elements = list(map(self._quan_element, results))
            self._send_carousel(elements)
            return True
        else:
            self.reply_msg("Không tìm thành công thì restart")
            return False

    def failed_read_location(self):
        self.reply_msg('Vui lòng viết lại')

    def say_restarting(self):
        self.reply_msg('Rồi, hãy thử một lần nữa nha')

    def _quan_element(self, qd):
        web_button = elements.WebUrlButton(
                title='xem trên Foody.vn',
                url=qd['URL'],
                )
        postback_button = elements.PostbackButton(
                title="Không " + qd['maindish'],
                payload="Không " + qd['maindish'],
                )
        element = elements.Element(
                title=qd['Name'],
                item_url=qd['URL'],
                image_url=qd['Pic'],
                subtitle=qd['dish'],
                buttons=[
                    # web_button,
                    postback_button,
                ],
                )

        return element

    def _send_carousel(self, elements):
        generic_template = templates.GenericTemplate(
                elements=elements
                )
        attachment = attachments.TemplateAttachment(template=generic_template)

        message = messages.Message(attachment=attachment)
        request = messages.MessageRequest(self.recipient, message)
        self.messenger.send(request)
Example #14
0
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from messengerbot import MessengerClient, messages, attachments, templates, elements
import json, wikipedia, urllib, os
from chatbot import Chat, register_call

ACCESS_TOKEN = 'EAAJJC9XzVbABAE8X09HE4lv3HcGu43SkLlHPEGtEktIhivLsDfIeoOEGmCCjn0Uqd42jyLmiGIRRZAGUkfoQXD7X8I65ETb4rHf6BWdD9zOGgZCSKVlwt0Y9AgyZBAIQq0oXC73HOzL1p16D4NJF5gLBGYGzNdS9fs2aCfD4QZDZD'
VALIDATION_TOKEN = "First Chatbot Demo"
API_KEY = "643265136383408"

messenger = MessengerClient(access_token=ACCESS_TOKEN)

@register_call('whoIs')
def who_is(query, session_id):
    try:
        return wikipedia.summary(query)
    except Exception:
        for newquery in wikipedia.search(query):
            try:
                return wikipedia.summary(newquery)
            except Exception:
                pass
    return "I don't know about " + query

@csrf_exempt
def webhook(request):
    if request.method != "POST":
        if request.GET['hub.verify_token'] == VALIDATION_TOKEN:
            return HttpResponse(request.GET['hub.challenge'])
        return HttpResponse("Failed validation. Make sure the validation tokens match.")
    return chathandler(request)
Example #15
0
 def init_bot(self):
     self._bot = MessengerClient(self.token)
Example #16
0
class MessengerBot(IntegrationBot):
    """
    Facebook Messenger integration. 
    
    Permabots only uses Page Access Token but webhook is not set. It mus be set manually in Facebook dev platform using 
    UUID generated as id of the messenger bot after creation in Permabots.
    
    This bot is used to Verify Token and  generate url https://domain/processing/messengerbot/permabots_messenger_bot_id/
    
    Read Messenger documentation `<https://developers.facebook.com/docs/messenger-platform/quickstart>` _.
    """
    token = models.CharField(_('Messenger Token'),
                             max_length=512,
                             db_index=True)

    class Meta:
        verbose_name = _('Messenger Bot')
        verbose_name_plural = _('Messenger Bots')

    def __init__(self, *args, **kwargs):
        super(MessengerBot, self).__init__(*args, **kwargs)
        self._bot = None
        self.webhook = False
        if self.token:
            self.init_bot()

    def __str__(self):
        return "%s" % self.token

    def __repr__(self):
        return "(%s, %s)" % (self.id, self.token)

    def init_bot(self):
        self._bot = MessengerClient(self.token)

    def set_webhook(self, url):
        # Url is set in facebook dashboard. Just subscribe
        self._bot.subscribe_app()

    @property
    def hook_url(self):
        return 'permabots:messengerbot'

    @property
    def hook_id(self):
        return str(self.id)

    @property
    def null_url(self):
        # not used
        return "https://example.com"

    @property
    def identity(self):
        return 'messenger'

    def message_text(self, message):
        return message.data

    def get_chat_state(self, message):
        try:
            return MessengerChatState.objects.select_related('state').get(
                chat=message.sender, state__bot=self.bot)
        except MessengerChatState.DoesNotExist:
            return None

    def build_keyboard(self, keyboard):
        def traverse(o, tree_types=(list, tuple)):
            if isinstance(o, tree_types):
                for value in o:
                    for subvalue in traverse(value, tree_types):
                        yield subvalue
            else:
                yield o

        built_keyboard = None
        if keyboard:
            # same payload as title
            built_keyboard = [
                PostbackButton(element[0:20], element)
                for element in traverse(ast.literal_eval(keyboard))
            ]
        return built_keyboard

    def create_chat_state(self, message, target_state, context):
        MessengerChatState.objects.create(chat=message.sender,
                                          state=target_state,
                                          ctx=context)

    def get_chat_id(self, message):
        return message.sender

    def send_message(self,
                     chat_id,
                     text,
                     keyboard,
                     reply_message=None,
                     user=None):
        texts = text.strip().split('\\n')
        msgs = []
        for txt in texts:
            for chunk in textwrap.wrap(txt, 320):
                msgs.append(messages.Message(text=chunk))

        if keyboard:
            if len(msgs[-1].text) <= 45:
                title = msgs.pop().text
            else:
                new_texts = textwrap.wrap(msgs[-1].text, 45)
                msgs[-1].text = " ".join(new_texts[:-1])
                title = new_texts[-1]
            elements = []
            for chunk_buttons, last in self.batch(keyboard[0:30], 3):
                elements.append(Element(title=title, buttons=chunk_buttons))
            generic_template = GenericTemplate(elements)
            attachment = TemplateAttachment(generic_template)
            msgs.append(messages.Message(attachment=attachment))

        for msg in msgs:
            try:
                logger.debug("Message to send:(%s)" % msg.to_dict())
                recipient = messages.Recipient(recipient_id=chat_id)
                self._bot.send(messages.MessageRequest(recipient, msg))
                logger.debug("Message sent OK:(%s)" % msg.to_dict())
            except:
                exctype, value = sys.exc_info()[:2]
                logger.error("Error trying to send message:(%s): %s:%s" %
                             (msg.to_dict(), exctype, value))
Example #17
0
from pprint import pprint

# Vendors
# https://github.com/geeknam/messengerbot
from messengerbot import MessengerClient, messages, attachments, templates, elements

import api_tools as api
import db_tools as db
from Criteria import Criteria
import wit_handler as wit

# "Constants" (variables that should not change)
RESULTS_LIMIT = 3

# Initializing client
messenger = MessengerClient(access_token=os.getenv('FB_PAGE_TOKEN'))


def send_facebook_message(fbid, data):
    """
    TODO: write description
    """
    if 'storyline' in data:
        store_storyline(fbid, data["storyline"])
    if 'criteria' in data and data["criteria"]:
        store_criteria(fbid, data["criteria"])
    if 'action' in data:
        if data["action"] == 'api_call':
            handle_api_call(fbid)
        elif data["action"] == 'reset':
            reset_search(fbid)
Example #18
0
# Create your views here.

from messengerbot import MessengerClient, messages, attachments, templates, elements
import json,wikipedia,urllib,os
from chatbot import Chat, register_call
from .models import *
from django.db.utils import OperationalError


access_token = `< Access token >`
VALIDATION_TOKEN= `< VALIDATION_TOKEN >`
api_key = `< API key >`


# Manully initialise client
messenger = MessengerClient(access_token=access_token)

def index(request):
    return render(request,"home.html")


def about(query,qtype=None):
    service_url = 'https://kgsearch.googleapis.com/v1/entities:search'
    params = {
        'query': query,
        'limit': 10,
        'indent': True,
        'key': api_key,
    }
    url = service_url + '?' + urllib.urlencode(params)
    response = json.loads(urllib.urlopen(url).read())
Example #19
0
from messengerbot import MessengerClient, messages, attachments, templates, elements

# Manully initialise client
messenger = MessengerClient(
    access_token=
    'EAADrcnA0YAIBAMfwcg2wUmk6BG2IHZAthghXZBqYwE4Arb5uYz8M7foLlm1cfPsNdlj8JIlNmE8n7isZCAhn2b7ZChWoJxyentZC5aqRtIMfR4ich'
)

# With env var export MESSENGER_PLATFORM_ACCESS_TOKEN=your_token
from messengerbot import messenger

recipient = messages.Recipient(recipient_id='123')

# Send text message
message = messages.Message(text='Hello World')
request = messages.MessageRequest(recipient, message)
messenger.send(request)

# Send button template
web_button = elements.WebUrlButton(title='Show website',
                                   url='https://petersapparel.parseapp.com')
postback_button = elements.PostbackButton(title='Start chatting',
                                          payload='USER_DEFINED_PAYLOAD')
template = templates.ButtonTemplate(text='What do you want to do next?',
                                    buttons=[web_button, postback_button])
attachment = attachments.TemplateAttachment(template=template)

message = messages.Message(attachment=attachment)
request = messages.MessageRequest(recipient, message)
messenger.send(request)