在 Node Express 中检测社交机器人

Posted

技术标签:

【中文标题】在 Node Express 中检测社交机器人【英文标题】:Detect social bots in Node Express 【发布时间】:2015-05-29 11:34:06 【问题描述】:

我正在尝试检测以下 2 个选项之一:

特定的机器人列表 (FacebookExternalHit|LinkedInBot|TwitterBot|Baiduspider) 任何不支持 Crawable Ajax 规范的机器人

我看到过类似的问题 (How to recognize Facebook User-Agent),但没有任何内容可以解释如何在 Node 和 Express 中执行此操作。

我需要这样的格式:

app.get("*", function(req, res) 
  if (is one of the bots) //serve snapshot
  if (is not one of the bots) res.sendFile(__dirname + "/public/index.html");
);

【问题讨论】:

【参考方案1】:

您可以检查请求对象中的标头User-Agent,并针对不同的机器人测试其值,

截至目前,Facebook 表示他们有三种类型的 User-Agent 标头值(检查 The Facebook Crawler),此外 twitter 有一个带有版本的 User-Agent(检查 Twitter URL Crawling & Caching),下面的示例应该涵盖这两种机器人。

节点

var http = require('http');
var server = http.createServer(function(req, res)

    var userAgent = req.headers['user-agent'];
    if (userAgent.startsWith('facebookexternalhit/1.1') ||
       userAgent === 'Facebot' ||
       userAgent.startsWith('Twitterbot') 

        /* Do something for the bot */
    
);

server.listen(8080);

快递

var http = require('http');
var express = require('express');
var app = express();

app.get('/', function(req, res)

    var userAgent = req.headers['user-agent'];
    if (userAgent.startsWith('facebookexternalhit/1.1') ||
       userAgent === 'Facebot' ||
       userAgent.startsWith('Twitterbot') 

        /* Do something for the bot */
    
);

app.listen(8080);

【讨论】:

【参考方案2】:

您可以使用request.headers 对象检查传入请求是否包含任何特定于该机器人的UA 信息。一个简单的例子。

节点

var http = require('http');

var server = http.createServer(function(req, res)

    if(req.headers['user-agent'] === 'facebookexternalhit/1.1') /* do something for the Facebook bot */


);

server.listen(8080);

快递

var http = require('http');
var express = require('express');
var app = express();

app.get('/', function(req, res)

    if(req.headers['user-agent'] === 'facebookexternalhit/1.1') /* do something for the Facebook bot */


);

app.listen(8080);

【讨论】:

好的,谢谢,但是对于我发布的社交机器人列表,机器人特定的 UA 是什么? 我不确定,但无论您的服务器平台如何,它们都将是相同的。您提供的链接列出了 Facebook 的一个。我建议在其他地方进行调查。 如果你只是用谷歌搜索机器人的用户代理,你很可能会找到结果。【参考方案3】:

这个节点快递中间件将分析一堆不同的用户代理字符串,并给你一个“bot==true”或“desktop==true”的方式来确定。我没用过,自述文件听起来只是一个试验项目,所以我不知道它会如何维护,但它会检测到各种机器人。

https://github.com/rguerreiro/express-device

【讨论】:

npm package 'mobile-detect' 还可以检测机器人,这也是我在项目中使用的。 const MobileDetect = require('mobile-detect'), md = new MobileDetect(req.headers['user-agent']); const isMobile = !!md.phone();让 isBot = md.is("Bot");

以上是关于在 Node Express 中检测社交机器人的主要内容,如果未能解决你的问题,请参考以下文章

Node express 服务器,CORS API 限制,包括我的开发机器的 hosts 文件中的一个条目

node.js 项目在本地机器上工作,在 Heroku 上部署时出现问题

在 Node + Express API 中检测到的打开句柄会阻止 Jest 退出

社交应用如何防范“虚假流量”?安全检测服务帮你快速识别

启动 node.js express 服务器作为服务

机器人静止时,如何禁止继续添加node?