在 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 上部署时出现问题