48

我知道您可以通过在 Facebook 的调试器工具上输入 URL 来强制更新页面的缓存,同时以该应用程序/页面的管理员身份登录: https ://developers.facebook.com/tools/debug

但我需要的是一种方法来自动调用 API 端点或我们内部应用程序中的某些东西,每当我们销售部门的人更新我们一个页面的主图像时。要求成千上万的销售人员以管理员身份登录并在他们更新我们商品的描述或图像时手动更新页面的缓存是不可行的。

我们不能等待 24 小时让 Facebook 更新其缓存,因为我们每天都会收到客户的投诉,只要他们在我们这边更改后没有立即显示更改。

4

10 回答 10

81

页面元数据不是那种应该经常更改的东西,但是您可以通过转到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;不需要用户身份验证。

于 2012-08-24T00:12:02.767 回答
15

如果您想在 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);
}
于 2015-10-02T21:55:39.387 回答
5

如果您使用的是 javascript sdk,那么您要使用的版本是

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

我碰巧喜欢 P​​romise,所以使用 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 对这种方法的重复或自动使用有何看法,因此明智和保守地使用它可能是值得的。

于 2015-04-30T02:41:23.580 回答
5

这是一个简单的 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);
           }
    });
于 2017-01-31T19:10:15.997 回答
2

使用 curl 在 Drupal 节点更新中的替代解决方案可能是这样的:

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

注意不支持标准 Drupal 核心的 hook_node_postsave() 实现。我必须使用www.drupal.org/project/hook_post_action才能让这个 facebook 抓取拾取最后对节点进行更改,因为在数据库更新后不会触发 hook_node_update()。

Facebook 现在需要访问令牌才能完成此操作。获取令牌的指南可以在这里找到: https ://smashballoon.com/custom-facebook-feed/access-token/

于 2017-01-22T13:10:34.353 回答
1

Graph API v2.10 有变化:

当针对我们以前没有抓取过的 URL 发出 GET 请求时,我们还将省略 og_object 字段。要触发抓取并填充 og_object,请发出 POST /{url}?scrape=true。一旦被抓取,og_object 将保持缓存并在所有未来的读取请求中返回。

从 2017 年 10 月 16 日开始,我们将在所有版本的 Graph API 中要求这些请求的访问令牌。

来源:Graph API v2.10 简介

所以现在我们应该使用 POST 方法进行抓取:

POST /{url}?scrape=true

不是

于 2017-08-11T08:35:18.733 回答
1

我是Facebook Object Debugger CLI的作者,这是一个用 PHP 编写的命令行界面,旨在使用文本文件作为输入来刷新单个 URL 或一堆 URL 的 Facebook 缓存。该软件包也可以在Packagist上使用,并且可以使用Composer进行安装。

于 2017-03-31T00:09:58.970 回答
0

这是我使用 Koala gem 和 Facebook API v2.9 的 Ruby 解决方案

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

response应该是从被抓取og:的页面上的元标记中检索到的属性哈希。

于 2017-12-08T18:05:08.700 回答
0

使用 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();
   }
?>
于 2017-02-18T18:18:50.927 回答
-1

我也面临同样的问题。有一种清除缓存的简单方法。

  1. http://developers.facebook.com/tools/debug
  2. 在fbrefresh=CAN_BE_ANYTHING后面输入 URL

示例:http ://www.example.com?fbrefresh=CAN_BE_ANYTHING

于 2016-07-19T08:31:04.837 回答