【问题标题】:How to recognize Facebook User-Agent如何识别 Facebook 用户代理
【发布时间】:2012-01-27 10:45:49
【问题描述】:

在 FB 上分享我的一个页面时,我想展示一些不同的东西。问题是,我不喜欢使用 og: 元素,而是要识别 FB 用户代理。

这是什么?没找到。

【问题讨论】:

  • if(strpos($_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit') !== false) { ... }

标签: facebook user-agent


【解决方案1】:

您已经获得了上述 Facebook 的答案,但获得任何用户代理的一种方法是在您的网站上放置一个脚本,当您访问它时,它会向您发送邮件。例如,在您的域上创建此文件,例如 https://example.com/user-agent.php

<?php
    mail('you@youremail.com', 'User Agent', $_SERVER['HTTP_USER_AGENT']);

然后,访问 Facebook,在其中键入脚本的链接,然后按空格键。您实际上不必分享任何内容,只需输入链接和空格即可让 Facebook 获取预览。然后,您应该会收到一封包含 Facebook 用户代理的电子邮件。


【讨论】:

    【解决方案2】:

    Facebook 用户代理是:

    FacebookExternalHit/1.1
    FacebookExternalHit/1.0
    facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
    facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
    facebookexternalhit/1.0 (+https://www.facebook.com/externalhit_uatext.php)
    facebookexternalhit/1.1 (+https://www.facebook.com/externalhit_uatext.php)
    

    我正在使用下面的代码来检测 PHP 中的 FB User-Agent,它按预期工作:

    $agent = $_SERVER['HTTP_USER_AGENT'];
    if(stristr($agent, 'FacebookExternalHit')){
        //Facebook User-Agent
    }else{
        //Other User-Agent
    }
    

    【讨论】:

      【解决方案3】:

      这里是 Facebook 爬虫用户代理:

      FacebookExternalHit/1.1
      FacebookExternalHit/1.0
      

      facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
      facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
      

      请注意,版本号可能会更改。所以使用正则表达式查找爬虫名称,然后显示你的内容。

      更新

      您可以在 PHP 中使用此代码来检查 Facebook 用户代理

      if(preg_match('/^FacebookExternalHit\/.*?/i',$agent)){
          print "Facebook User-Agent";
          // process here for Facebook
      }
      

      这是 ASP.NET 代码。您可以使用这个函数来检查 userAgent 是否是 Facebook 的 useragent。

      public static bool IsFacebook(string userAgent)  
      {  
          userAgent = userAgent.ToLower();  
          return userAgent.Contains("facebookexternalhit");  
      }  
      

      注意:

      您为什么需要这样做?当您在 Facebook 上分享指向您网站的链接时,Facebook 会抓取并解析它以获取一些数据以显示您页面中的缩略图、标题和一些内容,但它会链接回您的网站。

      另外,我认为这会导致网站伪装,即向用户和爬虫显示不同的数据。伪装不被认为是一种好的做法,搜索引擎和网站可能会注意到它。

      更新:自 2014 年 5 月 28 日起,Facebook 还添加了新的用户代理

      Facebot
      

      您可以在https://developers.facebook.com/docs/sharing/webmasters/crawler 上阅读有关 Facebook 爬虫的更多信息

      【讨论】:

      • 先阅读 Facebook 的隐私政策!
      • @msec:如果 Facebook 不抓取页面,它如何知道页面的详细信息,如标题、缩略图等?
      【解决方案4】:

      有关用户代理字符串的列表,请查找 here。截至 2015 年 9 月,最常用的是 facebookexternalhit/*Facebot。由于您没有说明您尝试识别用户代理的语言,我无法告诉您更多信息。如果您确实想在 PHP 中识别 Facebook bot,请使用

      if (
          strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false ||          
          strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false
      ) {
          // it is probably Facebook's bot
      }
      else {
          // that is not Facebook
      }
      

      更新:Facebook 已将Facebot 添加到可能的用户代理字符串列表中,因此我更新了代码以反映更改。此外,代码现在更容易预测未来可能发生的变化。

      【讨论】:

      • 您可以查看Facebook's best practices page 以获取有关如何检测其爬虫和抓取工具的更多和最新详细信息。请注意,Facebot 已添加到用户代理字符串列表中。
      • @donut 的链接不再包含正确的信息。更新后的网址为:developers.facebook.com/docs/sharing/webmasters/crawler
      • 另外,FWIW,我正在使用以下更具前瞻性的代码:if(strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false || strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false) { /* It's probably Facebook's bot */ }
      【解决方案5】:

      从 FB 端的用户代理修改的角度来看,使用这样的正则表达式可能更安全:

      <?php
      if (preg_match("/facebook|facebot/i", $_SERVER['HTTP_USER_AGENT'])){
         do_something();
      }
      ?>
      

      您可以在他们的文档中找到有关 Facebook 爬虫的更多信息:https://developers.facebook.com/docs/sharing/webmasters/crawler

      【讨论】:

        【解决方案6】:

        首先,您不应该使用 in_array,因为您需要拥有完整的用户代理,而不仅仅是一个子集,因此会很快因更改而中断(即,如果您遵循当前首选答案,来自 facebook 的 1.2 版将不起作用)。遍历数组而不是使用正则表达式模式也更慢。

        毫无疑问,您稍后会想要寻找更多的机器人,所以我给出了下面的示例,其中 2 个机器人名称以管道 | 的模式拆分。象征。最后的 /i 使其不区分大小写。

        你也不应该使用 $_SERVER['HTTP_USER_AGENT'];但你应该先过滤它,以防有人在那里存在一些讨厌的东西。

        $pattern = '/(FacebookExternalHit|GoogleBot)/i';
        $agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_ENCODED);
            if(preg_match($pattern,$agent)){
              echo "found one of the patters"; 
           }
        

        更安全、更快的代码。

        【讨论】:

          【解决方案7】:

          请注意有时代理是visionutils/0.2。你也应该检查一下。

          【讨论】:

          • 有这方面的证据吗?
          • 当我编写脚本来检测 facebook 并向他展示不同的内容时,有时用户代理是 visionutils/0.2。
          • 大概是一个人脸识别机器人来抓取任何可能有人物的图像。
          【解决方案8】:

          如果您想阻止 facebook bot 访问您的网站(假设您使用的是 Apache),请将其添加到您的 .htaccess 文件中:

          <Limit GET POST>
          BrowserMatchNoCase "Feedfetcher-Google" feedfetcher
          BrowserMatchNoCase "facebookexternalhit" facebook
          order deny,allow
          deny from env=feedfetcher
          deny from env=facebook
          </Limit>
          

          它还阻止了谷歌的 feedfetcher,它也可用于廉价的 DDoSing。

          【讨论】:

            【解决方案9】:

            PHP 中的另一种通用方法

            $agent = $_SERVER['HTTP_USER_AGENT'];
            $agent = trim($agent);
            $agent = strtolower($agent);
            if (
            strpos($agent,'facebookexternalhit/1.1')===0
            || strpos($agent,'facebookexternalhit/1.0')===0
            ){
                //probably facebook
            }else{
                //probably not facebook
            }
            

            【讨论】:

              【解决方案10】:

              简短的解决方案是检查模式,而不是每次都将所有混乱都加载给用户

              <?php
                  # Facebook optimized stuff
                  if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) {
                      $buffer.='<link rel="image_src" href="images/site_thumbnail.png" />';
                  }
              ?>
              

              【讨论】:

              • 不要忘记!empty($_SERVER['HTTP_USER_AGENT']),因为在客户端不发送此标头时未设置$_SERVER['HTTP_USER_AGENT']
              【解决方案11】:

              “Facebook 的用户代理字符串是 facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)...”

              小而重要的修正 -> Facebook 外部点击使用 2 个不同的用户代理:

              facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
              facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 
              

              仅将 fitler 设置为 1.1 可能会导致 1.0 版本出现过滤问题。

              有关 Facebook Bot(和其他机器人)的更多信息,请参阅 Botopedia.org - 一个社区来源的机器人目录,由 Incapsula 提供支持。

              除了用户代理数据,该目录还提供 IP 验证选项,允许您交叉验证 IP/用户代理,从而有助于防止假冒尝试。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-09-25
                • 2013-08-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多