loading

How to Fetch User Posts from Facebook Timeline with Graph API using PHP

How to Fetch User Posts from Facebook Timeline with Graph API using PHP

How to Fetch User Posts from Facebook Timeline with Graph API using PHP

0 Sales

Free

The Facebook PHP SDK makes it simple to use the Facebook API. The PHP SDK assists in authenticating and logging in using a Facebook account on a web application. Following authentication, different information from the user's Facebook account may be retrieved via the Graph API. The Facebook Graph API is extremely handy for retrieving profile data and feeds from a user's timeline.

If you want to improve the Facebook OAuth capability and acquire more information from the FB account, the Graph API is your best bet. Following Facebook authentication, you may obtain the user's profile and posts data from their account. In this article, we will teach you how to use PHP to retrieve a user post from the Facebook timeline using the Graph API.

The following PHP functionality will be provided in this Facebook post parser script.

 - Using the PHP SDK v5, sign in with Facebook.
 - Using the Graph API, retrieve profile information from Facebook.
 - Using the Graph API, get the user's posts from their Facebook Timeline.

Take a look at the file structure before you start reading Facebook posts from the user timeline using PHP.

facebook_user_post_feed_php/
├── config.php
├── index.php
├── logout.php
├── User.class.php
├── facebook-php-graph-sdk/
├── images/
│   ├── fb-login-btn.png
└── css/
    └── style.css

 

Create Facebook App

To use the Facebook API, you must have an App ID and an App Secret. Create a Facebook APP in the Developers Panel to generate the App ID and Secret.

1. Log in to Facebook for Developers with your Facebook account.
2. Click My Apps in the top navigation menu and then Add New App.
 - Fill in the Display Name and Contact Email fields.
 - Select the Create App ID option.
 - You will be taken to the App Dashboard.
3. Navigate to the Basic » Settings page.
 - Set the App Domains and choose the Category for your App.
 - Click the Save Changes button.

4. Click the PRODUCTS(+) link on the left navigation menu panel to get to the Add a Product page.

 - To Set Up, select Facebook Login.
 - Choose Web as the platform for your app.
 - Enter the Site URL and press the Save button.

5. Navigate to the Settings page for Facebook Login.

 - Enter the Redirect URL in the Valid OAuth Redirect URIs field.
 - Click the Save Changes button.

6. The App ID and App Secret will be visible on the Settings » Basic page. You may use this App ID and App secret to gain access to Facebook APIs.

Get Permission to Access Feed of Posts

To provide app access and receive the user's Facebook timeline posts, you must submit a user posts permission request.

 - Navigate to the App Review » Permissions and Features section.
 - Request user posts permission and provide the necessary details.

Once the review process is done and Facebook has authorised it, you will be able to retrieve user posts from the timeline using the Facebook Graph API.

Create Database Tables

In order to store the user's profile information and feed posts data in the database, two tables are necessary.

1. The following are examples: SQL generates a users table in the MySQL database with some basic columns to hold the account information from Facebook.

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `oauth_provider` enum('','facebook','google','twitter') COLLATE utf8_unicode_ci NOT NULL,
 `oauth_uid` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `first_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `last_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `gender` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 `picture` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
 `link` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

2. The following are examples SQL creates a user posts table in the MySQL database to hold the user's Facebook posts.

CREATE TABLE `user_posts` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `post_id` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `message` text COLLATE utf8_unicode_ci NOT NULL,
 `created_time` datetime NOT NULL,
 `published_by` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `attach_type` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `attach_title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `attach_image` text COLLATE utf8_unicode_ci NOT NULL,
 `attach_link` text COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Facebook SDK for PHP

To authenticate using the Facebook API, the Facebook PHP SDK is utilised. The Facebook PHP SDK (v5) files are located in the facebook-php-graph-sdk/ directory. It is not necessary to download it individually because the Facebook PHP SDK library is included in our source code.

Database and API Configuration (config.php)

The config.php file defines the database settings and Facebook API setup constant variables.

Constants in the database:

 - DB HOST – The database hostname.
 - DB USERNAME – Enter the database username here.
 - DB PASSWORD – Enter the database password here.
 - DB NAME – Enter the name of the database.
 - DB USER TBL – Enter the name of the table where the user's account data will be kept.
 - DB POST TBL – Enter the name of the table where the user's feed data will be saved.

Constants in the Facebook API:

 - FB APP ID – Enter the Facebook App ID here.
 - FB APP SECRET – Enter the Facebook App Secret here.
 - FB REDIRECT URL – Enter the Callback URL here.
 - FB POST LIMIT – The maximum number of posts that will be retrieved from the timeline and shown on the web page.

Call Facebook API:

To connect to the Facebook API and operate with the OAuth client, the PHP SDK library is utilised.

<?php 
/* 
 * Database and API Configuration 
 */ 
 
// Database configuration 
define('DB_HOST''MySQL_Database_Host'); 
define('DB_USERNAME''MySQL_Database_Username'); 
define('DB_PASSWORD''MySQL_Database_Password'); 
define('DB_NAME''MySQL_Database_Name'); 
define('DB_USER_TBL''users'); 
define('DB_POST_TBL''user_posts'); 
 
// Facebook API configuration 
define('FB_APP_ID''Insert_Facebook_App_ID'); // Replace {app-id} with your app id 
define('FB_APP_SECRET''Insert_Facebook_App_Secret'); // Replace {app-secret} with your app secret 
define('FB_REDIRECT_URL''Callback_URL');  
define('FB_POST_LIMIT'10); 
 
// Start session 
if(!session_id()){ 
    session_start(); 
} 
 
// Include the autoloader provided in the SDK 
require_once __DIR__ '/facebook-php-graph-sdk/autoload.php'; 
 
// Include required libraries 
use Facebook\Facebook; 
use Facebook\Exceptions\FacebookResponseException; 
use Facebook\Exceptions\FacebookSDKException; 
 
// Call Facebook API 
$fb = new Facebook(array( 
    'app_id' => FB_APP_ID, 
    'app_secret' => FB_APP_SECRET, 
    'default_graph_version' => 'v3.2', 
)); 
 
// Get redirect login helper 
$helper $fb->getRedirectLoginHelper(); 
 
// Try to get access token 
try { 
    if(isset($_SESSION['facebook_access_token'])){ 
        $accessToken $_SESSION['facebook_access_token']; 
    }else{ 
          $accessToken $helper->getAccessToken(); 
    } 
} catch(FacebookResponseException $e) { 
     echo 'Graph returned an error: ' $e->getMessage(); 
      exit; 
} catch(FacebookSDKException $e) { 
    echo 'Facebook SDK returned an error: ' $e->getMessage(); 
      exit; 
}

User Class (User.class.php)

The User class uses PHP and MySQL to perform database-related activities (connect, insert, update, and delete).

1. __construct() – Use the credentials supplied in the config.php file to connect to the database.
2. checkUser() –

 - Based on the OAuth provider and ID, insert or update the user profile data.
 - As an array, this method returns the user's account info.
3. getPosts() – Retrieves posts information from the user posts database.
4. insertPost() – Insert data from a post into the user posts database.
5. deletePosts() – Delete post data using the user ID.

<?php 
/* 
 * User Class 
 * This class is used for database related (connect, insert, update, and delete) operations 
 * @author    CodexWorld.com 
 * @url        http://www.codexworld.com 
 * @license    http://www.codexworld.com/license 
 */ 
 
class User { 
    private $dbHost     DB_HOST; 
    private $dbUsername DB_USERNAME; 
    private $dbPassword DB_PASSWORD; 
    private $dbName     DB_NAME; 
    private $userTbl    DB_USER_TBL; 
    private $postTbl    DB_POST_TBL; 
     
    function __construct(){ 
        if(!isset($this->db)){ 
            // Connect to the database 
            $conn = new mysqli($this->dbHost$this->dbUsername$this->dbPassword$this->dbName); 
            if($conn->connect_error){ 
                die("Failed to connect with MySQL: " $conn->connect_error); 
            }else{ 
                $this->db $conn; 
            } 
        } 
    } 
     
    function checkUser($userData = array()){ 
        if(!empty($userData)){ 
            // Check whether user data already exists in database 
            $prevQuery "SELECT * FROM ".$this->userTbl." WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'"; 
            $prevResult $this->db->query($prevQuery); 
            if($prevResult->num_rows 0){ 
                // Update user data if already exists 
                $query "UPDATE ".$this->userTbl." SET first_name = '".$userData['first_name']."', last_name = '".$userData['last_name']."', email = '".$userData['email']."', gender = '".$userData['gender']."', picture = '".$userData['picture']."', link = '".$userData['link']."', modified = NOW() WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'"; 
                $update $this->db->query($query); 
            }else{ 
                // Insert user data 
                $query "INSERT INTO ".$this->userTbl." SET oauth_provider = '".$userData['oauth_provider']."', oauth_uid = '".$userData['oauth_uid']."', first_name = '".$userData['first_name']."', last_name = '".$userData['last_name']."', email = '".$userData['email']."', gender = '".$userData['gender']."', picture = '".$userData['picture']."', link = '".$userData['link']."', created = NOW(), modified = NOW()"; 
                $insert $this->db->query($query); 
            } 
             
            // Get user data from the database 
            $result $this->db->query($prevQuery); 
            $userData $result->fetch_assoc(); 
        } 
         
        // Return user data 
        return $userData; 
    } 
     
    public function getPosts($conditions = array()){ 
        $sql 'SELECT *'; 
        $sql .= ' FROM '.$this->postTbl; 
        if(array_key_exists("where",$conditions)){ 
            $sql .= ' WHERE '; 
            $i 0; 
            foreach($conditions['where'] as $key => $value){ 
                $pre = ($i 0)?' AND ':''; 
                $sql .= $pre.$key." = '".$value."'"; 
                $i++; 
            } 
        } 
         
        if(array_key_exists("order_by",$conditions)){ 
            $sql .= ' ORDER BY '.$conditions['order_by'];  
        }else{ 
            $sql .= ' ORDER BY created_time DESC ';  
        } 
         
        if(array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){ 
            $sql .= ' LIMIT '.$conditions['start'].','.$conditions['limit'];  
        }elseif(!array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){ 
            $sql .= ' LIMIT '.$conditions['limit'];  
        } 
         
        $result $this->db->query($sql); 
         
        if(array_key_exists("return_type",$conditions) && $conditions['return_type'] != 'all'){ 
            switch($conditions['return_type']){ 
                case 'count': 
                    $data $result->num_rows; 
                    break; 
                case 'single': 
                    $data $result->fetch_assoc(); 
                    break; 
                default: 
                    $data ''; 
            } 
        }else{ 
            if($result->num_rows 0){ 
                while($row $result->fetch_assoc()){ 
                    $data[] = $row; 
                } 
            } 
        } 
        return !empty($data)?$data:false; 
    } 
     
    function insertPost($data){ 
        if(!empty($data) && is_array($data)){ 
            $columns ''; 
            $values  ''; 
            $i 0; 
            foreach($data as $key=>$val){ 
                $pre = ($i 0)?', ':''; 
                $columns .= $pre.$key; 
                $values  .= $pre."'".$this->db->real_escape_string($val)."'"; 
                $i++; 
            } 
            $query "INSERT INTO ".$this->postTbl." (".$columns.") VALUES (".$values.")"; 
            $insert $this->db->query($query); 
            return $insert?$this->db->insert_id:false; 
        }else{ 
            return false; 
        } 
    } 
     
    public function deletePosts($userID){ 
        $query "DELETE FROM ".$this->postTbl." WHERE user_id = $userID"; 
        $delete $this->db->query($query); 
        return $delete?true:false; 
    } 
}

Login and Fetch User Feed from Facebook Timeline (index.php)

The authentication procedure is handled with the Facebook API via PHP in this file.

 - Initially, the OAuth URL is produced using the Login Helper class's getLoginUrl() function, and the Facebook Sign-in button is presented on the web page.

 - Following authentication using a Facebook account, the following occurs:

      - The profile information is obtained from the Facebook account using the Facebook Graph API.
      - The checkUser() method of the User class is used to put the account data into the database.
      - The SESSION stores the user's account information.
      - Using the Facebook Graph API (/user-id/feed), the post feed is collected from the user's timeline.
      - Using the Facebook Graph API, retrieve the single post information (/post-id).
      - Using the Facebook Graph API, retrieve the post attachment information (/post-id/attachments).
      - Delete outdated post data from the database and replace it with the most recent post data.

 - The webpage displays the Facebook profile data (Name, First Name, Last Name, Email, Gender, Picture, and Profile Link).

 - The web page displays the posts and links that have been published by the verified user.
 - The login helper class's getLogoutUrl() function is used to produce the Logout link.

<?php 
// Include configuration file 
require_once 'config.php'; 
 
// Include User class 
require_once 'User.class.php'; 
 
if(isset($accessToken)){ 
    if(isset($_SESSION['facebook_access_token'])){ 
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']); 
    }else{ 
        // Put short-lived access token in session 
        $_SESSION['facebook_access_token'] = (string) $accessToken; 
         
          // OAuth 2.0 client handler helps to manage access tokens 
        $oAuth2Client $fb->getOAuth2Client(); 
         
        // Exchanges a short-lived access token for a long-lived one 
        $longLivedAccessToken $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']); 
        $_SESSION['facebook_access_token'] = (string) $longLivedAccessToken; 
         
        // Set default access token to be used in script 
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']); 
    } 
     
    // Redirect the user back to the same page if url has "code" parameter in query string 
    if(isset($_GET['code'])){ 
        header('Location: ./'); 
    } 
     
    // Getting user's profile info from Facebook 
    try { 
        $graphResponse $fb->get('/me?fields=name,first_name,last_name,email,link,gender,picture'); 
        $fbUser $graphResponse->getGraphUser(); 
    } catch(FacebookResponseException $e) { 
        echo 'Graph returned an error: ' $e->getMessage(); 
        session_destroy(); 
        // Redirect user back to app login page 
        header("Location: ./"); 
        exit; 
    } catch(FacebookSDKException $e) { 
        echo 'Facebook SDK returned an error: ' $e->getMessage(); 
        exit; 
    } 
     
    // Initialize User class 
    $user = new User(); 
     
    // Getting user's profile data 
    $fbUserData = array(); 
    $fbUserData['oauth_uid']  = !empty($fbUser['id'])?$fbUser['id']:''; 
    $fbUserData['first_name'] = !empty($fbUser['first_name'])?$fbUser['first_name']:''; 
    $fbUserData['last_name']  = !empty($fbUser['last_name'])?$fbUser['last_name']:''; 
    $fbUserData['email']      = !empty($fbUser['email'])?$fbUser['email']:''; 
    $fbUserData['gender']     = !empty($fbUser['gender'])?$fbUser['gender']:''; 
    $fbUserData['picture']    = !empty($fbUser['picture']['url'])?$fbUser['picture']['url']:''; 
    $fbUserData['link']       = !empty($fbUser['link'])?$fbUser['link']:''; 
     
    // Insert or update user data to the database 
    $fbUserData['oauth_provider'] = 'facebook'; 
    $userData $user->checkUser($fbUserData); 
    $userID $userData['id']; 
     
    // Storing user data in the session 
    $_SESSION['userData'] = $userData; 
     
    if($userData){ 
        // Fetch the user's feed 
        $userFeeds $fb->get("/".$fbUser['id']."/feed?limit=".FB_POST_LIMIT$accessToken); 
        $feedBody $userFeeds->getDecodedBody(); 
        $feedData $feedBody["data"]; 
         
        if(!empty($feedData)){ 
            // Delete old posts from the database 
            $user->deletePosts($userID); 
             
            $postData = array(); 
            foreach($feedData as $row){ 
                if(!empty($row['id'])){ 
                    $postID $row['id']; 
                     
                    // Fetch the post info 
                    $response $fb->get('/'.$postID$accessToken); 
                    $data $response->getDecodedBody(); 
                     
                    // Fetch post attachment info 
                    $response $fb->get('/'.$postID.'/attachments'$accessToken); 
                    $attchData $response->getDecodedBody(); 
                     
                    $postData['user_id'] = $userID; 
                    $postData['post_id'] = $data['id']; 
                    $postData['message'] = $data['message']; 
                    $postData['created_time'] = $data['created_time']; 
                    $postData['published_by'] = $fbUser['id']; 
                    $postData['attach_type'] = !empty($attchData['data'][0]['type'])?$attchData['data'][0]['type']:''; 
                    $postData['attach_title'] = !empty($attchData['data'][0]['title'])?$attchData['data'][0]['title']:''; 
                    $postData['attach_image'] = !empty($attchData['data'][0]['media']['image']['src'])?$attchData['data'][0]['media']['image']['src']:''; 
                    $postData['attach_link'] = !empty($attchData['data'][0]['url'])?$attchData['data'][0]['url']:''; 
                     
                    // Insert post data in the database 
                    $insertPost $user->insertPost($postData); 
                } 
            } 
        } 
    } 
     
    // Get logout url 
    $logoutURL $helper->getLogoutUrl($accessTokenFB_REDIRECT_URL.'logout.php'); 
     
    // Render Facebook profile data 
    if(!empty($userData)){ 
        $output  '<h2>Facebook Profile Details</h2>'; 
        $output .= '<div class="ac-data">'; 
        $output .= '<img src="'.$userData['picture'].'"/>'; 
        $output .= '<p><b>Facebook ID:</b> '.$userData['oauth_uid'].'</p>'; 
        $output .= '<p><b>Name:</b> '.$userData['first_name'].' '.$userData['last_name'].'</p>'; 
        $output .= '<p><b>Email:</b> '.$userData['email'].'</p>'; 
        $output .= '<p><b>Gender:</b> '.$userData['gender'].'</p>'; 
        $output .= '<p><b>Logged in with:</b> Facebook'.'</p>'; 
        $output .= '<p><b>Profile Link:</b> <a href="'.$userData['link'].'" target="_blank">Click to visit Facebook page</a></p>'; 
        $output .= '<p><b>Logout from <a href="'.$logoutURL.'">Facebook</a></p>'; 
        $output .= '</div>'; 
    }else{ 
        $output '<h3 style="color:red">Some problem occurred, please try again.</h3>'; 
    } 
}else{ 
    // Get login url 
    $permissions = ['email']; // Optional permissions 
    $loginURL $helper->getLoginUrl(FB_REDIRECT_URL$permissions); 
     
    // Render Facebook login button 
    $output '<a href="'.htmlspecialchars($loginURL).'"><img src="images/fb-login-btn.png"></a>'; 
} 
?>

<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Login with Facebook using PHP by CodexWorld</title>
<meta charset="utf-8">
<!-- stylesheet file -->
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
    <div class="fb-box">
        <!-- Display login button / Facebook profile information -->
        <?php echo $output?>
    </div>
	
    <!-- List user posts -->
    <?php
    <?php 
    if(!empty($userID)){ 
        // Fetch posts from the database 
        $con = array( 
            'where' => array('user_id' => $userID), 
            'limit' => FB_POST_LIMIT 
        ); 
        $posts $user->getPosts($con); 
         
        if(!empty($posts)){ 
    ?>
        <div class="post-list">
            <h2>Facebook Feeds</h2>
            <?php foreach($posts as $row){ 
                $image = !empty($row['attach_image'])?'<img src="'.$row['attach_image'].'"/>':''; 
                $title = (strlen($row['attach_title'])>55)?substr($row['attach_title'],0,55):$row['attach_title']; 
                $message = (strlen($row['message'])>120)?substr($row['message'],0,110).'...':$row['message']; 
            ?>
            <a href="<?php echo $row['attach_link']; ?>" target="_blank">
            <div class="pbox">
                <div class="img"><?php echo $image?></div>
                <div class="cont">
                    <h4><?php echo $title?></h4>
                    <p><?php echo $message?></p>
                </div>
            </div>
            </a>
            <?php ?>
        </div>
    <?php } 
    } ?>
</div>
</body>
</html>

Logout (logout.php)

The logout.php file is loaded when a user decides to log out of their Facebook account.

 - Remove the SESSION's access token and user data.
 - Bring the user back to the login page.

<?php 
// Include configuration file 
require_once 'config.php'; 
 
// Remove access token from session 
unset($_SESSION['facebook_access_token']); 
 
// Remove user data from session 
unset($_SESSION['userData']); 
 
// Redirect to the homepage 
header("Location:index.php"); 
?>

Conclusion

If you want to add a social login option to your website, Facebook authentication is the most dependable method of allowing users to connect using their social accounts. This script will assist you in improving the Facebook login functionality. Using PHP SDK and Graph API, a logged-in user may access their timeline posts on the website without visiting Facebook. In the web application, you may leverage the Facebook posts parser capability for a variety of applications.

LICENSE OF USE

You can use it for personal or commercial projects. You can't resell it partially or in this form.

PRODUCT INFO

Create Date : Jan 25, 2022

Updated Date : Jan 25, 2022

Ratings

Comments : 0

Downloads : 0