Есть ли API, чтобы заставить Facebook снова очистить страницу?

Я знаю, что вы можете принудительно обновить кеш страниц, введя URL-адрес средства отладки Facebook, когда он был зарегистрирован как администратор для этого приложения/страницы: https://developers.facebook.com/tools/debug

Но мне нужен способ автоматически вызывать конечную точку API или что-то из нашего внутреннего приложения, когда кто-либо из нашего отдела продаж обновляет основной образ одной из наших страниц. Невозможно попросить тысячи продавцов войти в систему как администратор и вручную обновить кеш страниц, когда они обновляют одно из наших описаний или изображений элемента.

Мы не можем дождаться 24 часа, чтобы Facebook обновил свой кеш, потому что мы ежедневно получаем жалобы от наших клиентов, когда они не видят изменений, которые появляются, как только мы меняем его на нашей стороне.

Ответ 1

Метаданные страницы - это не то, что должно меняться очень часто, но вы можете вручную очистить кеш, перейдя в Facebook Debug Tool и введите URL-адрес, который вы хотите очистить

Существует также API для этого, который работает для любого объекта OG:

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

Теперь требуется access_token. Это может быть приложение или страница access_token; аутентификация пользователя не требуется.

Ответ 2

Если вы хотите сделать это на PHP в с ожиданием ответа, следующая функция сделает это:

//Provide a URL in $url to empty the OG cache
function clear_open_graph_cache($url) {
  $vars = array('id' => $url, 'scrape' => 'true');
  $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);
}

Ответ 3

Если вы используете javascript sdk, то версия, которую вы хотите использовать,

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

Мне нравится promises, поэтому альтернативная версия с использованием jQuery Deferreds может быть

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

то

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

Обратите внимание, что скребок может занять много времени для завершения, поэтому никаких гарантий, что он будет быстрым. Я также не знаю, что Facebook думает о повторных или автоматизированных способах использования этого метода, поэтому, вероятно, он заслуживает разумного и консервативного подхода к его использованию.

Ответ 4

Это простая реализация ajax. Поместите это на любую страницу, на которую вы хотите мгновенно очистить facebook;

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

Ответ 5

Альтернативное решение из версии Drupal node с использованием curl может быть примерно таким:

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

Обратите внимание на реализацию hook_node_postsave(), которая не является стандартным ядром Drupal. Мне пришлось использовать www.drupal.org/project/hook_post_action, чтобы получить эту фразу facebook scrape pickup последние внесенные изменения в node, так как hook_node_update() не инициированный после обновления баз данных.

Facebook требует теперь токена доступа, чтобы это сделать. Инструкции по приобретению токена можно найти здесь: https://smashballoon.com/custom-facebook-feed/access-token/

Ответ 7

Решение с SDK PHP 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();
   }
?>

Ответ 8

Я являюсь автором Facebook CLI для отладки объектов, интерфейс командной строки, написанный на PHP, направлен на обновление кеша Facebook для один URL-адрес или набор URL-адресов, использующих в качестве входного текстового файла. package также доступен на Packagist и может быть установлен с помощью Composer.

Ответ 9

В Graph API v2.10 есть изменения:

При создании запроса GET по URL-адресу, который мы еще не очищали, мы также опустим поле og_object. Чтобы вызвать очистку и заполнить объект og_object, введите POST/{url}? Scrape = true. После очистки, og_object останется в кэше и будет возвращен во все будущие запросы на чтение.

Нам потребуется токен доступа для этих запросов во всех версиях API-интерфейсов Graph начиная с 16 октября 2017 года.

Источник: Представляем Graph API v2.10

Итак, теперь мы должны использовать POST-метод для выскабливания:

POST /{url}?scrape=true

Не

Ответ 10

Здесь мое решение Ruby с использованием Koala gem и 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 должен быть хэшем атрибутов, полученных из метатег og: на странице, которая была очищена.