Cómo obtener el feed de una página de Facebook con graph API utilizando PHP y MySQL

En este tutorial te voy a mostrar la forma de obtener el feed de las páginas de Facebook públicas utilizando la graph API sin ninguna autenticación. Puedes ejecutar este script en la consola, en el host local o puedes hacerlo en tu sitio web online. Para este tutorial necesitaremos la URL de la página de Facebook y ID de la aplicación de Facebook, así como la clave secreta también.

Vamos a empezar a crear la app.

Paso 1. Crea una aplicación de Facebook. Si no sabes dónde dirigirte para hacerlo, haz clic aquí:

Paso 2. Escoge la plataforma donde usarás la aplicación. En nuestro caso seleccionaremos Website.

Paso 3. Teclea el nombre de tu aplicación y haz clic en el botón Create New Facebook App ID.

Paso 4. Configura la aplicación y no olvides proporcionar tu correo electrónico

Paso 5. Haz clic en Skip Quick Start

Paso 6. En la pestaña App Review dentro de la configuración de la app, selecciona que el estado de la API sea Live y no Sandbox.

Paso final. Copia el ID de la aplicación y también la clave secreta de la zona donde te indicamos en la imagen de más abajo.

Ahora vamos a programar nuestra aplicación

Feed-database.sql

Importa estas tablas a tu base de datos.

-- phpMyAdmin SQL Dump
-- version 2.8.0.1
-- http://www.phpmyadmin.net
-- 
-- Host: custsql-pow22
-- Generation Time: May 16, 2016 at 05:16 AM
-- Server version: 5.5.46
-- PHP Version: 4.4.9
-- 
-- Database: `database`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `feed`
-- 

CREATE TABLE `feed` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `PageID` varchar(100) NOT NULL,
  `Date` datetime NOT NULL,
  `Post` text NOT NULL,
  `Picture` text NOT NULL,
  `Comments` varchar(10) NOT NULL,
  `Likes` varchar(10) NOT NULL,
  `Shares` varchar(10) NOT NULL,
  `PostID` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `PostID` (`PostID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `feed`
-- 


-- --------------------------------------------------------

-- 
-- Table structure for table `pages`
-- 

CREATE TABLE `pages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `PageID` varchar(100) NOT NULL,
  `Name` varchar(255) NOT NULL,
  `Likes` varchar(100) NOT NULL,
  `Talking` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `pages`
--

db.php

Configura el archivo de conexión a la base de datos.

$connection = mysqli_connect('localhost','DBUser','DBPassword','DBName') or die(mysqli_error($connection));

config.php

Archivo de configuración de la aplicación. Modifica los valores YOUR_FACEBOOK_APPLICATION_ID por el ID de la aplicación de Facebook que previamente hemos copiado, y el valor YOUR_FACEBOOK_APPLICATION_SECRET, por la clave secreta.

$config['App_ID'] = 'YOUR_FACEBOOK_APPLICATION_ID';
$config['App_Secret'] = 'YOUR_FACEBOOK_APPLICATION_SECRET';

index.php

Archivo index utilizado para mostrar un formulario donde se pedirá el nombre único de la página de Facebook o el id. Si no sabes a lo que me refiero, os muestro un ejemplo muy gráfico:

  • https://facebook.com/nombredepagina – Donde nombredepagina sería el nombre único de la página
  • https://facebook.com/mejora-tu-web-745145748654125 – Donde el número senalado en negrita sería el id de la página
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Facebook Pages Feed</title>
</head>
<body>
<form method='post' action='feed.php'>Enter Page unique id / unique name here: <input type='text' name='page' value="" /><input type=submit /></form>
</body>
</html>

feed.php

Este será el archivo principal de la aplicación que utilizaremos para obtener información de la página y almacenarla en nuestra base de datos.

if(isset($_REQUEST['page']))
{
 require_once('db.php'); // Database connection
 require_once( 'config.php' ); // Configuration file contain facebook application id and secret
 $token = $config['App_ID']."|".$config['App_Secret']; // making app token by its id and secret
 
 $pageDetails = getFacebookId(mysqli_real_escape_string($connection,$_REQUEST['page'])); // Get page details like name of page, page ID, Likes, people talking about that page.
 if(!isset($pageDetails->id))
 {
 echo "Error Occured please provide a valid facebook page unique id / unique name";
 exit;
 }
 $query = "SELECT * FROM pages where PageID='".$pageDetails->id."'"; // select page already in database or not query.
 $result = mysqli_query($connection,$query); // execute query
 $numResults = mysqli_num_rows($result); // number of records
 if($numResults>=1) // if page found in database then run update query
 {
 $Results = mysqli_fetch_array($result);
 mysqli_query($connection,"UPDATE `pages` SET `Name` = '".mysqli_real_escape_string($connection,$pageDetails->name)."',`Likes` = '".$pageDetails->fan_count."',`Talking` = '".$pageDetails->talking_about_count."' 
 WHERE `id` ='".$Results['id']."' LIMIT 1");
 }
 else // else run insert query for new page
 {
 mysqli_query($connection,"INSERT INTO `pages` ( `id` , `PageID` , `Name` , `Likes` , `Talking` )
 VALUES 
 (NULL , '".$pageDetails->id."', '".$pageDetails->name."', '".$pageDetails->fan_count."', '".$pageDetails->talking_about_count."')");
 }
 
 feedExtract("",$pageDetails->id,$token); // This function will get feed of page.
 header("Location: view.php");
 exit;
}
else
{
 header("Location: index.php");
 exit;
}
 
// Function to get all feed of a page with like, comment and share count.
function feedExtract($url="",$pageFBID) // $url contain url for next pages and $page contain page id
{
 global $token, $connection; // database connection and tocken required
 
 // first time fetch page posts
 $response = file_get_contents_curl("https://graph.facebook.com/v2.6/$pageFBID/feed?fields=picture,message,story,created_time,shares,likes.limit(1).summary(true),comments.limit(1).summary(true)&access_token=".$token);
 
 $query = "SELECT id FROM pages where pageID='".$pageFBID."'"; // select feed already in database or not query.
 $result = mysqli_query($connection,$query); // execute query
 $fieldID = mysqli_fetch_row($result);
 $pageID = $fieldID['0'];
 // decode json data to array
 $get_data = json_decode($response,true);
 // loop extract data
 for($ic=0;$ic<count($get_data['data']);$ic++)
 {
 // Exracting Day, Month, Year
 $date = date_create($get_data['data'][$ic]['created_time']);
 $newDate = date_format($date,'Y-m-d H:i:s');
 
 
 // $story of post in if link, video or image it will return "message" plain status as "story"
 $story = $get_data['data'][$ic]['message'];
 
 if(!isset($story))
 $story = $get_data['data'][$ic]['story'];
 
 
 $query = "SELECT id FROM feed where PostID='".$get_data['data'][$ic]['id']."'"; // select page id from pages table.
 $result = mysqli_query($connection,$query); // execute query
 $numResults = mysqli_num_rows($result); // number of records
 if($numResults>=1) // if post found in database then run update query
 {
 //Update Record
 mysqli_query($connection,"update `feed` set 
 `Comments` = '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['comments']['summary']['total_count'])."' , 
 `Likes` = '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['likes']['summary']['total_count'])."', 
 `Shares` = '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['shares']['count'])."' 
 where `PostID` = '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['id'])."'");
 }
 else
 {
 
 // Puting data in sql query values
 $dataFeed = "(
 '".mysqli_real_escape_string($connection,$pageID)."', 
 '".mysqli_real_escape_string($connection,$newDate)."',
 '".mysqli_real_escape_string($connection,$story)."',
 '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['picture'])."',
 '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['comments']['summary']['total_count'])."',
 '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['likes']['summary']['total_count'])."',
 '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['shares']['count'])."',
 '".mysqli_real_escape_string($connection,$get_data['data'][$ic]['id'])."')";
 
 mysqli_query($connection,"INSERT INTO `feed` (`PageID` , `Date` , `Post` , `Picture` , `Comments` , `Likes` , `Shares` , `PostID` ) VALUES $dataFeed");
 }
 }
 
 // Return message.
 return 1;
}
 
function getFacebookId($pageID) // This function return facebook page details by its url
{
 // get token from main file
 global $token; 
 $json = file_get_contents_curl('https://graph.facebook.com/'.$pageID.'?fields=fan_count,talking_about_count,name&access_token='.$token); 
 // decode returned json data in arrau.
 $json = json_decode($json);
 return $json;
}

Este archivo mostrará los últimos 25 posts de la página dada y los almacenará en la base de datos, para mostrarlos más tarde en el fichero view.php.

view.php

<?php
require_once('db.php'); // Database connection
$query = "SELECT * FROM feed order by id desc"; // select page already in database or not query.

$result = mysqli_query($connection,$query); // execute query
?>
<html lang="en">
<body>
<div class="row">
<div class="[ col-xs-12 col-sm-offset-2 col-sm-8 ]">
<ul class="event-list">
<?php
while($rowsFeed = mysqli_fetch_array($result))
{
?>
<li>
<img src="<?php echo $rowsFeed['Picture'];?>" />
<div class="info">
<p class="desc"><?php echo $rowsFeed['Post'];?></p>
<ul>
<li style="width:33%;"><span class="fa fa-thumbs-up"></span> <?php echo $rowsFeed['Likes'];?></li>
<li style="width:34%;"><span class="fa fa-comment"></span> <?php echo $rowsFeed['Comments'];?></li>
<li style="width:33%;"><span class="fa fa-share"></span> <?php echo $rowsFeed['Shares'];?></li>
</ul>
</div>
<div class="social">
<ul>
<li class="facebook" style="width:33%;"><a href="https://fb.com/<?php echo $rowsFeed['PostID'];?>" target="_blank"><span class="fa fa-facebook"></span></a></li>
</ul>
</div>
</li>
<?php

}
?>
</ul>
</div>

</div>
</div>
</body>
</html>

Fuente: phpgang.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP