web-dev-qa-db-fra.com

Existe-t-il une API pour forcer Facebook à gratter une page à nouveau?

Je suis conscient que vous pouvez forcer la mise à jour du cache d'une page en entrant l'URL de l'outil de débogage de Facebook tout en étant connecté en tant qu'administrateur pour cette application/page: https://developers.facebook.com/tools/debug

Mais ce dont j'ai besoin, c'est d'un moyen de appeler automatiquement un point de terminaison d'API ou quelque chose de notre application interne chaque fois qu'un membre de notre service commercial met à jour l'image principale de l'une de nos pages}. Ce n'est pas une option de demander à des milliers de vendeurs de se connecter en tant qu'administrateur et de mettre à jour manuellement le cache d'une page chaque fois qu'ils mettent à jour la description ou l'image de notre article.

Nous ne pouvons pas nous permettre d’attendre 24 heures que Facebook mette à jour sa mémoire cache, car nos clients nous adressent quotidiennement des plaintes chaque fois qu’ils ne voient pas un changement s’afficher dès que nous le modifions de notre côté.

42
Felipe Brahm

Les métadonnées de page ne sont pas le genre de choses qui devraient changer très souvent, mais vous pouvez effacer le cache manuellement en allant sur l'outil de débogage de Facebook et en entrant l'URL que vous voulez gratter.

Il existe également une API pour cela, qui fonctionne pour tout objet OG :

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

Un access_token est maintenant requis. Cela peut être une application ou une page access_token; aucune authentification d'utilisateur n'est requise.

74
Igy

Si vous souhaitez le faire dans PHP dans un sans attendre de réponse , la fonction suivante le fera:

//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);
}
12
Shawn Conn

Ceci est une implémentation ajax simple. Mettez ceci sur n'importe quelle page que vous voulez que Facebook gratte immédiatement;

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

Si vous utilisez le sdk javascript, la version que vous souhaitez utiliser est

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

J'aime les promesses, donc une version alternative utilisant jQuery Deferreds pourrait être

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;
}

puis:

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

Notez que le grattoir peut prendre différentes quantités de temps, donc rien ne garantit qu’il sera rapide. Je ne sais pas non plus ce que Facebook pense des utilisations répétées ou automatisées de cette méthode;.

5
Dtipson

Il y a des changements dans Graph API v2.10:

Lors de la création d'une requête GET par rapport à une URL que nous n'avons pas encore supprimée, nous omettons également le champ og_object. Pour déclencher un scrap et remplir le og_object, lancez un POST/{url}? Scrape = true. Une fois gratté, l'og_object restera mis en cache et renvoyé pour toutes les futures demandes de lecture.

Nous demanderons un jeton d'accès pour ces demandes dans toutes les versions de l'API Graph à compter du 16 octobre 2017.

Source: Présentation de Graph API v2.10

Alors maintenant, nous devrions utiliser la méthode POST pour gratter:

POST /{url}?scrape=true

Ne pas

1
merkushin

Une solution avec le PHP SDK Facebook:

<?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();
   }
?>
0
Westy92

Je suis l'auteur de Facebook Object Debugger CLI , une interface de ligne de commande écrite en PHP, vise à actualiser le cache de Facebook pour une seule ou plusieurs URL à l'aide d'un fichier texte. Package est également disponible sur Packagist et peut être installé à l'aide de Composer .

0
noun

Voici ma solution Ruby utilisant Koala gem et Facebook API v2.9

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

response doit être un hachage d'attributs extraits des balises méta og: de la page qui a été supprimée. 

0
Jesse Novotny