info example facebook-graph-api caching facebook-like facebook-opengraph facebook-sharer

facebook-graph-api - example - pagination facebook graph api



¿Hay una API para obligar a Facebook a raspar una página otra vez? (10)

Soy consciente de que puede forzar la actualización de la memoria caché de una página ingresando la URL en la herramienta de depuración de Facebook mientras se inicia sesión como administrador para esa aplicación / página: https://developers.facebook.com/tools/debug

Pero lo que necesito es una forma de llamar automáticamente un punto final de API o algo de nuestra aplicación interna cada vez que alguien de nuestro departamento de ventas actualice la imagen principal de una de nuestras páginas . No es una opción pedirle a miles de vendedores que inicien sesión como administrador y actualicen manualmente el caché de una página cada vez que actualicen una de las descripciones o imágenes de nuestro elemento.

No podemos darnos el lujo de esperar 24 horas para que Facebook actualice su caché porque recibimos quejas diarias de nuestros clientes cada vez que no ven un cambio aparecer tan pronto como lo cambiemos de nuestro lado.


Aquí está mi solución de Ruby usando la gema de Koala y la API de Facebook v2.9

api = Koala::Facebook::API.new(access_token) response = api.put_object(nil, nil, {scrape: true, id: "url-of-page-to-scrape"})

response debe ser un hash de los atributos recuperados de las etiquetas og: meta en la página que fue raspada.


Esta es una implementación simple de Ajax. Pon esto en cualquier página que quieras que Facebook raspe inmediatamente;

var url= "your url here"; $.ajax({ type: ''POST'', url: ''https://graph.facebook.com?id=''+url+''&scrape=true'', success: function(data){ console.log(data); } });



Hay cambios en Graph API v2.10:

Al realizar una solicitud GET contra una URL que no hemos analizado antes, también omitiremos el campo og_object. Para desencadenar un raspado y poblar el objeto og, emita un POST / {url}? Raspado = verdadero. Una vez raspado, el objeto og permanecerá en la memoria caché y se devolverá en todas las solicitudes de lectura futuras.

Necesitaremos un token de acceso para estas solicitudes en todas las versiones de Graph API a partir del 16 de octubre de 2017.

Fuente: Introducción a Graph API v2.10

Entonces ahora deberíamos usar el método POST para raspar:

POST /{url}?scrape=true

No


Los metadatos de la página no son el tipo de cosas que deberían cambiar muy a menudo, pero puede borrar el caché manualmente accediendo a la https://developers.facebook.com/tools/debug e ingresando la URL que desea raspar.

También hay una API para hacer esto, que funciona para cualquier objeto OG :

curl -X POST / -F "id={object-url OR object-id}" / -F "scrape=true" / -F "access_token={your access token}" / "https://graph.facebook.com"

Ahora se requiere access_token. Esto puede ser una aplicación o página access_token; no se requiere autenticación de usuario.


Si desea hacer esto en PHP sin esperar una respuesta , la siguiente función hará esto:

//Provide a URL in $url to empty the OG cache function clear_open_graph_cache($url, $token) { $vars = array(''id'' => $url, ''scrape'' => ''true'', ''access_token'' => $token); $body = http_build_query($vars); $fp = fsockopen(''ssl://graph.facebook.com'', 443); fwrite($fp, "POST / HTTP/1.1/r/n"); fwrite($fp, "Host: graph.facebook.com/r/n"); fwrite($fp, "Content-Type: application/x-www-form-urlencoded/r/n"); fwrite($fp, "Content-Length: ".strlen($body)."/r/n"); fwrite($fp, "Connection: close/r/n"); fwrite($fp, "/r/n"); fwrite($fp, $body); fclose($fp); }


Si está usando javascript sdk, la versión de esto que desea usar es

FB.api(''https://graph.facebook.com/'', ''post'', { id: [your-updated-or-new-link], scrape: true }, function(response) { //console.log(''rescrape!'',response); });

Me gustan las promesas, por lo que una versión alternativa con jQuery Deferreds podría ser

function scrapeLink(url){ var masterdfd = $.Deferred(); FB.api(''https://graph.facebook.com/'', ''post'', { id: [your-updated-or-new-link], scrape: true }, function(response) { if(!response || response.error){ masterdfd.reject(response); }else{ masterdfd.resolve(response); } }); return masterdfd; }

entonces:

scrapeLink([SOME-URL]).done(function(){ //now the link should be scraped/rescraped and ready to use });

Tenga en cuenta que el raspador puede tomar diferentes cantidades de tiempo para completarse, por lo que no hay garantías de que sea rápido. Tampoco sé lo que Facebook piensa sobre los usos repetidos o automatizados de este método, por lo que probablemente sea prudente y conservador utilizarlo.


Soy el autor de Facebook Object Debugger CLI , una interfaz de línea de comandos escrita en PHP, con el objetivo de actualizar la caché de Facebook para una sola URL o un grupo de URL utilizando como entrada un archivo de texto. El package también está disponible en Packagist y se puede instalar utilizando Composer .


Una solución alternativa desde dentro de una actualización de nodo de Drupal usando curl podría ser algo como esto:

<?php function your_module_node_postsave($node) { if($node->type == ''your_type'') { $url = url(''node/''.$node->nid,array(''absolute'' => TRUE)); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, ''https://graph.facebook.com/v1.0/?id=''. urlencode($url). ''&scrape=true''); $auth_header = ''Oauth yOUR-ACCESS-TOKEn''; curl_setopt($ch, CURLOPT_HTTPHEADER, array($auth_header)); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $r = curl_exec($ch); curl_close ($ch); } }

Observe la implementación hook_node_postsave () que no es compatible con Drupal core estándar. Tuve que usar www.drupal.org/project/hook_post_action para hacer que este recolector de Facebook raspado hiciera cambios en el nodo, ya que hook_node_update () no se desencadena después de que se hayan actualizado las bases de datos.

Facebook requiere ahora el token de acceso para poder hacer esto. Las pautas para adquirir un token se pueden encontrar aquí: https://smashballoon.com/custom-facebook-feed/access-token/


Una solución con PHP Facebook SDK:

<?php try { $params = [ ''id'' => ''https://www.mysitetoscrape.com/page'', ''scrape'' => ''true'', ]; $response = $fb->post(''/'', $params); print_r($response); } catch(/Facebook/Exceptions/FacebookResponseException $e) { // When Graph returns an error echo ''Graph returned an error: '' . $e->getMessage(); } catch(/Facebook/Exceptions/FacebookSDKException $e) { // When validation fails or other local issues echo ''Facebook SDK returned an error: '' . $e->getMessage(); } ?>