to top

Publicar en Facebook desde PHP

En esta ocasión nos metemos en un terreno más técnico para dar solución al problema de publicar contenido de nuestra web en nuestro muro de Facebook directamente, desde un cron o una gestión de contenidos.

Desde el cambio de API de Facebook, publicar en el muro directamente se ha vuelto “complicado”. En esta guía nos centramos en los 2 pasos: Configurar una aplicación en Facebook desde nuestro usuario para una página de empresa y  la programación PHP para subir contenido a ese muro mediante esa aplicación.

Antes de nada, comentar, que para comunicar nuestro PHP con Facebook necesitaremos:

  • APP-ID de una aplicación de Facebook
  • APP-Secret
  • Access Token

Crear Aplicación en Facebook

Primero, evidentemente, nos logueamos en Facebook con una cuenta de administrador de la página en la que queremos publicar. Como he comentado antes, no vamos a publicar en el muro del usuario, sino en el muro de una de las páginas (empresa, etc) que administro.

Accedemos al panel para desarrolladores y creamos una nueva app:

https://developers.facebook.com/apps/

nueva-app-facebook

Una vez la hemos creado nos parecerá un resumen con un identificador de la aplicación (App-ID) y una clave secreta (App-Secret). En el menú lateral accedemos a “Configuración” > “Información Básica” para configurar otros aspectos de la aplicación.

Rellenamos los datos de “Dominio de aplicaciones”, “Correo” y añadimos la plataforma. En este caso “Sitio Web” y completamos el campo de URL del sitio.

En el menú de “Opciones avanzadas”, en la pestaña de seguridad, si queremos podemos rellenar los campos de IPs permitidas. De esta forma controlaremos desde qué sitios se publican contenidos en nuestro muro.

Desde el menú de “Revisión de la aplicación” tenemos el interruptor donde marcar que las publicaciones que mandemos a la aplicación se publiquen en nuestro muro para todo el mundo bajo la opción “¿Quieres que xxxxxx sea una aplicación pública?”. Por ahora no lo activamos hasta hacer todas las pruebas.

Obtener Identificador de Acceso (Access Token)

Una vez creada la aplicación, tenemos que crear un identificador de acceso a la misma con el que configuraremos la API de Facebook para que se comunique con nuestro muro.

Accedemos al Explorador de API Graph:

https://developers.facebook.com/tools/explorer/

En el menú de Aplicación, seleccionamos el nombre de la aplicación que estemos usando. En el submenu “Obtener Identificador” seleccionamos “Obtener identificador de acceso de usuario”.

api-graph-inicio

Nos aparecerá un popup preguntando los permisos que queremos que tenga la aplicación. En nuestro caso tenemos que marcar las opciones de “publish_actions” y “manage_pages”.

api-graph-permisos

Cuando pulsamos en el botón de “Obtener identificador de acceso” nos pedirá que validemos esos permisos logueandonos de nuevo en Facebook:

api-graph-validar

En este momento aparecerá un identificador de acceso genérico para mi usuario. Como lo que quiero es publicar en una de mis páginas, selecciono en el desplegable mi página:

api-graph-sel-pagina

En este momento ya tengo mi Identificador de acceso (Access Token), pero este identificador solo es válido por 1 hora aproximadamente.

Para hacer que dure al menos 2 meses pulsamos en el icono de información “i” del identificador de acceso para ver su caducidad.

app-graph-extender-1

Abrimos la herramienta de identificadores de acceso y pulsamos el botón de “Extend Access Token”:

app-graph-extender-2

Esto nos dará otro identificador de acceso con una validez de 2 meses aproximadamente.

Fichero PHP con API de Facebook

Una vez tenemos los datos del ID de la aplicación, clave secreta e identificador de acceso, ya podemos crear nuestro archivo PHP para mandar contenido a nuestro muro de Facebook.

Primero descargamos el SDK de Facebook:

https://github.com/facebook/php-graph-sdk

Suponiendo que coloquemos la carpeta de “Facebook” del sdk al nivel de nuestro fichero PHP, incluimos las librerías con el fichero autoload.php

define('FACEBOOK_SDK_V4_SRC_DIR', 'Facebook/');
require_once('Facebook/autoload.php');

Ahora defino las variables con los datos obtenidos al crear la aplicación:

$appid = "<id de la aplicacion>";
$appsecret = "<clave secreta>";
$pageAccessToken = "<identificador de acceso>";
$pageFeed = "/me/feed";

Defino el contenido que voy a publicar:

$pagTitulo="AFFINITY DESIGNER, UNA ALTERNATIVA SERIA A ILLUSTRATOR Y FIREWORKS";
$pagURL = "https://www.primemonkey.com/affinity-designer-una-alternativa-seria-a-illustrator-y-fireworks/";

Y mando la información a Facebook.

$fb = new Facebook\Facebook([
    'app_id' => $appid,
    'app_secret' => $appsecret
]);
$linkData = [
    'link' => $pagURL,
    'message' => $pagTitulo
];
try {
    $response = $fb->post($pageFeed, $linkData, $pageAccessToken);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    echo 'Graph returned an error: '.$e->getMessage();
    exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    echo 'Facebook SDK returned an error: '.$e->getMessage();
    exit;
}
$graphNode = $response->getGraphNode();

Listo, ya deberíamos ver el post en nuestro muro.

Recuerda activar la aplicación para que sea visible por todo el mundo desde el menú de “Revisión de la aplicación”!

https://developers.facebook.com/apps/

 

Prime Monkey

  • Julia

    Hola, acabo de probar esto y publica en mi muro, no en la página elegida. Qué puedo estar haciendo mal?
    Gracias y Feliz 2018!

    2 enero, 2018 a 4:48 am Responder
  • monica otero

    Hola, al ejecutar mi fichero post.php que está generado con las lineas de codigo que pones en el post me da el siguiente error: Graph returned an error: Invalid OAuth access token.

    9 enero, 2018 a 6:23 pm Responder
    • monica otero

      el error anterior era que tenia mal puesto el identificador, pero ahora me da el siguiente error:

      Graph returned an error: (#200) Requires either publish_actions permission, or manage_pages and publish_pages as an admin with sufficient administrative permission

      9 enero, 2018 a 6:27 pm Responder
  • Ferran Delriu

    Funciona perfectamente publicando en la pagina que deseo. Se puede ampliar y pasarle la url de una imagen en concreto para acompañar el post? Gracias por el post.

    20 enero, 2018 a 8:23 pm Responder
  • Goakof

    Antes se podía poner el link personalizado, es decir con su url, imagen, descripción y título en los antiguos parámetros como:

    $req = array(
    ‘access_token’ => $token,
    ‘message’ => $message,
    ‘link’ => $url,
    ‘picture’ => ‘ruta.jpg’);

    Tu tutorial sale perfecto, pero he querido añadir imagen personalizada, porque algunas urls no capta la imagen y también el título, pasa con algunos enlaces, sólo se muestra el link sin imagen ni título.

    He buscado en facebook developers pero no he hallado algo que me funcione, sabes si aún esto se puede personalizar como antes?

    30 marzo, 2018 a 4:59 pm Responder
  • Angel Antonio

    cuando se cumpla los 2 meses el token va caducar ya no podre publicar ?

    11 abril, 2018 a 6:45 pm Responder
  • JepMaria

    Muy buenas, vaya que si lo han complicado estos del fasebuc, pero felicidades por tu explicación. Excelente !!!
    A mi de da un error …
    Uncaught Error: Class ‘Facebook\Url\FacebookUrlDetectionHandler’ not found in /usr/home/adet.info/web/Facebook/Facebook.php:153 Stack trace: #0 /usr/home/xxx.com/web/provafb.php(16): Facebook\Facebook->__construct(Array) #1 {main} thrown in /usr/home/xxx.com/web/Facebook/Facebook.php on line 153

    En la linea 153 de Facebook.php esta:

    $this->setUrlDetectionHandler($config[‘url_detection_handler’] ?: new FacebookUrlDetectionHandler());

    pero $config[‘url_detection_handler’] vale nulo ya que en la llamado no le pasamos nada:

    $fb = new Facebook\Facebook([
    ‘app_id’ => $appid,
    ‘app_secret’ => $appsecret
    ]);

    Alguna idea ?

    Muchas gracias!!!

    9 mayo, 2018 a 9:58 pm Responder
    • JepMaria

      RESUELTO !!! Se me havian cargado mal las SDK en mi servidor. Muchas gracias !!!

      10 mayo, 2018 a 3:04 pm Responder
  • Roner Brog

    como puedo hacer que me tome campos de una base de datos ejemplo: titulo, desc, enlace, img

    29 septiembre, 2018 a 9:44 pm Responder
  • Pepito Rosales

    Wuau, es el mejor tutorial que he encontrado, llevo mucho tiempo tratando de desarrollar esta parte en mi sitio sin éxito y tu explicación es simple y perfecta. Gracias en verdad… un abrazote

    5 octubre, 2018 a 11:37 pm Responder
  • lorenzo

    hola antes que nada excelente explicación, tengo un problema y es que cada ya habia logrado postear a una pagina de facebook, pero solo yo podia ver la pulicacion no las demas personas, pero ahora resulta que facebook me inhabilito mi cuenta y cada vez que intento hacer una aplicacion en la pagina me inhabilita enseguida no se si a ti te haya pasado algo similar si es asi ojala pudieras orientarme que hacer

    9 octubre, 2018 a 9:09 pm Responder
  • Jose

    Felicidades por la excelente publicación !!
    Me encuentro con un problema. En el momento de “Obtener identificador de acceso de usuario”
    y xuando aparece la ventana de “Seleccionar permisos”, puedo seleccionar “Manage_pages” y “publish_pages” , però el permiso “publish_actions” no me aparece por ningun lado. Alguien sabe proque no dispongo de esa opcion ?

    Muchas gracias

    9 noviembre, 2018 a 9:53 pm Responder
  • lorenzo

    hola amigo disculpa una pregunta sabes si todavia se puede postear multiples imagenes en una sola publicacion de facebook porque hasta ahorita no puedo postear varias imagenes en una sola publicacion uso el foreach pero me publica por separado de antemano te agradesco cualquier sugerencia

    20 noviembre, 2018 a 3:57 am Responder
  • Daniel

    Muchas gracias! Que buen tutorial, a esta fecha todavía sirve. Ahora tengo que ver es como puede postear el usuario en su propio perfil y no en mi página.

    10 abril, 2019 a 9:00 pm Responder
  • Alexander BV

    Hola amigo espero que aún esté vigente tu bog pues hice todo bien, me publica pero el inconveniente es que solo lo puedo ver yo más no otras personas.

    21 junio, 2019 a 7:51 am Responder

Deja un comentario