【问题标题】:Is there an API to force Facebook to scrape a page again?是否有 API 可以强制 Facebook 再次抓取页面?
【发布时间】:2018-02-07 02:18:36
【问题描述】:

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

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

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

p>

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 并不是说它一直在变化,而是有时我们需要在某些东西“上线”之前更改图像(该 URL 已经在制作中,但在此之前没有被公众看到)如果客户没有立即看到新图像,他们会感到不安。感谢您的回复!
    • 酷,谢谢。它确实有效,无需 facebook 身份验证
    • 它应该与应用访问令牌一起使用,因此您仍然不需要任何用户进行身份验证来进行此调用
    • @Igy,我注意到有时 Facebook 不显示图像,即使它们已被抓取并显示在调试器中:stackoverflow.com/questions/35125241/… 为什么会发生这种情况?
    • 我知道这篇文章有 3 年的历史,但我遇到了这个问题,这个解决方案不再适用。有人有针对 api 2.10 的解决方案吗?
    【解决方案2】:

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

    【讨论】:

    • 这可行:) 但您还需要发送访问令牌。所以请更新你的答案。
    • @Chittaranjan 如何获取访问令牌?
    【解决方案3】:

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

    【讨论】:

      【解决方案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);
                 }
          });
      

      【讨论】:

      • 是的。它应该,但是......请参阅上面的 @merkushin 回答以及 Facebook OG 文档中的引用,今天它还需要一个 access_token 作为参数......
      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          Graph API v2.10有变化:

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

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

          来源:Introducing Graph API v2.10

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

          POST /{url}?scrape=true

          没有

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              这是我使用 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: 元标记中检索到的属性哈希。

              【讨论】:

                【解决方案10】:

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

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

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

                【讨论】:

                • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
                • 该链接已经存在问题...只要您拥有该应用程序,就无需添加?fbrefresh 或任何其他内容。这个问题是关于自动执行此操作的(例如,如果您想在更新图像后强制刷新,或者如果您想强制更新数百或数千个页面)。
                • 这真的有效吗?是否有 Facebook 消息来源说是这种情况,因为它似乎对我不起作用。
                猜你喜欢
                • 1970-01-01
                • 2020-10-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多