def ask_user_for_origin(user_id, savedHome, savedUniversity): recipient = messages.Recipient(user_id) if savedHome: home_location_button = elements.PostbackButton(title=savedHome, payload="useSavedHome") if savedUniversity: university_location_button = elements.PostbackButton( title=savedUniversity, payload="useSavedUniversity") other_location_button = elements.PostbackButton(title="Other", payload="useOtherLocation") if savedHome and savedUniversity: template = templates.ButtonTemplate(text="What about for your origin?", buttons=[ home_location_button, university_location_button, other_location_button ]) elif savedHome: template = templates.ButtonTemplate( text="What about for your origin?", buttons=[home_location_button, other_location_button]) elif savedUniversity: template = templates.ButtonTemplate( text="What about for your origin?", buttons=[university_location_button, other_location_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return
def respond_to_client(sender_id, message): recipient = messages.Recipient(recipient_id=sender_id) result = chat.respond(message, session_id=sender_id) response = messages.MessageRequest(recipient, messages.Message(text=result)) # send message to Messenger messenger.send(response)
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))
def askUserForDestination(user_id, savedHome, savedUniversity): recipient = messages.Recipient(user_id) if savedHome: home_location_button = elements.PostbackButton(title=savedHome, payload="useSavedHome") if savedUniversity: university_location_button = elements.PostbackButton( title=savedUniversity, payload="useSavedUniversity") other_location_button = elements.PostbackButton(title="Other", payload="useOtherLocation") if savedHome and savedUniversity: template = templates.ButtonTemplate( text= "Would you like to use a previous location as your destination?", buttons=[ home_location_button, university_location_button, other_location_button ]) elif savedHome: template = templates.ButtonTemplate( text= "Would you like to use a previous location as your destination?", buttons=[home_location_button, other_location_button]) elif savedUniversity: template = templates.ButtonTemplate( text= "Would you like to use a previous location as your destination?", buttons=[university_location_button, other_location_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return
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'})
def handle_api_call(fbid): """ TODO: write description """ recipient = messages.Recipient(recipient_id=fbid) text = "" criteria_data = db.get_criteria_data_by_id(fbid) if criteria_data is not None: wine_list = api.build_wine_list(criteria_data, RESULTS_LIMIT) text = "Voici les meilleurs vins présentants les critères recherchés :\n".decode( 'utf-8') res = "" for wine in wine_list: res += "- " res += wine.get_name().decode('utf-8') res += ", " + wine.get_appellation().decode('utf-8').upper() res += " (" + str(wine.get_vintage()) + ")" res += ", " + str(wine.get_price()) + " euros" res += " (score : " + str(wine.get_global_score()) + ")" res += "\n" pprint(wine_list) if not res: res = "Aucun vin ne correspond à votre recherche".decode('utf-8') text += res else: text = "Une erreur s'est produite" message = messages.Message(text=text) request = messages.MessageRequest(recipient, message) messenger.send(request)
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'})
def handle_text(fbid, data): """ Handles the sending to messenger of a text message """ recipient = messages.Recipient(recipient_id=fbid) if (data["api_call"] == False): message = messages.Message(text=data["text"]) request = messages.MessageRequest(recipient, message) messenger.send(request) else: criteria = data["criteria"] criteria_list = [] for criterion in criteria: crit = Criteria(criterion["name"], criterion["value"]) criteria_list.append(crit) wine_list = api.get_wines_by_criteria(criteria_list) text = "" for wine in wine_list: text += wine.get_name().decode('utf-8') text += "," + wine.get_appellation().decode('utf-8') text += "," + str(wine.get_vintage()) text += "\n" pprint(wine_list) if not text: text = 'Aucun vin de correspond à votre recherche' message = messages.Message(text=text) request = messages.MessageRequest(recipient, message) messenger.send(request)
def start_over(user_id, context): global user_conversations user_dictionary = next(item for item in user_conversations if item["recipient"]['id'] == user_id) user_dictionary['context'] = {} user_dictionary['payment'] = { "name": "", "cardNumber": "", "phoneNumber": "", "email": "", "address": "", "railcard": "" } recipient = messages.Recipient(user_id) buy_tickets_button = elements.PostbackButton(title="Buy Tickets", payload="buyTickets") help_button = elements.PostbackButton(title="Display Help", payload="displayHelp") template = templates.ButtonTemplate( text="Is there anything else I can help you with?", buttons=[buy_tickets_button, help_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def ask_ticket_speed_references(user_id, context): global user_conversations user_dictionary = next(item for item in user_conversations if item["recipient"]['id'] == user_id) recipient = messages.Recipient(user_id) if 'returnTime' in context: if user_dictionary['ticketPreference'] == "": cheaper_button = elements.PostbackButton( title="Cheaper", payload="ticketPreferenceCheaper") sweet_spot_button = elements.PostbackButton( title="Sweet Spot", payload="ticketPreferenceSweetSpot") faster_button = elements.PostbackButton( title="Faster", payload="ticketPreferenceFaster") template = templates.ButtonTemplate( text="What are your ticket preferences?", buttons=[cheaper_button, sweet_spot_button, faster_button]) else: use_old_preference_button = elements.PostbackButton( title="Use " + user_dictionary['ticketPreference'], payload="useOldTicketPreference") dont_use_old_preference_button = elements.PostbackButton( title="Change ticket prefs", payload="changePreferences") template = templates.ButtonTemplate( text="You have a saved preference. Would you like to use that?", buttons=[ use_old_preference_button, dont_use_old_preference_button ]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return context
def handle_error(fbid): """ Sends an error message to messenger """ recipient = messages.Recipient(recipient_id=fbid) message = messages.Message(text='Oups, une erreur est survenue.') request = messages.MessageRequest(recipient, message) messenger.send(request)
def handle_text(fbid, data): """ Handles the sending to messenger of a text message """ recipient = messages.Recipient(recipient_id=fbid) message = messages.Message(text=data["text"]) request = messages.MessageRequest(recipient, message) messenger.send(request)
def chathandler(request): data = json.loads(request.body) sender_id = data["entry"][0]["messaging"][0]["sender"]["id"] recipient = messages.Recipient(recipient_id=sender_id) for i in data["entry"][0]["messaging"]: if "message" in i: if not sender_id in chat.conversation: initiateChat() respondToClient(sender_id, i["message"]["text"]) return HttpResponse("It's Working")
def respond_to_client(sender_id,message): recipient = messages.Recipient(recipient_id=sender_id) chat.attr[sender_id]={"match":None,"pmatch":None,"_quote": False} chat.conversation[sender_id].append(message) message = message.rstrip(".! \n\t") result = chat.respond(message,session_id=sender_id) chat.conversation[sender_id].append(result) response = messages.MessageRequest(recipient, messages.Message(text=result)) #send message to Messenger messenger.send(response) del chat.attr[sender_id]
def send_yes_no_template(user_id): recipient = messages.Recipient(user_id) yes_button = elements.PostbackButton(title="Yes", payload="yesConfirmation") no_button = elements.PostbackButton(title="No", payload="noConfirmation") template = templates.ButtonTemplate(text="Is this correct?", buttons=[yes_button, no_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def handle_welcome(fbid, received_message): recipient = messages.Recipient(recipient_id=fbid) red_button = elements.PostbackButton(title='Rouge', payload='Rouge') white_button = elements.PostbackButton(title='Blanc', payload='Blanc') rose_button = elements.PostbackButton(title='Rose', payload='Rose') template = templates.ButtonTemplate( text='Bonjour, quelle couleur de vin desirez-vous ?', buttons=[red_button, white_button, rose_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def ask_to_save_payment(user_id, context): recipient = messages.Recipient(user_id) yes_button = elements.PostbackButton(title="Yes", payload="yesPayment") no_button = elements.PostbackButton(title="No", payload="noPayment") template = templates.ButtonTemplate( text="Awesome. Would you like to save these details for next time?", buttons=[yes_button, no_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) pass
def ask_return_date(user_id, context): recipient = messages.Recipient(user_id) one_way_button = elements.PostbackButton(title="One way only", payload="oneWayTicket") template = templates.ButtonTemplate( text= "What date and time would you like to return? Please type if not one way.", buttons=[one_way_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return context
def send_single_or_return_template(user_id): recipient = messages.Recipient(user_id) single_button = elements.PostbackButton(title="Single", payload="singleTicket") return_button = elements.PostbackButton(title="Return", payload="returnTicket") template = templates.ButtonTemplate( text="Would you like a Single or a Return ticket?", buttons=[single_button, return_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def send_facebook_message(fbid, data): """ Calls the right function according to the data type """ recipient = messages.Recipient(recipient_id=fbid) if 'type' in data: if (data["type"] == "text"): handle_text(fbid, data) elif (data["type"] == "button"): handle_button(fbid, data) else: handle_error(fbid)
def ask_to_memorize_location(user_id, context): recipient = messages.Recipient(user_id) location_save_yes_button = elements.PostbackButton( title="Yes", payload="saveLocationConfirmedYes") location_save_no_button = elements.PostbackButton( title="No", payload="saveLocationConfirmedNo") template = templates.ButtonTemplate( text="Would you like to save this location?", buttons=[location_save_yes_button, location_save_no_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return context
def ask_for_railcard(user_id, context): recipient = messages.Recipient(user_id) young_persons_button = elements.PostbackButton(title="16-25 Railcard", payload="yesRailcard") other_button = elements.PostbackButton(title="Other", payload="otherRailcard") no_button = elements.PostbackButton(title="No", payload="noRailcard") template = templates.ButtonTemplate( text="One more thing: do you have a railcard?", buttons=[young_persons_button, other_button, no_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def ask_to_save_ticket_preferences(user_id, context): recipient = messages.Recipient(user_id) yes_button = elements.PostbackButton(title="Yes", payload="saveTicketPreferences") no_button = elements.PostbackButton(title="No", payload="doNotSaveTicketPreferences") template = templates.ButtonTemplate( text="Would you like to save your ticket preferences?", buttons=[yes_button, no_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return context
def handle_button(fbid, data): """ Handles the sending to messenger of a button template of postback buttons """ recipient = messages.Recipient(recipient_id=fbid) text = data["text"] button_list = [] for option in data["options"]: button_text = option["text"] button_payload = option["payload"] button_list.append( elements.PostbackButton(title=button_text, payload=button_payload)) template = templates.ButtonTemplate(text=text, buttons=button_list) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def ask_to_save_used_railcard(user_id, context): global user_conversations user_dictionary = next(item for item in user_conversations if item["recipient"]['id'] == user_id) recipient = messages.Recipient(user_id) yes_railcard_button = elements.PostbackButton(title="Yes", payload="yesSavedRailcard") no_railcard_button = elements.PostbackButton(title="No", payload="noRailcard") template = templates.ButtonTemplate( text="You have a saved railcard: " + user_dictionary['savedPayment']['railcard'] + ". Would you like to use it?", buttons=[yes_railcard_button, no_railcard_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request)
def ask_to_use_saved_payment(user_id, context): global user_conversations user_dictionary = next(item for item in user_conversations if item["recipient"]['id'] == user_id) recipient = messages.Recipient(user_id) use_saved_payment_button = elements.PostbackButton( title=user_dictionary['savedPayment']['email'], payload="useSavedPayment") dont_use_saved_payment_button = elements.PostbackButton( title="New email address", payload="enterNewPayment") template = templates.ButtonTemplate( text="You have a saved email address. Would you like to use that?", buttons=[use_saved_payment_button, dont_use_saved_payment_button]) attachment = attachments.TemplateAttachment(template=template) message = messages.Message(attachment=attachment) request = messages.MessageRequest(recipient, message) messenger.send(request) return context
def handle_incoming_messages(): # Preberemo poslano sporocilo (to je v obliki json) data = request.json # Odvisno od tipa sporocila se Branko razlicno odzove messageData = data['entry'][0]['messaging'][0] # Najdemo id uporabnika in ustvarimo objekt Recipient senderId = messageData['sender']['id'] recipient = messages.Recipient(recipient_id=senderId) if "message" in messageData: messageReceived(messageData, recipient) elif "postback" in messageData: postbackReceived(messageData, recipient) elif "account_linking" in messageData: accountLinkingReceived(messageData, recipient) return "ok"
def _build_messages(self, recipient_id, incoming): '''Constructs the response message according to the incoming message. Returns the messenger request.''' recipient = messages.Recipient(recipient_id=recipient_id) action = self.bot_ai.extract_action(recipient_id, incoming) if action.fulfillment: app.logger.info('Parsed action: fulfillment') items = [messages.Message(text=action.fulfillment)] elif action.name == 'history': app.logger.info('Parsed action: history, date: %s, year: %s', action.date.strftime('%-d %B %Y'), action.year) items = self._fetch_history(action.date, action.year) if not action.year: items = items[:3] else: app.logger.warning('Could not parse the action') items = [] return [messages.MessageRequest(recipient, item) for item in items]
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'} )
def test_get_user_profile(self, mock_get): mock_get.return_value.status_code = 200 mock_get.return_value.json.return_value = { "first_name": "Peter", "last_name": "Chang", "profile_pic": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/v/t1.0-1/p200x200/13055603_10105219398495383_8237637584159975445_n.jpg?oh=1d241d4b6d4dac50eaf9bb73288ea192&oe=57AF5C03&__gda__=1470213755_ab17c8c8e3a0a447fed3f272fa2179ce", "locale": "en_US", "timezone": -7, "gender": "male" } recipient = messages.Recipient(recipient_id='123') messenger_user_profile = users.MessengerUserProfile( access_token='1234', recipient=recipient) result = messenger_user_profile.get_user_profile() mock_get.assert_called_with( 'https://graph.facebook.com/v2.6/123', params={ 'access_token': '1234', 'fields': 'first_name,last_name,profile_pic,locale,timezone,gender' })