PHP-告诉机器人除人类访客以外的其他统计信息?

我希望发布自己的简单网络统计脚本。

据我所知,路上唯一的主要障碍就是告诉人类游客除了机器人。 我想要一个不需要定期维护的解决方案(即,我不想使用与机器人相关的用户代理更新文本文件)。

有没有像Akismet这样的垃圾邮件开放服务?还是有一个专门用于识别蜘蛛和机器人并提供频繁更新的PHP项目?

需要说明的是:我不是要阻止机器人。 我不需要100%的防水效果。 我只是  希望从统计数据中排除尽可能多的人。 在  知道解析用户代理是一个  选项,但保持模式以  解析工作量很大。 我的  问题是是否有  做到这一点的项目或服务  已经。

赏金:我想将其作为该主题的参考问题。 最佳/最原始/技术上可行的贡献将获得赏金。

Pekka 웃 asked 2019-11-14T23:15:20Z
15个解决方案
72 votes

人类和机器人会做类似的事情,但是机器人会做人类不会做的事情。 让我们尝试识别那些东西。 在研究行为之前,让我们接受RayQuang的评论是有用的。 如果访问者具有漫游器的用户代理字符串,则可能是漫游器。 我无法将使用“ Google Crawler”(或类似的东西)的任何人想象成UA,除非他们正在努力破坏某些东西。 我知道您不希望手动更新列表,而是自动拉动一个列表应该是好的,即使它在接下来的十年中保持陈旧,也将有所帮助。

有些人已经提到了Javascript和图像加载,但是Google会同时进行。 我们必须假设现在有几个机器人可以同时做这两个,所以这些不再是人类的指标。 但是,僵尸程序仍将唯一执行的操作是跟随“不可见”链接。 以用户无法看到的非常偷偷摸摸的方式链接到页面。 如果能够做到这一点,我们就有了一个机器人。

漫游器通常会(尽管并非总是如此)尊重robots.txt。 用户不在乎robots.txt,我们可以假定检索robots.txt的任何人都是机器人。 不过,我们可以更进一步,将虚拟CSS页面链接到robots.txt排除的页面。 如果我们的普通CSS已加载,但我们的虚拟CSS没有加载,那肯定是机器人。 您必须通过IP构建(可能是内存中的)负载表,并进行不包含在匹配中的表,但这确实是一个可靠的判断。

因此,要使用所有这些方法:通过ip地址维护bot的数据库表,可能会有时间戳限制。 添加不可见链接之后的所有内容,添加可加载“真实” CSS但忽略robots.txt CSS的所有内容。 也许还要添加所有robots.txt下载器。 过滤用户代理字符串作为最后一步,并考虑使用它来进行快速的统计分析,并查看这些方法在识别我们所知道的机器人方面发挥了多大作用。

Jeff Ferland answered 2019-11-14T23:15:32Z
21 votes

最简单的方法是检查其用户代理中是否包含“ bot”或“ spider”。大多数这样做。

Yacoby answered 2019-11-14T23:15:50Z
13 votes

编辑(10年后):正如Lukas在评论框中所说,今天几乎所有的爬虫都支持javascript,因此我删除了一段,指出如果该站点是基于JS的,则大多数自动程序都会被自动删除。

您可以关注一个机器人列表,并将其用户代理添加到过滤列表中。

看一下这个机器人列表。

这个用户代理列表也很好。 只要去掉所有的B,就可以开始了。

编辑:由eSniff完成的惊人工作在上面具有“可以查询和更容易解析的形式在上面的列表。robotstxt.org/db/all.txt每个新的Bot由robot-id:XXX定义。您应该能够 每周下载一次,并将其解析为脚本可以使用的内容”,例如您可以在他的评论中阅读。

希望能帮助到你!

Frankie answered 2019-11-14T23:16:17Z
11 votes

考虑一个伪装成CSS背景图像的PHP stats脚本(给出正确的响应标头-至少是内容类型和缓存控件-,但要写一个空图像)。

一些机器人可以解析JS,但是肯定没有人加载CSS图像。 一个陷阱(与JS一样)是,您将以此排除基于文本的浏览器,但这不到万维网人口的1%。 此外,与CSS禁用的客户端(移动设备!)相比,禁用CSS的客户端肯定更少。

为了在更特殊的情况下使更高级的机器人(例如Google,Yahoo等)将来能够抓取它们,请在robots.txt中禁止使用CSS镜像(无论如何,更好的机器人都应尊重)。

BalusC answered 2019-11-14T23:16:44Z
6 votes

我在统计/计数器应用中使用以下内容:

<?php
    function is_bot($user_agent) {
        return preg_match('/(abot|dbot|ebot|hbot|kbot|lbot|mbot|nbot|obot|pbot|rbot|sbot|tbot|vbot|ybot|zbot|bot\.|bot\/|_bot|\.bot|\/bot|\-bot|\:bot|\(bot|crawl|slurp|spider|seek|accoona|acoon|adressendeutschland|ah\-ha\.com|ahoy|altavista|ananzi|anthill|appie|arachnophilia|arale|araneo|aranha|architext|aretha|arks|asterias|atlocal|atn|atomz|augurfind|backrub|bannana_bot|baypup|bdfetch|big brother|biglotron|bjaaland|blackwidow|blaiz|blog|blo\.|bloodhound|boitho|booch|bradley|butterfly|calif|cassandra|ccubee|cfetch|charlotte|churl|cienciaficcion|cmc|collective|comagent|combine|computingsite|csci|curl|cusco|daumoa|deepindex|delorie|depspid|deweb|die blinde kuh|digger|ditto|dmoz|docomo|download express|dtaagent|dwcp|ebiness|ebingbong|e\-collector|ejupiter|emacs\-w3 search engine|esther|evliya celebi|ezresult|falcon|felix ide|ferret|fetchrover|fido|findlinks|fireball|fish search|fouineur|funnelweb|gazz|gcreep|genieknows|getterroboplus|geturl|glx|goforit|golem|grabber|grapnel|gralon|griffon|gromit|grub|gulliver|hamahakki|harvest|havindex|helix|heritrix|hku www octopus|homerweb|htdig|html index|html_analyzer|htmlgobble|hubater|hyper\-decontextualizer|ia_archiver|ibm_planetwide|ichiro|iconsurf|iltrovatore|image\.kapsi\.net|imagelock|incywincy|indexer|infobee|informant|ingrid|inktomisearch\.com|inspector web|intelliagent|internet shinchakubin|ip3000|iron33|israeli\-search|ivia|jack|jakarta|javabee|jetbot|jumpstation|katipo|kdd\-explorer|kilroy|knowledge|kototoi|kretrieve|labelgrabber|lachesis|larbin|legs|libwww|linkalarm|link validator|linkscan|lockon|lwp|lycos|magpie|mantraagent|mapoftheinternet|marvin\/|mattie|mediafox|mediapartners|mercator|merzscope|microsoft url control|minirank|miva|mj12|mnogosearch|moget|monster|moose|motor|multitext|muncher|muscatferret|mwd\.search|myweb|najdi|nameprotect|nationaldirectory|nazilla|ncsa beta|nec\-meshexplorer|nederland\.zoek|netcarta webmap engine|netmechanic|netresearchserver|netscoop|newscan\-online|nhse|nokia6682\/|nomad|noyona|nutch|nzexplorer|objectssearch|occam|omni|open text|openfind|openintelligencedata|orb search|osis\-project|pack rat|pageboy|pagebull|page_verifier|panscient|parasite|partnersite|patric|pear\.|pegasus|peregrinator|pgp key agent|phantom|phpdig|picosearch|piltdownman|pimptrain|pinpoint|pioneer|piranha|plumtreewebaccessor|pogodak|poirot|pompos|poppelsdorf|poppi|popular iconoclast|psycheclone|publisher|python|rambler|raven search|roach|road runner|roadhouse|robbie|robofox|robozilla|rules|salty|sbider|scooter|scoutjet|scrubby|search\.|searchprocess|semanticdiscovery|senrigan|sg\-scout|shai\'hulud|shark|shopwiki|sidewinder|sift|silk|simmany|site searcher|site valet|sitetech\-rover|skymob\.com|sleek|smartwit|sna\-|snappy|snooper|sohu|speedfind|sphere|sphider|spinner|spyder|steeler\/|suke|suntek|supersnooper|surfnomore|sven|sygol|szukacz|tach black widow|tarantula|templeton|\/teoma|t\-h\-u\-n\-d\-e\-r\-s\-t\-o\-n\-e|theophrastus|titan|titin|tkwww|toutatis|t\-rex|tutorgig|twiceler|twisted|ucsd|udmsearch|url check|updated|vagabondo|valkyrie|verticrawl|victoria|vision\-search|volcano|voyager\/|voyager\-hc|w3c_validator|w3m2|w3mir|walker|wallpaper|wanderer|wauuu|wavefire|web core|web hopper|web wombat|webbandit|webcatcher|webcopy|webfoot|weblayers|weblinker|weblog monitor|webmirror|webmonkey|webquest|webreaper|websitepulse|websnarf|webstolperer|webvac|webwalk|webwatch|webwombat|webzinger|wget|whizbang|whowhere|wild ferret|worldlight|wwwc|wwwster|xenu|xget|xift|xirq|yandex|yanga|yeti|yodao|zao\/|zippp|zyborg|\.\.\.\.)/i', $user_agent);
    }

    //example usage
    if (! is_bot($_SERVER["HTTP_USER_AGENT"])) echo "it's a human hit!";
?>

我删除了指向原始代码源的链接,因为现在它可以重定向到food应用程序。

chimeraha answered 2019-11-14T23:17:04Z
4 votes

我目前使用AWstats和Webalizer来监视我的日志文件中的Apasce2,到目前为止,他们已经做得很好。 如果您愿意,可以查看他们的源代码,因为它是一个开源项目。

您可以从[http://awstats.sourceforge.net]获取源,也可以查看FAQ [http://awstats.sourceforge.net/docs/awstats_faq.html]

希望能有所帮助,雷光

Rayhaan Jaufeerally answered 2019-11-14T23:17:32Z
4 votes

检查用户代理将使您警惕诚实的僵尸程序,但不会警告垃圾邮件发送者。

要判断不诚实的机器人发出了哪些请求,最好的选择(基于该人的有趣研究)是捕捉Javascript焦点事件。

如果触发焦点事件,则几乎可以肯定该页面是由人类加载的。

  • 编辑:的确,关闭Javascript的人不会显示为人类,但这并不是Web用户的很大一部分。
  • Edit2:当前的机器人也可以执行Javascript,至少Google可以。
TehShrike answered 2019-11-14T23:17:57Z
3 votes

与其尝试维护一个不可能冗长的蜘蛛用户代理列表,我们而是寻找能够暗示人类行为的事物。 这些原则是,我们将“会话计数”分为两个数字:单页会话数和多页会话数。 我们删除一个会话cookie,并使用它来确定多页会话。 我们还会删除一个持久的“机器ID” cookie; 返回用户(找到的机器ID cookie)被视为多页会话,即使他们在该会话中仅查看一页也是如此。 您可能还具有其他暗示“人类”访问者的特征-例如,推荐人是Google(尽管我认为MS Search bot睫毛膏作为标准UserAgent并带有实际关键字,以检查该网站是否显示不同的内容[ 给予他们的机器人],并且这种行为看起来很像人类!)

当然,这并非无懈可击,特别是如果您有很多人到达并“点击”,那么这对于您来说并不是一个很好的统计数据,或者您是否拥有大量关闭Cookie的人(在我们的情况下, 如果未启用会话Cookie,将无法使用我们的[购物车]网站)。

从一位客户的数据中我们发现,每天的单次会话计数遍布各地-每天的数量级差异很大; 但是,如果我们每天从多页会话中减去1,000,那么我们得出的近似线性比率是每个下订单4个多页会话/每个购物篮两个会话。 我不知道每天还有另外1000个多页会话是什么!

Kristen answered 2019-11-14T23:18:19Z
2 votes

使用javascript记录鼠标的移动和滚动。 从记录的数据中可以看出是人类还是机器人。 除非该机器人真的非常复杂,并且模仿人类的鼠标动作。

neoneye answered 2019-11-14T23:18:37Z
1 votes

前提-已设置引荐来源网址

apache级别:

LogFormat "%U %{Referer}i %{%Y-%m-%d %H:%M:%S}t" human_log
RewriteRule ^/human/(.*)   /b.gif [L]
SetEnv human_session 0

# using referrer
SetEnvIf Referer "^http://yoursite.com/" human_log_session=1

SetEnvIf Request_URI "^/human/(.*).gif$" human_dolog=1
SetEnvIf human_log_session 0 !human_dolog
CustomLog logs/human-access_log human_log env=human_dolog

在网页中,嵌入/human-access_log
如果是机器人,则不太可能设置引荐来源网址(这是灰色区域)。
如果使用浏览器地址栏直接命中,则不包括在内。

在每天结束时,/human-access_log应该包含实际上是人工页面浏览的所有引荐来源网址。

为了安全起见,Apache日志中引荐来源网址的哈希值应与图片名称相符

ajreal answered 2019-11-14T23:19:15Z
1 votes

现在我们有了各种各样的无头浏览器。 Chrome,Firefox或其他可以执行您网站上所有JS的浏览器。 因此,任何基于JS的检测均将无效。

我认为最自信的方法是跟踪网站上的行为。 如果我要写一个机器人并想绕过检查,我将只使用无头镀铬来模仿滚动,鼠标移动,悬停,浏览器历史记录等事件。 为了将其提升到一个新的水平,即使无头chrome在请求中添加了一些有关“无头”模式的提示,我也可以派生chrome repo,进行更改并构建自己的二进制文件,这将毫无痕迹。

我认为这可能是对真实检测的最接近的答案,无论它是否是人为的,都不由访客采取任何行动:

[https://developers.google.com/recaptcha/docs/invisible]

我不确定这背后的技术,但我相信Google可以通过使用其ML算法分析数十亿个请求来检测行为是否是人性或机器人性,从而做得很好。

尽管这是一个额外的HTTP请求,但它不会检测到快速反弹的访问者,因此请记住这一点。

Lukas answered 2019-11-14T23:19:47Z
0 votes

您要跟踪的页面中有1x1 gif。 如果已加载,则可能是浏览器。 如果未加载,则可能是脚本。

neoneye answered 2019-11-14T23:20:05Z
0 votes

=? 对不起,误会了。 您可以尝试在我的站点上设置的另一个选项:创建一个具有硬/奇异名称的未链接网页,并分开记录对该网页的访问。 该页面的大部分(如果不是全部)访问者都是机器人,这样您就可以动态创建机器人列表。

原始答案如下(获得负面评价!)

告诉机器人的唯一可靠方法   来自人类的是[CAPTCHAS] [1]。 您可以   如果适合,请使用[reCAPTCHA] [2]。

[1]:   [http://en.wikipedia.org/wiki/Captcha]
[2]:[http://recaptcha.net/]

Ast Derek answered 2019-11-14T23:20:41Z
0 votes

您可以排除来自也请求robots.txt的用户代理的所有请求。所有行为良好的漫游器都将发出这样的请求,但不良的漫游器将逃避检测。

您还会遇到误报的问题-作为人类,我通常不会在浏览器中阅读robots.txt,但是我当然可以。 为了避免这些错误地显示为机器人,您可以将一些常见的浏览器用户代理列入白名单,并认为它们始终是人类。 但这只会变成维护用于浏览器的用户代理列表,而不是维护用于机器人的列表。

因此,此did-they-request-robots.txt方法当然不会提供100%的防水效果,但它可能会提供一些启发式方法,以提供完整的解决方案。

Day answered 2019-11-14T23:21:08Z
-1 votes

我很惊讶没有人建议实施图灵测试。 另一端只有一个与人聊天的框。

程序化解决方案是行不通的:看看PARRY遇到医生时会发生什么

这两个“角色”都是在70年代的AI研究过程中编写的“颤栗”机器人:看看它们可以欺骗一个真实的人以为自己也是一个人多长时间。 帕里(PARRY)角色被塑造成偏执型精神分裂症,《医生》被塑造成定型的心理治疗师。

这是更多背景

MTS answered 2019-11-14T23:21:32Z
translate from https://stackoverflow.com:/questions/1717049/tell-bots-apart-from-human-visitors-for-stats