Search code examples
phpfacebookfacebook-graph-apifacebook-php-sdkfetch

Get latest Facebook posts of page with PHP SDK


The following code is inside a file called facebook_posts.php which I call from my index file like so: <?php require_once("http://www.example.com/design/php/facebook_posts.php"); ?>. However, where this code is put, there is no response. So neither success, nor the catch errors return an error (as I see it). I tried absolute URLs, but that didn't work either. (I hid the api and page information.) Apparently the content that follows the require_once (footer and scripts) aren't loaded. Something seems to go wrong when including the SDK.

I'm not using composer, do I need to require the Facebook\ files or use them? And which ones do I need for retrieving posts from a page?

<?php
// Defining FB SDK with absolute paths
define('FACEBOOK_SDK_V4_SRC_DIR', 'http://example.com/design/Facebook/');
require 'http://example.com/design/php/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;

FacebookSession::setDefaultApplication('{my-app-id}','{my-app-secret}');

$session = new FacebookSession('{my-long-lived-access-token}');

// Get the GraphUser object for the current user:

try {
$request = new FacebookRequest(
  $session,
  'GET',
  '/{my-page-id}/feed'
);
$response = $request->execute();
$graphObject = $response->getGraphObject();

var_dump($graphObject);
echo graphObject;
echo "banana";

} catch (FacebookRequestException $e) {
  echo "API ERROR";
} catch (\Exception $e) {
  echo "other error";
}

?>

EDIT: so I just required in all the FB files, and that seems to work. However, I don't know how to traverse/iterate the object that is returned. I.e. how to loop through the different posts (the four latest posts by the page) and echo them in HTML. A base structure would look like this:

<time>{publish date}</time>
<p>{post message}</p>
<a href="{link to included url}">{title to included url}</a>

Solution

  • You need to use a long-lived page access-token.

    Page Access Token

    These access tokens are similar to user access tokens, except that they provide permission to APIs that read, write or modify the data belonging to a Facebook Page. To obtain a page access token you need to start by obtaining a user access token and asking for the manage_pages permission. Once you have the user access token you then get the page access token via the Graph API.

    As @CBroe said, you should not use that access token in client-side code as it is secret/private and you don't want anyone to get it.

    So for what you want to do, Javascript is not the right choice. You will have to use some server-side code, like PHP, Python or Ruby to get the posts. If that is clear, here is how you can create it.


    1. Create a Facebook app:

      • keep the app id (1) and app secret (2) aside,
      • in the "advanced" settings, activate OAuth in order to avoid The application has disabled OAuth client flow.
    2. You need to create a user access token.

      • go on the Graph API Explorer and select the application you just created,
      • generate an access token: click "Get access token" and tick manage_pages in the "Extended Permissions" tab.
    3. Get your short-lived page access token.

      • still in the Graph API explorer, query me/accounts (GET),
      • find your page and get its access token (3).
    4. Get your long-lived page access token.

      • in your browser, paste https://graph.facebook.com/oauth/access_token?client_id=(1)&client_secret=(2)&grant_type=fb_exchange_token&fb_exchange_token=(3) in the address bar,
      • replace (1), (2) and (3) by your app id, your app secret and your page access token,
      • get your new long-lived access token from the result: access_token=FAKECAALBygJ4juoBAJyb8Cbq9bvwPYQwIaX53fLTMAWZCmDan1netI30khjITZAqcw9uE0lRT4ayWGm2ZCS7s7aZCVhF3ei6m0fuy2AkTkwmzUiJI4NUOZAyZAzuL,
      • use the Access Token Debugger to verify that your access token will never expire.

    Now you can use that new access token to retrieve the posts of your page:

    $session = new FacebookSession('FAKECAALBygJ4juoBAJyb8Cbq9bvwPYQwIaX53fLTMAWZCmDan1netI30khjITZAqcw9uE0lRT4ayWGm2ZCS7s7aZCVhF3ei6m0fuy2AkTkwmzUiJI4NUOZAyZAzuL');
    
    try {
        $data = (new FacebookRequest(
            $session, 'GET', '/me/posts'
        ))->execute()->getGraphObject()->getPropertyAsArray("data");
    
        foreach ($data as $post){
            $postId = $post->getProperty('id');
            $postMessage = $post->getProperty('message');
            print "$postId - $postMessage <br />";
        }
    } catch (FacebookRequestException $e) {
        // The Graph API returned an error
    } catch (\Exception $e) {
        // Some other error occurred
    }