什么是爬虫指纹?
- 服务端能够获取到的客户端特征
常见指纹
IP
在用浏览器或其他发送请求的工具发送请求时,服务端能够获取客户端的ip地址
案例:
如图通过调用https://api.ipify.org/?format=json能将自身的外网ip返回出来。说明服务端能够拿到浏览器发起访问时ip。因为返回的数据本质上是仅仅是服务端生成了ip的数据并返回而已。
时区
// 获取当前用户的时区
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(timezone);
UserAgent字符串
浏览器所设置的语言
屏幕分辨率
let screenWidth = window.innerWidth;
let screenHeight = window.innerHeight;
console.log(`Screen Width: ${screenWidth}px`);
console.log(`Screen Height: ${screenHeight}px`);
浏览器及其版本
function getBrowserInfo() {
let userAgent = navigator.userAgent;
let tem;
let matches = userAgent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(matches[1])) {
tem = /\brv[ :]+(\d+)/g.exec(userAgent) || [];
return 'IE ' + (tem[1] || '');
}
if (matches[1] === 'Chrome') {
tem = userAgent.match(/\b(OPR|Edge)\/(\d+)/);
if (tem != null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
}
matches = matches[2] ? [matches[1], matches[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = userAgent.match(/version\/(\d+)/i)) != null) {
matches.splice(1, 1, tem[1]);
}
return matches.join(' ');
}
console.log(getBrowserInfo());
浏览器窗口大小
let documentWidth = document.documentElement.clientWidth;
let documentHeight = document.documentElement.clientHeight;
console.log(`Document Width: ${documentWidth}px`);
console.log(`Document Height: ${documentHeight}px`);
设备所安装的字体
通过创建一个canvas元素,并在其中绘制文本,可以检测特定字体是否可用。如果文本以不同于默认字体的字体呈现,则可以推断该字体已安装。
function isFontInstalled(fontName) {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
// 默认字体和要检测的字体
const defaultFont = 'Arial';
context.font = `72px ${defaultFont}`;
const defaultMetrics = context.measureText('test string');
context.font = `72px ${fontName},${defaultFont}`;
const testMetrics = context.measureText('test string');
// 如果默认字体和测试字体的宽度不同,则字体可能已安装
return defaultMetrics.width !== testMetrics.width;
}
console.log(isFontInstalled('Times New Roman')); // 检测"Times New Roman"字体是否安装