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
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.
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.
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;
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.
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; }
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; } }
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($accessToken, FB_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>
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"); ?>
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.
© ThemesGiant Copyright @2015-2022 | All rights reserved.