是否有一个API迫使Facebook再次抓取一个页面?

时间:2012-08-23 21:57:21

标签: facebook-graph-api caching facebook-like facebook-opengraph facebook-sharer

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

但我需要的是一种从我们的销售部门的某个人更新我们其中一个页面的主要图像时自动调用API端点或其他内容的方法。要求成千上万的销售人员以管理员身份登录并在更新我们项目的描述或图像时手动更新页面缓存,这不是一种选择。

我们不能等待24小时让Facebook更新其缓存,因为我们会在我们改变它的时候,只要他们没有看到更改出现,我们就会收到客户的每日投诉。

9 个答案:

答案 0 :(得分:74)

页面元数据不是那种应该经常更改的东西,但您可以通过转到Facebook's Debug Tool并输入要删除的URL来手动清除缓存

还有一个用于执行此操作的API,works for any OG object

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。这可以是app或page access_token;不需要用户身份验证。

答案 1 :(得分:14)

如果您希望在无需等待回复的情况下在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);
}

答案 2 :(得分:5)

如果您使用的是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对这种方法的重复使用或自动使用的看法,所以使用它可能是明智和保守的。

答案 3 :(得分: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);
           }
    });

答案 4 :(得分: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);
    }
}

注意hook_node_postsave()实现不支持标准的Drupal核心。 我不得不使用www.drupal.org/project/hook_post_action才能让这个facebook刮取最后一次更改节点,因为在数据库更新后没有触发hook_node_update()。

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

答案 5 :(得分:1)

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

答案 6 :(得分: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();
   }
?>

答案 7 :(得分: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:元标记中检索的属性的哈希值。

答案 8 :(得分:-1)

我遇到了同样的问题。 有一种清除缓存的简单方法。

  1. http://developers.facebook.com/tools/debug
  2. 输入以下网址 fbrefresh = CAN_BE_ANYTHING
  3. 示例:http://www.example.com?fbrefresh=CAN_BE_ANYTHING