facebook_messenger_php
facebook_messenger_php copied to clipboard
Looking for a new owner - A PHP Facebook Messenger library to both receive and send messages
Currently abandoned - Please use Marcel's Botman.io (its much better)
Facebook Messenger PHP Wrapper
This package is a wrapper around the majority of the functionality of the Facebook Messenger platform. A list of features not yet implemented is below.
This package is still in development; so please do submit pull requests / issues you are having.
Installation
Just use compser to bring it in.
composer require davidpiesse/facebook_messenger_php
Currently we are in dev mode so you may need to set minimum-stability:"dev"
in your composer.json
Demo
A demo project (Laravel based) is here In the meantime you can interact with a demo ChatBot created using this wrapper.
Search for @laravelmessengerbot in Facebook messenger and you can test a load of the function. Or go here https://www.facebook.com/laravelmessengerbot/
Todo
Things still to implement
- User Profile
- All Airline Templates
- Sending of a file stream
- Payments
Current dependencies are GuzzleHttp/Guzzle, rappasoft/laravel-helpers and illuminate/http. These allow the package to make easy requests to the FB Messenger API and also deal with arrays in a super amazing way.
License
MIT
Who to call for help
Just add an issue or send me an email at piesse [at] gmail [dot] com or on Twitter @mapdev
#Sending Messages
Usage
To send messages to a user create an instance of the Messenger class and insert your token
$messenger = new Messenger($token);
and then to send a text message
$messenger->sendMessage(new TextMessage('Foo Bar'),'recipient_id');
Still writing this...
Incoming Webhook
For Facebook Messenger you provide a webhook URL for their API to contact your server when certain events occur. -Link-
Most of these revolve around incoming messages from a user; be it a text message, attachment, postback etc. these are all handled by the Callback object.
Pass in an array of data from the post request {in Laravel use $request->all()
}
$callback = new Callback($request->all());
The data incoming should look similar to this
{
"object":"page",
"entry":[
{
"id":"PAGE_ID",
"time":1458692752478,
"messaging":[
{
"sender":{
"id":"USER_ID"
},
"recipient":{
"id":"PAGE_ID"
},
...
}
]
}
]
}
The $callback
object parses all this information and allows you to easily retrieve it and determine what to do with it.
Structure
Below is a guide on how to find the data you want in the Callback object
Within a normal Facbook Webhook POST request are two top level parameters:
+object
(always = 'page'
)
+entry
(almost always one & a collection of Entry
objects)
To get at the data you must iterate $callback->entries
to make sure you do not miss a batch of messages.
The Callback also has three methods textMessages()
, postbackMessages()
, and attachmentMessages()
. These give you quick access to an array of EntryMessages
of these specific types.
Within an 'entry' are a couple of properties and a array of EntryMessages
-
id
(Page ID) -
time
(Timestamp) -
messaging
(Array of entry messages)
Entry
has the first two properties plus a message
array (Laravel Collection).
This is the array of EntryMessages
.
This array of entry messages is where all the real information is.
There are two main parts to it. THe shell (EntryMessage) contains the sender_id
and recipient_id
along with a timestamp
.
It also provides you a set of boolean return methods to determine what type of message it is.
-
isText()
-
isPostback()
-
isRead()
-
isDelivered()
-
isAuthentication()
-
isAccountLinking()
-
isEcho()
Each of these allow you to filter the type of message it is and access its $entry_message->message
or other dynamic property appropriately.
Read
If the message is of type Read then $entry_message->read
is set and is of type Read
Properties
-
watermark
-
seq
Delivered
If the message is of type Read then $entry_message->delivery
is set and is of type Delivered
Properties
-
watermark
-
seq
-
mids[]
Authentication
If the message is of type Read then $entry_message->authentication
is set and is of type Authentication
Properties
-
ref
Account Linking
If the message is of type Read then $entry_message->account_linking
is set and is of type AccountLinking
Properties
-
status
-
authorization_token
-
linked
(bool) -
unlinked
(bool)
Postback
If the message is of type Read then $entry_message->postback
is set and is of type POstback
Properties
-
payload
Message
If the message is of type Read then $entry_message->message
is set and is of type Message
Properties
-
mid
-
seq
-
isText
(bool) -
isSticker
(bool) -
hasAttachments
(bool) -
text
-
quick_reply
-
attachments[]
Echo
The same as $entry_message->message
except with some more properties attached.
Additional Properties
-
app_id
-
mid
-
metadata
(bool) -
seq
(bool)
Examples
Here are some code snippets to get you started
//create a callback object
$callback = new Callback($request->all())
//get all textmessages from the callback (regardless of entry or EntryMessage)
$textmessages = $callback->textMessages(); //returns Entry Message collection
//check if EntryMessage $entrymessage is a postback and return the payload string
if($entrymessage->isPostback)
return $entrymessage->postback->payload;
//get URL of an image attachment sent to you 0- assuming onely one attachment and entry etc.
if($entrymessage->isMessage){
if($entrymessage->message->hasAttachments && ($entrymessage->message->attachments[0]->isImage){
$image_url = $entrymessage->message->attachments[0]->url;
}
}
As Laravel Collection is iuncluded it is a great way to delve into your callback easily
$callback = new Callback($request->all())
$callback->entries->each(function ($entry){
//for each entry access their entry messages
$entry->messages->each(function($entrymessage){
//get sender_id to send a message back
$sender_id = $entrymessage->sender_id;
//for each entry message check is a postback or a message
if($entrymessage->isPostback){
//Do something with the postback
$payload = $entrymessage->postback->payload;
}else if($entrymessage->isMessage){
//do somethingwith the message
$message = $entrymessage->message;
}
});
});