ไลบรารี Python สำหรับการใช้แพลตฟอร์ม Facebook Messenger API (Python Facebook Chat & Chatbot Library) รองรับคุณสมบัติเต็มรูปแบบของแพลตฟอร์ม Facebook Messenger
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
- Postbacks เกิดขึ้นเมื่อแตะปุ่ม Postback, ปุ่มเริ่มต้นใช้งาน, เมนูถาวร หรือข้อความที่มีโครงสร้าง
@page.handle_read
- การโทรกลับนี้จะเกิดขึ้นเมื่อผู้ใช้อ่านข้อความที่เพจส่งไปแล้ว
@page.handle_account_linking
- การติดต่อกลับนี้จะเกิดขึ้นเมื่อคำกระตุ้นการตัดสินใจของบัญชีที่เชื่อมโยงหรือยกเลิกการเชื่อมโยงบัญชีถูกแตะ
@page.after_send
- การโทรกลับนี้จะเกิดขึ้นเมื่อเรียกใช้ฟังก์ชัน page.send
event.sender_id
str : รหัสผู้ส่งข้อความ, รหัสผู้ใช้
event.recipient_id
str : รหัสตัวรับข้อความ, รหัสเพจ
event.timestamp
number : เวลาประทับเมื่อได้รับข้อความ
event.message
dict : ข้อความ dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.message_text
str : event.message.get('text')
event.message_attachments
str : event.message.get('attachments')
event.quick_reply
dict : dict ตอบกลับด่วนที่ได้รับ รายละเอียดเพิ่มเติม
event.quick_reply_payload
str : `event.quick_reply.get('เพย์โหลด')
event.postback
dict : postback dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.postback_payload
str : `event.postback.get('เพย์โหลด')
event.optin
dict : dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.account_linking
dict : dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.delivery
dict : dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.read
dict : dict ที่ได้รับ รายละเอียดเพิ่มเติม
event.is_*
bool - เป็นจริงหากประเภทเหตุการณ์ถูกต้อง
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_(.+)'])
หากคุณต้องการจัดการเฉพาะการโทรกลับแบบรวดเร็ว_ตอบกลับโดยไม่มีปุ่ม postback
@ 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 ))
คุณสามารถกำหนดวิธี postback ของปุ่มได้อย่างง่ายดาย (ใช้ได้เฉพาะปุ่มประเภท postback เท่านั้น)
@ page . callback ([ 'DEVELOPED_DEFINED_PAYLOAD' ])
def callback_clicked_button ( payload , event ):
print ( payload , event )
# Also supported regex, it works corretly
# @page.callback(['DEVELOPED_DEFINE(.+)'])
หากคุณต้องการจัดการเฉพาะ postback ของปุ่มโดยไม่มีการโทรกลับอย่างรวดเร็ว
@ 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 ]))
รองรับการแจ้งเตือน_ประเภทเป็นตัวเลือก
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