Facebook graph api 有没有API可以迫使Facebook再次抓取页面?

Facebook graph api 有没有API可以迫使Facebook再次抓取页面?,facebook-graph-api,caching,facebook-like,facebook-opengraph,facebook-sharer,Facebook Graph Api,Caching,Facebook Like,Facebook Opengraph,Facebook Sharer,我知道你可以通过在Facebook的调试器工具上输入URL来强制更新页面缓存,同时以管理员身份登录该应用/页面: 但我需要的是一种方法,每当我们的销售部门有人更新我们某个页面的主图像时,自动从我们的内部应用程序调用API端点或其他内容。这不是一个选项,要求数千名销售人员以管理员身份登录,并在他们更新我们的商品说明或图片时手动更新页面缓存 我们不能等待24小时Facebook更新其缓存,因为我们每天都会收到客户的投诉,只要我们一改变,他们就看不到任何变化。页面元数据不是应该经常改变的事情,但是,

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

但我需要的是一种方法,每当我们的销售部门有人更新我们某个页面的主图像时,自动从我们的内部应用程序调用API端点或其他内容。这不是一个选项,要求数千名销售人员以管理员身份登录,并在他们更新我们的商品说明或图片时手动更新页面缓存


我们不能等待24小时Facebook更新其缓存,因为我们每天都会收到客户的投诉,只要我们一改变,他们就看不到任何变化。

页面元数据不是应该经常改变的事情,但是,您可以手动清除缓存,方法是转到并输入要刮取的URL

还有一个API用于执行此操作,它:


现在需要一个访问令牌。这可以是应用程序或页面访问令牌;不需要用户身份验证。

如果您使用的是javascript sdk,您希望使用的版本是

FB.api('https://graph.facebook.com/', 'post', {
            id: [your-updated-or-new-link],
            scrape: true
        }, function(response) {
            //console.log('rescrape!',response);
        });
我碰巧喜欢承诺,所以使用jQuery延迟的替代版本可能是

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;
}
然后:


请注意,刮板可能需要不同的时间来完成,因此不能保证它会很快完成。我也不知道Facebook对这种方法的重复或自动使用有何看法,因此明智和保守使用这种方法可能是值得的。

如果您想在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);
}

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

  • 输入URL,后跟fbresh=CAN\u\u ANYTHING

  • 示例:

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

    这是一个简单的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);
               }
        });
    

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

    我是一个用PHP编写的命令行界面的作者,该界面旨在使用文本文件作为输入刷新Facebook缓存中的单个URL或一组URL。也可以在上获得,并可以使用安装。

    Graph API v2.10中有一些更改:

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

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

    资料来源:

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

    POST/{url}?scrape=true


    这是我使用考拉宝石和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:
    元标记检索的属性散列

    这并不是说它一直在改变,但有时我们需要在某些东西“上线”之前改变一个图像(URL已经在制作中,但在此之前公众还没有看到),如果客户没有立即看到新图像,他们会感到不安。谢谢你的回复!很好,谢谢。它真的很有效,如果没有facebook认证,它应该与应用程序访问令牌一起工作,所以你仍然不需要任何用户进行认证来实现这一点call@Igy,我注意到有时候Facebook不会显示这些图片,即使它们已经被删除并显示在调试器中:为什么会发生这种情况?我知道这篇帖子已经发布了3年了,但是我遇到了这个问题,这个解决方案不适用于任何人。对于api 2.10,有人对此有一个解决方案吗?虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面更改了问题中已存在的链接,则仅链接答案可能无效。。。只要你拥有这个应用,你就不需要添加任何东西。这个问题是关于自动执行此操作的(例如,如果您想在更新图像后强制刷新,或者如果您想强制更新数百或数千页)。这是否真的有效?有没有facebook的消息来源说是这样的,因为它似乎对我不起作用。这个有效:)但你也需要发送访问令牌。所以请更新你的答案。是的。应该,但是。。。请参阅上面的@merkushin答案,并引用Facebook OG文档,今天它还需要一个访问令牌作为参数。。。
    <?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();
       }
    ?>
    
        api = Koala::Facebook::API.new(access_token)
        response = api.put_object(nil, nil, {scrape: true, id: "url-of-page-to-scrape"})