【问题标题】:detect bot using php使用 php 检测机器人
【发布时间】:2016-03-17 20:41:32
【问题描述】:

我有一个名为 index.php 的页面,我有一个用于检测机器人的脚本,但它不能正常工作。如果机器人访问 index.php,那么我希望将welcome.php 包含在内。如果是原始用户,则不应包含welcome.php。 这是我迄今为止尝试过的:

   function is_bot(){
   $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
    "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
    "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
    "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
    "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
    "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
    "Mediapartners-Google", "Sogou web spider", "WebAlta 
     Crawler","TweetmemeBot", "Butterfly", "Twitturls", "Me.dium", 
     "Twiceler", "Purebot", "facebookexternalhit",
    "Yandex", "CatchBot", "W3C_Validator", "Jigsaw","PostRank", 
    "Purebot", "Twitterbot",
    "Voyager", "zelist", "pingdom", "favicon");

   foreach($botlist as $bot){
    if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
    return true;    // Is a bot
    }
   return false;    // Not a bot
    }

这是我遇到的主要问题 - 以下方法不起作用:

  if (is_bot()==true) {
session_destroy(); include_once('welcome.php'); exit; }

接下来,我试了一下,还是不行:

  if (is_bot()) {
  session_destroy(); include_once('welcome.php'); exit; }

请就这种情况的任何解决方案提出建议。

只要我这样使用它就可以工作

 if (is_bot())
 $isbot = 1;
 else
 $isbot = 0;

【问题讨论】:

  • 您是否收到任何错误消息(例如 welcome.php 未找到)?
  • 究竟是什么“没用”。您收到 PHP 错误消息了吗?你得到了意想不到的结果吗?如果是这样,你想要什么结果?例如,对于用户代理中带有“Twitterbot”的请求,我期望为真,但结果为假。帮助我们帮助您。
  • 我会使用 stripos 并检查返回值是否 > 0 甚至 >= 0。您是否已经考虑过 robots.txt ?
  • @BareNakedCoder 我没有收到任何错误,因为服务器正在跳过该功能
  • 你是如何测试它的?您是否尝试打印出$_SERVER['HTTP_USER_AGENT'] 以确保您要搜索的字符串在其中?

标签: php bots


【解决方案1】:

以下代码100% 在我的网站上运行

function isBotDetected() {

    if ( preg_match('/abacho|accona|AddThis|AdsBot|ahoy|AhrefsBot|AISearchBot|alexa|altavista|anthill|appie|applebot|arale|araneo|AraybOt|ariadne|arks|aspseek|ATN_Worldwide|Atomz|baiduspider|baidu|bbot|bingbot|bing|Bjaaland|BlackWidow|BotLink|bot|boxseabot|bspider|calif|CCBot|ChinaClaw|christcrawler|CMC\/0\.01|combine|confuzzledbot|contaxe|CoolBot|cosmos|crawler|crawlpaper|crawl|curl|cusco|cyberspyder|cydralspider|dataprovider|digger|DIIbot|DotBot|downloadexpress|DragonBot|DuckDuckBot|dwcp|EasouSpider|ebiness|ecollector|elfinbot|esculapio|ESI|esther|eStyle|Ezooms|facebookexternalhit|facebook|facebot|fastcrawler|FatBot|FDSE|FELIX IDE|fetch|fido|find|Firefly|fouineur|Freecrawl|froogle|gammaSpider|gazz|gcreep|geona|Getterrobo-Plus|get|girafabot|golem|googlebot|\-google|grabber|GrabNet|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|HTTrack|ia_archiver|iajabot|IDBot|Informant|InfoSeek|InfoSpiders|INGRID\/0\.1|inktomi|inspectorwww|Internet Cruiser Robot|irobot|Iron33|JBot|jcrawler|Jeeves|jobo|KDD\-Explorer|KIT\-Fireball|ko_yappo_robot|label\-grabber|larbin|legs|libwww-perl|linkedin|Linkidator|linkwalker|Lockon|logo_gif_crawler|Lycos|m2e|majesticsEO|marvin|mattie|mediafox|mediapartners|MerzScope|MindCrawler|MJ12bot|mod_pagespeed|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|NationalDirectory|naverbot|NEC\-MeshExplorer|NetcraftSurveyAgent|NetScoop|NetSeer|newscan\-online|nil|none|Nutch|ObjectsSearch|Occam|openstat.ru\/Bot|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pingdom|pinterest|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|rambler|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Scrubby|Search\-AU|searchprocess|search|SemrushBot|Senrigan|seznambot|Shagseeker|sharp\-info\-agent|sift|SimBot|Site Valet|SiteSucker|skymob|SLCrawler\/2\.0|slurp|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|spider|suke|tach_bw|TechBOT|TechnoratiSnoop|templeton|teoma|titin|topiclink|twitterbot|twitter|UdmSearch|Ukonline|UnwindFetchor|URL_Spider_SQL|urlck|urlresolver|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|wapspider|WebBandit\/1\.0|webcatcher|WebCopier|WebFindBot|WebLeacher|WebMechanic|WebMoose|webquest|webreaper|webspider|webs|WebWalker|WebZip|wget|whowhere|winona|wlm|WOLP|woriobot|WWWC|XGET|xing|yahoo|YandexBot|YandexMobileBot|yandex|yeti|Zeus/i', $_SERVER['HTTP_USER_AGENT'])
    ) {
        return true; // 'Above given bots detected'
    }

    return false;

} // End :: isBotDetected()

【讨论】:

    【解决方案2】:

    我很确定问题是代码确实可以工作(尽管优化和格式化很差 - @Imran 的解决方案更简洁)但是您测试它不正确。

    您的 UA 字符串不包含“bot”字符串 - 您不是服务器。像这样使用 Google Chrome 开发工具;

    1. F12

    2. CTRL + SHIFT + M

    3. 顶部的UA框 并更改您的 UA 字符串以假装是其他人,例如“Googlebot”,然后对其进行测试。

    仅仅通过访问一个网站并导航回您的网站并不会模仿来自该网站的“机器人请求”,它仍然只是您!

    【讨论】:

    • 你重复了 OP 的代码。 if() 没有开口{,所以真正返回后的} 正在终止foreach。数大括号。你有 2x{ 和 3x} - 例如语法错误。
    • 是的。 op 糟糕的缩进也让我失望了。
    • @Benjy1996 检查bot后如何包含welcome.php?
    • 您在帖子中使用的两种原始方式中的任何一种,我认为这不是问题if (is_bot()) { session_destroy(); include_once('welcome.php'); exit; } 应该可以正常工作
    • 试试@Imran 的解决方案
    【解决方案3】:

    最好改进你的 is_bot 函数并使用正则表达式来代替冗长的忙碌搜索。

    像下面这样的东西可能更有用。

    function is_bot(){
        preg_match('/bot|curl|spider|google|twitter^$/i', $_SERVER['HTTP_USER_AGENT'], $matches);
    
        return (empty($matches)) ? false : true;
    }
    

    【讨论】:

    • 是的,但现在 google bot 说网站无法访问
    • 我是通过手机输入的,您可以在机器人列表中修改名称,例如 google|twitteer 不是正确的机器人名称。另外请尝试将empty($matches) 替换为isset($matches[0])。还在用手机打字。我要睡觉了。
    • 抱歉,我以为网站无法访问。为此,请尝试对其进行一些改进,但希望它会帮助您实现您尝试做的事情:) 现在是凌晨 2:30 睡觉了。
    • 如果解决了您的问题或为您指明了方向,请记住接受该解决方案。
    猜你喜欢
    • 2013-07-21
    • 2010-10-15
    • 2016-07-27
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多