wake-up-neo.com

Gibt es eine API, um Facebook zu zwingen, eine Seite erneut zu kratzen?

Ich bin mir bewusst, dass Sie das Aktualisieren des Cache einer Seite erzwingen können, indem Sie die URL im Debugger-Tool von Facebook eingeben, während Sie für diese App/Seite als Administrator angemeldet sind: https://developers.facebook.com/tools/debug

Was ich aber brauche, ist eine Möglichkeit, ruft automatisch einen API-Endpunkt oder etwas von unserer internen App an, wenn jemand aus unserer Vertriebsabteilung das Hauptabbild einer unserer Seiten aktualisiert. Es ist keine Option, Tausende von Vertriebsmitarbeitern aufzufordern, sich als Administrator anzumelden und den Cache einer Seite manuell zu aktualisieren, wenn sie eine Beschreibung oder ein Bild eines Artikels aktualisieren.

Wir können es uns nicht leisten, 24 Stunden darauf zu warten, dass Facebook den Cache aktualisiert, da unsere Kunden täglich Beschwerden erhalten, wenn sie keine Änderung feststellen, sobald wir sie auf unserer Seite ändern.

42
Felipe Brahm

Seitenmetadaten sollten sich nicht häufig ändern. Sie können den Cache jedoch manuell löschen, indem Sie zum Debug-Tool Facebook gehen und die gewünschte URL eingeben

Dazu gibt es auch eine API, die für jedes OG-Objekt funktioniert :

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

Ein access_token ist jetzt erforderlich. Dies kann eine App oder eine Seite sein. Access_token; Es ist keine Benutzerauthentifizierung erforderlich.

74
Igy

Wenn Sie dies in PHP in einem tun möchten, ohne auf eine Antwort zu warten, führt die folgende Funktion Folgendes aus:

//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

Dies ist eine einfache Ajax-Implementierung. Platzieren Sie dies auf jeder Seite, die Facebook sofort abkratzen soll.

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

Wenn Sie die Javascript-SDK verwenden, ist dies die Version, die Sie verwenden möchten

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

Ich mag Versprechungen, also könnte es eine alternative Version mit jQuery Deferreds sein

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

dann:

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

Beachten Sie, dass der Schaber unterschiedliche Zeit in Anspruch nehmen kann, so dass er nicht garantiert ist, dass er schnell ist. Ich weiß auch nicht, was Facebook von wiederholten oder automatisierten Verwendungen dieser Methode hält, daher lohnt es sich wahrscheinlich, vernünftig und konservativ zu sein.

5
Dtipson

Eine alternative Lösung aus einem Drupal-Knoten-Update mit curl könnte etwa so aussehen:

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

Beachten Sie die Implementierung von hook_node_postsave (), die nicht vom Standard-Drupal-Kern unterstützt wird Ich musste www.drupal.org/project/hook_post_action verwenden, damit diese Abholung durch Facebook-Scrape zuletzt am Knoten vorgenommen wurde hook_node_update () wird nicht ausgelöst, nachdem Datenbanken aktualisiert wurden.

Facebook benötigt nun das Zugriffstoken, um dies zu erreichen. Richtlinien zum Erwerb eines Tokens finden Sie hier: https://smashballoon.com/custom-facebook-feed/access-token/

2
rawdesk.be

In Graph API v2.10 wurden Änderungen vorgenommen:

Wenn Sie eine GET-Anfrage gegen eine URL durchführen, die wir zuvor nicht gescrapet haben, wird auch das og_object-Feld weggelassen. Um ein Scrape auszulösen und das og_object aufzufüllen, geben Sie ein POST/{url}? Scrape = true aus. Nach dem Scrapieren bleibt das og_object zwischengespeichert und wird für alle zukünftigen Leseanforderungen zurückgegeben.

Für diese Anforderungen benötigen wir ab dem 16. Oktober 2017 in allen Versionen der Graph-API ein Zugriffstoken.

Quelle: Einführung in Graph API v2.10

Jetzt sollten wir die POST-Methode für das Scraping verwenden:

POST /{url}?scrape=true

Nicht

1
merkushin

Eine Lösung mit dem 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();
   }
?>
0
Westy92

Ich bin der Autor von Facebook Object Debugger CLI , einer in PHP geschriebenen Befehlszeilenschnittstelle, um den Facebook-Cache für eine einzelne URL oder eine Reihe von URLs mit einer Textdatei zu aktualisieren. Das package ist auch auf Packagist verfügbar und kann mit Composer installiert werden.

0
noun

Hier ist meine Ruby-Lösung, die Koala gem und Facebook API v2.9 verwendet

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

response sollte ein Hash von Attributen sein, die aus den og:-Meta-Tags auf der Seite abgerufen werden, die gelöscht wurde. 

0
Jesse Novotny