facebook - 来自 facebookexternalhit 机器人的过多流量

标签 facebook robot

有谁知道如何让“facebookexternalhit”机器人传播流量?

我们的网站每 45 到 60 分钟就会受到一次攻击,峰值约为 10 次。每秒 400 个请求,来自 facebook netblocks 的 20 到 30 个不同的 IP 地址。在尖峰之间,流量不会消失,但负载是可以接受的。当然,我们不想阻止机器人,但这些尖峰是有风险的。我们更愿意看到机器人随着时间的推移平均分配它的负载。看看它的行为就像 Googlebot 和它的 friend 一样。

我看过相关的错误报告(First BugSecond Bug 和第三个错误 (#385275384858817)),但找不到任何关于如何管理负载的建议。

最佳答案

根据其他答案,来自 Facebook 的半官方词是“suck it”。他们让我感到困惑cannot follow Crawl-delay (是的,我知道它不是“爬虫”,但是在几秒钟内获取 100 页就是爬虫,无论您如何调用它)。

由于不能迎合他们的狂妄自大,并且删除他们的 IP block 是非常严厉的,所以这是我的技术解决方案。

在 PHP 中,对每个请求尽快执行以下代码。

define( 'FACEBOOK_REQUEST_THROTTLE', 2.0 ); // Number of seconds permitted between each hit from facebookexternalhit

if( !empty( $_SERVER['HTTP_USER_AGENT'] ) && strpos(  $_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit' ) === 0 ) {
    $fbTmpFile = sys_get_temp_dir().'/facebookexternalhit.txt';
    if( $fh = fopen( $fbTmpFile, 'c+' ) ) {
        $lastTime = fread( $fh, 100 );
        $microTime = microtime( TRUE );
        // check current microtime with microtime of last access
        if( $microTime - $lastTime < FACEBOOK_REQUEST_THROTTLE ) {
            // bail if requests are coming too quickly with http 503 Service Unavailable
            header( $_SERVER["SERVER_PROTOCOL"].' 503' );
            die;
        } else {
            // write out the microsecond time of last access
            rewind( $fh );
            fwrite( $fh, $microTime );
        }
        fclose( $fh );
    } else {
        header( $_SERVER["SERVER_PROTOCOL"].' 429' );
        die;
    }
}

您可以使用类似以下的命令行对此进行测试:

$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html

欢迎提出改进建议...我猜它们可能是一些并发性问题,而且影响巨大。

关于facebook - 来自 facebookexternalhit 机器人的过多流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11521798/

相关文章:

android - 使用 graph Api 登录 facebook

java - 如何通过 Robot 输入 Unicode 字符

android - 注入(inject)击键

python - 绘制两点之间的圆弧路径

javascript - react native 错误 : undefined is not an object (evaluating 'Object.keys(dataBlob[sectionID])' )

facebook - 当您在 Facebook 上发布链接时,他们如何确定要在摘要中显示的内容?

php - Facebook 动态消息 API

ios - swift 3 facebook sdk 获取好友列表

objective-c - Lego Mindstorm NXT、Cocoa 和 HiTechnic 传感器

controller - 自定义 Controller 在全局启动文件中启动时死亡