it-swarm.com.ru

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

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

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

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

42
Felipe Brahm

Метаданные страницы - не та вещь, которая должна меняться очень часто, но вы можете вручную очистить кеш, перейдя в инструмент отладки Facebook и введя 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; аутентификация пользователя не требуется.

74
Igy

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

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

Это простая реализация 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
tcrady

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

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

Мне нравятся обещания, так что альтернативная версия с использованием 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 думает о повторном или автоматизированном использовании этого метода, поэтому, вероятно, стоит быть осторожным и консервативным в его использовании.

5
Dtipson

Альтернативное решение в обновлении узла Drupal с использованием 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 для того, чтобы этот пикап с фейсбука последний раз вносил изменения в узел, поскольку hook_node_update () не запускается после обновления баз.

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

2
rawdesk.be

В Graph API v2.10 внесены изменения:

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

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

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

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

POST /{url}?scrape=true

Не

1
merkushin

Решение с помощью 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

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

0
noun

Вот мое решение Ruby, использующее гем Koala и 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: на странице, которая была очищена. 

0
Jesse Novotny