{"id":756,"date":"2011-12-16T21:50:38","date_gmt":"2011-12-16T20:50:38","guid":{"rendered":"http:\/\/www.sortea2.com\/blog\/?p=756"},"modified":"2014-01-26T14:45:51","modified_gmt":"2014-01-26T13:45:51","slug":"publicar-en-el-muro-de-facebook-con-la-nueva-api-y-php","status":"publish","type":"post","link":"https:\/\/www.sortea2.com\/blog\/2011\/12\/publicar-en-el-muro-de-facebook-con-la-nueva-api-y-php\/","title":{"rendered":"Publicar en el muro de Facebook con la nueva API y PHP"},"content":{"rendered":"<h3>Usar servicios autom\u00e1ticos<\/h3>\n<p>Desde Sortea2 consideramos muy importante la sincronizaci\u00f3n con Facebook de los contenidos que aparecen publicados en la web. Es por eso que decidimos utilizar un servicio para que cada vez que se publicara un nuevo sorteo, se publicara autom\u00e1ticamente en el muro de Facebook.<\/p>\n<p>Hay varios servicios que realizan esto, nosotros probamos con <a href=\"http:\/\/twitterfeed.com\">TwitterFeed<\/a> y tambi\u00e9n con <a href=\"http:\/\/ifttt.com\/\">Ifttt<\/a>. Ambos servicios son gratuitos y sencillos de usar, pero tienen un importante defecto: son muy poco fiables. Un d\u00eda el TwitterFeed dej\u00f3 de postear en el muro de Facebook y no hab\u00eda nada que se pudiera hacer al respecto. Pas\u00f3 casi un mes y sin explicaci\u00f3n aparente, volvi\u00f3 a postear cada nuevo sorteo publicado. Es por ello que decidimos darle un vistazo a posibles alternativas, eligiendo ifttt. Este servicio es muy interesante pero esta vez el problema estaba en que los art\u00edculos aparec\u00edan como muy resumidos en el muro de Facebook, y con un enlace en cada posteo.<\/p>\n<p>Principalmente por la <strong>irregularidad de los servicios gratuitos<\/strong>, en los que no siempre se puede confiar, pero tambi\u00e9n por <strong>no tener todo el control de lo que se estaba publicando<\/strong>, decidimos intentar realizar esa sincronizaci\u00f3n por nosotros mismos.<\/p>\n<p>Es este un problema que no todo el mundo va a tener, porque por ejemplo, si se tiene un blog de WordPress, hay servicios que automatizan la sincronizaci\u00f3n con Facebook gracias a <strong>plugins<\/strong>. En nuestro caso estas soluciones no nos sirven, pues tenemos un sistema propio para publicar los sorteos.<\/p>\n<p>Y aqu\u00ed aparece un tercer problema: todos estos sistemas antes mencionados dependen del RSS de sortea2, lo que provoca un importante retraso desde que se publica un sorteo en la p\u00e1gina hasta que se incorpora al Facebook.<\/p>\n<p>Y es que el RSS no se actualiza instant\u00e1neamente. Y los servicios revisan el RSS cada cierto tiempo, normalmente una media hora como m\u00ednimo. Es por estos retrasos que f\u00e1cilmente la publicaci\u00f3n de un nuevo sorteo puede resultar en su aparici\u00f3n en Facebook unas tres o cuatro horas despu\u00e9s.<\/p>\n<p>As\u00ed, decidimos echar un vistazo a la forma de realizar la publicaci\u00f3n de forma directa, sin depender de servicios poco fiables.<\/p>\n<p>Fijaros en la diferencia de personalizaci\u00f3n entre tres m\u00e9todos de posteo:<\/p>\n<figure id=\"attachment_764\" aria-describedby=\"caption-attachment-764\" style=\"width: 455px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-1.png\" alt=\"Publicaci\u00f3n autom\u00e1tica con ifttt\" title=\"sortea2-facebook-1\" width=\"455\" height=\"137\" class=\"size-full wp-image-764\" srcset=\"https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-1.png 455w, https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-1-300x90.png 300w\" sizes=\"auto, (max-width: 455px) 100vw, 455px\" \/><\/a><figcaption id=\"caption-attachment-764\" class=\"wp-caption-text\">Publicaci\u00f3n autom\u00e1tica con ifttt<\/figcaption><\/figure>\n<figure id=\"attachment_765\" aria-describedby=\"caption-attachment-765\" style=\"width: 472px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-2.png\" alt=\"Publicaci\u00f3n autom\u00e1tica con Twitterfeed\" title=\"sortea2-facebook-2\" width=\"472\" height=\"222\" class=\"size-full wp-image-765\" srcset=\"https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-2.png 472w, https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-2-300x141.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/a><figcaption id=\"caption-attachment-765\" class=\"wp-caption-text\">Publicaci\u00f3n autom\u00e1tica con Twitterfeed<\/figcaption><\/figure>\n<figure id=\"attachment_766\" aria-describedby=\"caption-attachment-766\" style=\"width: 474px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-3.png\" alt=\"Publicaci\u00f3n autom\u00e1tica totalmente auto gestionada\" title=\"sortea2-facebook-3\" width=\"474\" height=\"240\" class=\"size-full wp-image-766\" srcset=\"https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-3.png 474w, https:\/\/www.sortea2.com\/blog\/wp-content\/images\/sortea2-facebook-3-300x151.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><figcaption id=\"caption-attachment-766\" class=\"wp-caption-text\">Publicaci\u00f3n autom\u00e1tica totalmente auto gestionada<\/figcaption><\/figure>\n<h3>API de Facebook<\/h3>\n<p>El primer problema que no se encuentra es que Facebook ha vuelto a cambiar la API de acceso externo, con lo que casi toda la documentaci\u00f3n que uno encuentra en la red se refiere a <strong>la anterior API, que ya no funciona<\/strong>. As\u00ed, todas las b\u00fasquedas que se realicen en Google se deben limitar al periodo del \u00faltimo a\u00f1o. Todo lo publicado antes, por popular que fuera, <strong>no sirve para nada<\/strong>.<\/p>\n<p>As\u00ed, uno se debe descargar la \u00faltima versi\u00f3n de la API desde la p\u00e1gina de desarrolladores de Facebook. Y luego con esa API vienen unos ejemplos, que para colmo no funcionan tal cual.<\/p>\n<p>El concepto a entender a la hora de realizar nuestra publicaci\u00f3n autom\u00e1tica es que dentro de Facebook hay tres entidades diferenciadas que toman parte en todo esto:<\/p>\n<ul>\n<li>El <strong>Administrador<\/strong> de la p\u00e1gina, que es un usuario de Facebook, con nombre y apellidos.<\/li>\n<li>La <strong>P\u00e1gina<\/strong> de Sortea2 dentro de Facebook, que es una p\u00e1gina con uno o varios administradores.<\/li>\n<li>La <strong>Aplicaci\u00f3n<\/strong> de Sortea2. Es una aplicaci\u00f3n que hemos tenido que crear, dentro de Facebook, para poder realizar posteos en el muro. T\u00e9cnicamente con esta \u00fanica aplicaci\u00f3n ya se pueden realizar posteos en otras p\u00e1ginas y m\u00e1s acciones, pero si uno quiere postear en su propia p\u00e1gina de Facebook, tiene que crearse una aplicaci\u00f3n.<\/li>\n<\/ul>\n<p>As\u00ed, si quer\u00e9is postear autom\u00e1ticamente en vuestra p\u00e1gina, vais a necesitar crear una aplicaci\u00f3n de Facebook. \u00bfC\u00f3mo se crea una aplicaci\u00f3n de Facebook? Hay muchos tutoriales y ejemplos por Internet que seguro que encontrar\u00e9is. En el momento en que teng\u00e1is la aplicaci\u00f3n, conseguir\u00e9is dos datos fundamentales:<\/p>\n<ul>\n<li>Un ID de aplicaci\u00f3n, appid.<\/li>\n<li>Una clave secreta, secret key.<\/li>\n<\/ul>\n<p>Con esos dos datos, ya pod\u00e9is empezar a juntar las piezas. Lo siguiente es conseguir autorizaci\u00f3n de la p\u00e1gina de Sortea2 para postear desde la aplicaci\u00f3n que acabamos de crear. Esa aplicaci\u00f3n podr\u00e1 postear siempre y cuando se le hayan dado <strong>permisos muy amplios<\/strong>.<\/p>\n<p>Para conseguir esos permisos, el mejor <a href=\"http:\/\/stackoverflow.com\/questions\/1059640\/facebook-offline-access-step-by-step\">tutorial que existe es este<\/a>. Hay que teclear unas urls en el navegador, con los datos de la aplicaci\u00f3n (su ID y su clave secreta) y un tercer dato que es f\u00e1cil de conseguir que es el identificador de Facebook de la p\u00e1gina de Sortea2 (o vuestra p\u00e1gina).<\/p>\n<p>Los pasos a seguir son:<\/p>\n<ul>\n<li>https:\/\/graph.facebook.com\/oauth\/authorize?client_id=APP_ID&amp;scope=manage_pages,status_update&amp;redirect_uri=http:\/\/www.facebook.com\/connect\/login_success.html (Se cambia el APP_ID por el que teng\u00e1is). Con esto nos logueamos damos permisos. Se obtiene un c\u00f3digo.\n<p>Dos notas sobre este paso:<br \/>\nPrimero: antes Facebook no exig\u00eda el par\u00e1metro scope = <a href=\"http:\/\/stackoverflow.com\/questions\/4432426\/which-facebook-permissions-allow-for-posting-to-a-page-wall-not-profile-wall#comment22739896_4522249\">status_update<\/a>, pero ahora es imprescindible.<br \/>\nSegundo: el c\u00f3digo que nos interesa aparecer\u00e1 en la barra del direcci\u00f3n del navegador pero luego hace una redirecci\u00f3n a otra p\u00e1gina. Hay que estar atento para copiar ese c\u00f3digo antes de que lo redireccione.<\/p>\n<p><strong>A diferencia de lo que indica el tutorial<\/strong>, hay que exigir un permiso especial que es el de <a href=\"http:\/\/developers.facebook.com\/docs\/reference\/api\/permissions\/\">manage_pages<\/a>.<\/li>\n<li>\nhttps:\/\/graph.facebook.com\/oauth\/access_token?client_id=APP_ID&amp;redirect_uri=http:\/\/www.facebook.com\/connect\/login_success.html&amp;client_secret=APP_SECRET&amp;code=CODIGO_PASO_ANTERIOR (De nuevo hay que cambiar, ahora el APP_ID y el APP_SECRET por los de vuestra aplicaci\u00f3n y adem\u00e1s el c\u00f3digo obtenido antes).<\/p>\n<p>Con esto se consigue una cadena de texto que hay guardar como un tesoro: el <strong>access_token<\/strong>, un c\u00f3digo que viene a decir \u00abel administrador de Sortea2 autoriza a la aplicaci\u00f3n Sortea2 a gestionar sus p\u00e1ginas\u00bb.<\/li>\n<\/ul>\n<p>Siguiendo los pasos de ese tutorial sin embargo uno consigue otra cosa: que el Administrador de su consentimiento a otorgar permisos a la aplicaci\u00f3n. Porque seg\u00fan Facebook, <strong>una p\u00e1gina no puede dar permisos a una aplicaci\u00f3n directamente<\/strong>.<\/p>\n<p>Estamos ya realmente cerca. Tenemos el access_token del administrador, pero <strong>nos faltan el propio access_token de la p\u00e1gina<\/strong>. Porque si usamos el del administrador, los posteos no saldr\u00edan en el muro de Sortea2, sino en el de sus administradores, lo que tiene poco sentido.<\/p>\n<p>Para conseguir el access_token de la aplicaci\u00f3n ya hay que recurrir a la API de Facebook, con <a href=\"http:\/\/stackoverflow.com\/questions\/6331086\/how-can-i-use-manage-pages-permission-with-the-sdk-on-facebook\">un sencillo script de PHP<\/a> se puede obtener una lista de todos los access_token de todas las p\u00e1ginas en que esa persona sea administrador. Incluso directamente en el navegador se escribe:<\/p>\n<p>https:\/\/graph.beta.facebook.com\/USER_ID\/accounts?access_token=USER_ACCESS_TOKEN <\/p>\n<p>USER_ID es el ID de la persona administradora de la p\u00e1gina, no el ID de la p\u00e1gina de publicaci\u00f3n. Los Facebook ids se pueden conseguir f\u00e1cilmente desde <a href=\"http:\/\/findmyfacebookid.com\/\">este recurso<\/a>.<\/p>\n<p>El user_id es el ID que asocia Facebook a cada uno de sus usuarios. El user_access_token es el c\u00f3digo tan importante que obtuvimos en el paso anterior. Con esto nos sale en pantalla una lista de todas las p\u00e1ginas que gestiona ese administrador y sus correspondientes tokens. Los copiamos aparte y guardamos, pues son la pieza final para escribir el c\u00f3digo que necesitamos.<\/p>\n<p>Despu\u00e9s de todas estas dificultades ya tenemos las tres piezas que nos hacen falta:<br \/>\nAPP_ID<br \/>\nAPP_KEY_SECRET<br \/>\nACCESS_TOKEN<\/p>\n<p>Con esto ya se puede publicar cualquier cosa en Facebook, usando su API, en unas <a href=\"http:\/\/thinkdiff.net\/facebook\/php-sdk-3-0-graph-api-base-facebook-connect-tutorial\/\">sencillas l\u00edneas de c\u00f3digo<\/a>:<\/p>\n<p>$facebook = new Facebook(array(\u00abappId\u00bb =&gt; APP_ID, \u00absecret\u00bb =&gt; APP_KEY_SECRET));<br \/>\n$publishStream = $facebook-&gt;api(\u00ab\/PAGINA_ID\/feed\u00bb, &#8216;post&#8217;, array(<br \/>\n&#8216;message&#8217; =&gt; \u00abI love thinkdiff.net for facebook app development tutorials.\u00bb,<br \/>\n&#8216;link&#8217; =&gt; &#8216;http:\/\/ithinkdiff.net&#8217;,<br \/>\n&#8216;picture&#8217; =&gt; &#8216;http:\/\/thinkdiff.net\/ithinkdiff.png&#8217;,<br \/>\n&#8216;name&#8217; =&gt; &#8216;iOS Apps &amp; Games&#8217;,<br \/>\n&#8216;description&#8217;=&gt; &#8216;Checkout iOS apps and games from iThinkdiff.net. I found some of them are just awesome!&#8217;,<br \/>\n&#8216;access_token&#8217;=&gt; ACCESS_TOKEN ));<\/p>\n<p>As\u00ed, basta con personalizar el c\u00f3digo que tengamos. Donde guardamos nuestro sorteo, rellenamos los valores que queremos postear y los pasamos a esta llamada a la API de Facebook, que publica autom\u00e1ticamente el post en el muro, sin retrasos, sin intermediarios y con la personalizaci\u00f3n que nos guste darle.<\/p>\n<p>Espero que este tutorial os sirva de ayuda, Internet est\u00e1 lleno de informaci\u00f3n irrelevante, creemos que esos links son los m\u00e1s relevantes, con algunas adaptaciones y cosas que no suelen decirte en ning\u00fan sitio:<\/p>\n<ul>\n<li>Que tienes que pedir permisos de Administrador para la p\u00e1gina.<\/li>\n<li>Y que lo tienes que hacer para el usuario, no la p\u00e1gina.<\/li>\n<li>Que tienes que pasar el token cuando realizas una petici\u00f3n de posteo en el muro.<\/li>\n<\/ul>\n<p>Mucha suerte con vuestras luchas con la API de Facebook.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usar servicios autom\u00e1ticos Desde Sortea2 consideramos muy importante la sincronizaci\u00f3n con Facebook de los contenidos que aparecen publicados en la web. Es por eso que decidimos utilizar un servicio para que cada vez que se publicara un nuevo sorteo, se publicara autom\u00e1ticamente en el muro de Facebook. Hay varios servicios que realizan esto, nosotros probamos [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-756","post","type-post","status-publish","format-standard","hentry","category-tutoriales"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/comments?post=756"}],"version-history":[{"count":12,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/756\/revisions"}],"predecessor-version":[{"id":952,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/756\/revisions\/952"}],"wp:attachment":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/media?parent=756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/categories?post=756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/tags?post=756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}