在Node Express中检测社交机器人

Detect social bots in Node Express

本文关键字:机器人 检测 Node Express      更新时间:2023-09-26

我正在尝试检测以下两个选项中的任何一个:

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

我看到过类似的问题(如何识别Facebook用户代理),但在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");
});

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

截至目前,Facebook表示他们有三种类型的用户代理头值(请查看Facebook爬网程序),twitter也有一个版本的用户代理(请查看twitter URL爬网和缓存),下面的例子应该涵盖这两个机器人。

节点

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);

您可以使用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);

此node-express中间件将分析一组不同的用户代理字符串,并为您提供一种"bot==true"或"desktop==true"的确定方法。我还没有使用过它,自述文件听起来只是一个试验项目,所以我不知道它将如何维护,但它会检测到各种机器人。

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