Facebook メッセンジャー プラットフォーム API を使用するための Python ライブラリ (Python Facebook チャット & チャットボット ライブラリ) Facebook メッセンジャー プラットフォーム API の全機能がサポートされています
pip install fbmq
ユーザーから Facebook ページへのメッセージを処理する方法
from flask import Flask , request
from fbmq import Page
page = Page ( PAGE_ACCESS_TOKEN )
@ app . route ( '/webhook' , methods = [ 'POST' ])
def webhook ():
page . handle_webhook ( request . get_data ( as_text = True ))
return "ok"
@ page . handle_message
def message_handler ( event ):
""":type event: fbmq.Event"""
sender_id = event . sender_id
message = event . message_text
page . send ( sender_id , "thank you! your message is '%s'" % message )
@ page . after_send
def after_send ( payload , response ):
""":type payload: fbmq.Payload"""
print ( "complete" )
仕様の詳細 - https://developers.facebook.com/docs/messenger-platform/webhook-reference
@page.handle_message
- このコールバックは、メッセージがページに送信されたときに発生します。 ( quick reply
もこちらで対応します)
@page.handle_echo
- このコールバックは、ページからメッセージが送信されたときに発生します。
@page.handle_delivery
- このコールバックは、ページが送信したメッセージが配信されたときに発生します。
@page.handle_optin
- このコールバックは、Send-to-Messenger プラグインがタップされたときに発生します
@page.handle_postback
- ポストバックは、ポストバック ボタン、開始ボタン、永続メニュー、または構造化メッセージがタップされたときに発生します。
@page.handle_read
- このコールバックは、ページが送信したメッセージがユーザーによって読み取られたときに発生します。
@page.handle_account_linking
- このコールバックは、リンクされたアカウントまたはアカウントのリンク解除のコールトゥアクションがタップされたときに発生します。
@page.after_send
- このコールバックは、page.send 関数が呼び出されたときに発生します。
event.sender_id
str : メッセージ送信者 ID、ユーザー ID
event.recipient_id
str : メッセージ受信者 ID、ページ ID
event.timestamp
番号: メッセージ受信時のタイムスタンプ
event.message
dict : 受信したメッセージの辞書。もっと詳しく
event.message_text
str : event.message.get('text')
event.message_attachments
str : event.message.get('attachments')
event.quick_reply
dict : 受信したクイック返信辞書。もっと詳しく
event.quick_reply_payload
str : `event.quick_reply.get('ペイロード')
event.postback
dict : 受信したポストバック辞書。もっと詳しく
event.postback_payload
str : `event.postback.get('ペイロード')
event.optin
dict : 受信した辞書。もっと詳しく
event.account_linking
dict : 受信した辞書。もっと詳しく
event.delivery
dict : 受信した辞書。もっと詳しく
event.read
dict : 受信した辞書。もっと詳しく
event.is_*
bool - イベント タイプが有効な場合は True
page = fbmq . Page ( PAGE_ACCESS_TOKEN , after_send = after_send )
@ app . route ( '/webhook' , methods = [ 'POST' ])
def webhook ():
page . handle_webhook ( request . get_data ( as_text = True ),
message = message_handler )
return "ok"
def message_handler ( event ):
""":type event: fbmq.Event"""
sender_id = event . sender_id
message = event . message_text
page . send ( sender_id , "thank you! your message is '%s'" % message )
def after_send ( payload , response ):
""":type event: fbmq.Payload"""
print ( "complete" )
Facebookページからユーザーにメッセージを送信する方法
from fbmq import Attachment , Template , QuickReply , Page
page . send ( recipient_id , "hello world!" )
jpg、png、gifのサポート
page . send ( recipient_id , Attachment . Image ( image_url ))
page . send ( recipient_id , Attachment . Audio ( audio_url ))
page . send ( recipient_id , Attachment . Video ( video_url ))
page . send ( recipient_id , Attachment . File ( file_url ))
quick_replies = [
QuickReply ( title = "Action" , payload = "PICK_ACTION" ),
QuickReply ( title = "Comedy" , payload = "PICK_COMEDY" )
]
# you can use a dict instead of a QuickReply class
#
# quick_replies = [{'title': 'Action', 'payload': 'PICK_ACTION'},
# {'title': 'Comedy', 'payload': 'PICK_COMEDY'}]
page . send ( recipient_id ,
"What's your favorite movie genre?" ,
quick_replies = quick_replies ,
metadata = "DEVELOPER_DEFINED_METADATA" )
クイック返信コールバック メソッドを簡単に定義できます。
@ page . callback ([ 'PICK_ACTION' , 'PICK_COMEDY' ])
def callback_picked_genre ( payload , event ):
print ( payload , event )
# Also supported regex, it works corretly
# @page.callback(['PICK_(.+)'])
ボタンのポストバックを使用せずに、quick_reply コールバックのみを処理したい場合
@ page . callback ([ 'PICK_ACTION' , 'PICK_COMEDY' ], types = [ 'QUICK_REPLY' ])
page . typing_on ( recipient_id )
page . typing_off ( recipient_id )
buttons = [
Templates . ButtonWeb ( "Open Web URL" , "https://www.oculus.com/en-us/rift/" ),
Templates . ButtonPostBack ( "trigger Postback" , "DEVELOPED_DEFINED_PAYLOAD" ),
Templates . ButtonPhoneNumber ( "Call Phone Number" , "+16505551234" )
]
# you can use a dict instead of a Button class
#
# buttons = [{'type': 'web_url', 'title': 'Open Web URL', 'value': 'https://www.oculus.com/en-us/rift/'},
# {'type': 'postback', 'title': 'trigger Postback', 'value': 'DEVELOPED_DEFINED_PAYLOAD'},
# {'type': 'phone_number', 'title': 'Call Phone Number', 'value': '+16505551234'}]
page . send ( recipient_id , Template . Buttons ( "hello" , buttons ))
ボタンのポストバック メソッドを簡単に定義できます (ポストバック タイプのボタンのみ機能します)。
@ page . callback ([ 'DEVELOPED_DEFINED_PAYLOAD' ])
def callback_clicked_button ( payload , event ):
print ( payload , event )
# Also supported regex, it works corretly
# @page.callback(['DEVELOPED_DEFINE(.+)'])
Quick_reply コールバックを使用せずにボタンのポストバックのみを処理したい場合
@ page . callback ([ 'DEVELOPED_DEFINED_PAYLOAD' ], types = [ 'POSTBACK' ])
page . send ( recipient_id , Template . Generic ([
Template . GenericElement ( "rift" ,
subtitle = "Next-generation virtual reality" ,
item_url = "https://www.oculus.com/en-us/rift/" ,
image_url = CONFIG [ 'SERVER_URL' ] + "/assets/rift.png" ,
buttons = [
Template . ButtonWeb ( "Open Web URL" , "https://www.oculus.com/en-us/rift/" ),
Template . ButtonPostBack ( "tigger Postback" , "DEVELOPED_DEFINED_PAYLOAD" ),
Template . ButtonPhoneNumber ( "Call Phone Number" , "+16505551234" )
]),
Template . GenericElement ( "touch" ,
subtitle = "Your Hands, Now in VR" ,
item_url = "https://www.oculus.com/en-us/touch/" ,
image_url = CONFIG [ 'SERVER_URL' ] + "/assets/touch.png" ,
buttons = [
Template . ButtonWeb ( "Open Web URL" , "https://www.oculus.com/en-us/rift/" ),
Template . ButtonPostBack ( "tigger Postback" , "DEVELOPED_DEFINED_PAYLOAD" ),
Template . ButtonPhoneNumber ( "Call Phone Number" , "+16505551234" )
])
]))
element = Template . ReceiptElement ( title = "Oculus Rift" ,
subtitle = "Includes: headset, sensor, remote" ,
quantity = 1 ,
price = 599.00 ,
currency = "USD" ,
image_url = CONFIG [ 'SERVER_URL' ] + "/assets/riftsq.png"
)
address = Template . ReceiptAddress ( street_1 = "1 Hacker Way" ,
street_2 = "" ,
city = "Menlo Park" ,
postal_code = "94025" ,
state = "CA" ,
country = "US" )
summary = Template . ReceiptSummary ( subtotal = 698.99 ,
shipping_cost = 20.00 ,
total_tax = 57.67 ,
total_cost = 626.66 )
adjustment = Template . ReceiptAdjustment ( name = "New Customer Discount" , amount = - 50 )
page . send ( recipient_id , Template . Receipt ( recipient_name = 'Peter Chang' ,
order_number = '1234' ,
currency = 'USD' ,
payment_method = 'Visa 1234' ,
timestamp = "1428444852" ,
elements = [ element ],
address = address ,
summary = summary ,
adjustments = [ adjustment ]))
notification_type をオプションとしてサポート
NotificationType.REGULAR (default)
、 NotificationType.SILENT_PUSH
、 NotificationType.NO_PUSH
page.send(recipient_id, 'hello', notification_type=NotificationType.NO_PUSH)
各page.send
にコールバック関数を設定できます。
def callback(payload, response):
print('response : ' + response.text)
page.send(recipient_id, 'hello', callback=callback)
page . greeting ( "Welcome!" )
page . show_starting_button ( "START_PAYLOAD" )
@ page . callback ([ 'START_PAYLOAD' ])
def start_callback ( payload , event ):
print ( "Let's start!" )
page . show_persistent_menu ([ Template . ButtonPostBack ( 'MENU1' , 'MENU_PAYLOAD/1' ),
Template . ButtonPostBack ( 'MENU2' , 'MENU_PAYLOAD/2' )])
@ page . callback ([ 'MENU_PAYLOAD/(.+)' ])
def click_persistent_menu ( payload , event ):
click_menu = payload . split ( '/' )[ 1 ]
print ( "you clicked %s menu" % click_menu )
page_id = page.page_id
page_name = page.page_name
user_profile = page.get_user_profile(event.sender_id) # return dict
print(user_profile)
#{"first_name":"...", "last_name":"...", "profile_pic":"...", "locale":"...", "timezone":9, "gender":"..."}
cd example
virtualenv env
source env/bin/activate
pip install -r requirements.txt
python server.py