【问题标题】:UDF for detection of bots用于检测机器人的 UDF
【发布时间】:2013-11-27 10:34:45
【问题描述】:

我们在 IIS 8 上有一个小问题。

我们一直在尝试使 cfheader 标记在 503 错误下工作,但每次它似乎都会生成一个由 IIS 生成的简单纯文本页面。

我们已经放弃了让它看起来漂亮的尝试,并提出了一个漂亮的解决方案。无论如何,它的一部分。

我们的想法是在浏览时为机器人生成一个 503 页面,为人类生成一个干净的页面。

下面是代码。

<cfif findNoCase("googlebot", cgi.HTTP_USER_AGENT)>
    <cfset today = dateFormat(now(), 'dd/mm/yy')&timeFormat(now(), 'HH:mm:ss')>
    <cfset urlString = "http://"&cgi.SERVER_NAME>
    <cfif len(trim(cgi.QUERY_STRING))>
      <cfset urlString = urlString&"?"&cgi.QUERY_STRING>
    </cfif>   
    <cfmail to="david.imrie@pistachiomedia.com.au" from="noreply@pistachiomedia.com.au" subject="Google Has Indexed the website #cgi.SERVER_NAME#">
      Google Detected @ #urlString#
    </cfmail>
    <!--- eventually alert the search engine --->
    <cfheader statuscode="503" statustext="Service Temporarily Unavailable"/>
    <cfheader name="retry-after" value="3600" />
<cfelse>

Beautiful page content here

</cfif>

我想知道的是……有人知道可以检测更广泛搜索引擎的 UDF 吗?因为我想让网站在搜索引擎浏览网站时通知我。

谢谢

【问题讨论】:

  • Webtrends,一个网页分析软件,目前在keyword.ini文件中有592个“搜索引擎”。也许stackoverflow.com/questions/677419/…可以帮助你,即使它不是cfml
  • “我想让网站在搜索引擎浏览网站时通知我。” - 那么你很快就会得到 很多的电子邮件。使用 Webtrends/Awstats/Piwik/etc 等现有软件会更好地查看记录和汇总数据。
  • 为什么当机器人尝试索引您的网站时返回 503 错误?您不希望搜索引擎索引您的网站吗?您还可以采取其他措施来防止这种情况发生。
  • 等等,我刚刚重读了一遍——关键是 503; OP 真正想要的是显示一个临时维护页面,但是 IIS 正在破坏他们显示人性化页面 将其作为状态 503 发送的能力,所以他们'正在尝试通过对人类使用 200 和对机器人使用 503 来解决问题,现在他们没有寻求解决实际问题的帮助,而是询问解决方法。 mywiki.wooledge.org/XyProblem
  • 感谢 Peter Boughton,是的,您的总结正确。对不起,如果我的问题有很大的误导性。

标签: coldfusion user-defined-functions


【解决方案1】:

您可以使用 BrowscapCFC。我使用我自己的检测库来专门识别好的和坏的蜘蛛,但是用它来进行额外的检测,它是一个“Crawler”参数(以及“isMobileDevice”。)使用它可以让你识别(并选择性地停止网络请求) 在创建任何会话变量之前。

http://browscapcfc.riaforge.org/

注意:前往http://browscap.org/获取最新的 browscap.ini 文件

以下是返回的其他值:

  • ActiveX 控件
  • 阿尔法
  • Aol版本
  • 背景声音
  • 测试版
  • 浏览器
  • 评论
  • Cookie
  • 爬虫
  • Css版本
  • Device_Maker
  • 设备名称
  • 框架
  • IFrames
  • Java小程序
  • JavaScript
  • 主要版本
  • 小版本
  • 平台
  • Platform_Description
  • Platform_Version
  • RenderingEngine_Description
  • 渲染引擎名称
  • RenderingEngine_Version
  • 表格
  • VBScript
  • 版本
  • Win16
  • Win32
  • Win64
  • 是移动设备
  • isSyndicationReader

【讨论】:

    【解决方案2】:

    这里有几件事:

    1. 我不确定您为什么要返回 503 错误。机器人仍然占用一些相同的服务器资源。

    2. 您应该考虑为机器人禁用会话管理(或至少最小化会话超时)。

    3. 如果您试图阻止机器人,您还应该使用 robots.txt(有关这方面的详细信息,请参阅 http://www.robotstxt.org/)。

      您很可能已经在使用 robots.txt,但以后访问此页面的任何人都应该注意这一点。

    以下 UDF 基于 Ben Nadel's work。不过,其中的数据应该保持更新。

    我最终可能会按照我在自己的 SpamFilter.cfc 中使用的模式执行此操作。不过现在,下面这对 UDF 应该可以帮助您入门。

    请注意,我的 UDF 将 CFSCHEDULE 视为机器人,因为我不想为其使用会话。如果您想阻止所有机器人,则应将其从列表中删除。

    <cffunction name="hasCFCookies" access="public" returntype="boolean">
        <cfreturn ( StructKeyExists(Cookie,"CFID") AND StructKeyExists(Cookie,"CFTOKEN") )>
    </cffunction>
    <cfset request.hasCFCookies = hasCFCookies>
    
    <cffunction name="isBot" access="public" returntype="boolean">
        <!---
    
        Based on code by Ben Nadel:
        http://www.bennadel.com/blog/154-ColdFusion-Session-Management-Revisited-User-vs-Spider-III.htm
        --->
    
        <cfset var UserAgent = "">
    
        <!--- If the user has cookies, this is at least a second request from a real user --->
        <cfif hasCFCookies()>
            <cfreturn false>
        </cfif>
    
        <!--- Real users have user-agent strings --->
        <cfset UserAgent = LCase( CGI.http_user_agent )>
        <cfif NOT Len(UserAgent)>
            <cfreturn true>
        </cfif>
    
    
        <!---
        High-probability checks
        If the user agent has bot or spider in it, it is a bot
        Some specific high-volume spiders listed individually
        --->
        <cfif
                REFind( "bot\b", UserAgent )
            OR  Find( "spider", UserAgent )
            OR  REFind( "search\b", UserAgent )
            OR  UserAgent EQ "CFSCHEDULE"
        >
            <cfreturn true>
        </cfif>
    
        <!---
        If we haven't yet tagged it as a bot and it is on Windows or Mac (including iOs devices), call it a real user.
        If this results in a few spiders showing as real users that is OK
        --->
        <cfif REFind( "\windows\b", UserAgent ) OR REFind( "\bmac", UserAgent )>
            <cfreturn false>
        </cfif>
    
        <!--- If we don't know yet, only figure spiders from a known list of a few --->
        <cfif
                REFind( "\brss", UserAgent )
            OR  Find( "slurp", UserAgent )
            OR  Find( "xenu", UserAgent )
            OR  Find( "mediapartners-google", UserAgent )
            OR  Find( "zyborg", UserAgent )
            OR  Find( "emonitor", UserAgent )
            OR  Find( "jeeves", UserAgent )
            OR  Find( "sbider", UserAgent )
            OR  Find( "findlinks", UserAgent )
            OR  Find( "yahooseeker", UserAgent )
            OR  Find( "mmcrawler", UserAgent )
            OR  Find( "jbrowser", UserAgent )
            OR  Find( "java", UserAgent )
            OR  Find( "pmafind", UserAgent )
            OR  Find( "blogbeat", UserAgent )
            OR  Find( "converacrawler", UserAgent )
            OR  Find( "ocelli", UserAgent )
            OR  Find( "labhoo", UserAgent )
            OR  Find( "validator", UserAgent )
            OR  Find( "sproose", UserAgent )
            OR  Find( "ia_archiver", UserAgent )
            OR  Find( "larbin", UserAgent )
            OR  Find( "psycheclone", UserAgent )
            OR  Find( "arachmo", UserAgent )
        >
            <cfreturn true>
        </cfif>
    
        <cfreturn false>
    </cffunction>
    

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 2013-07-21
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2014-05-22
      相关资源
      最近更新 更多