Compare commits
5 Commits
1.x
...
dev_version
| Author | SHA1 | Date | |
|---|---|---|---|
| 0771c54e6d | |||
| b8879c238d | |||
| 44ab3922f1 | |||
| 9bf598102d | |||
| c65a14f7cc |
@@ -1,8 +1,9 @@
|
|||||||
# wp_hardware_tracker
|
# WordPress硬件级访客记录插件
|
||||||
WordPress硬件级访客记录插件
|
该插件最初开发目的在于解决自己被视奸烦恼(雾
|
||||||
|
目前只能在数据库的`wp_hardware_visitors`表中查看,后续会加入可视化面板。
|
||||||
目前只能在数据库的`wp_hardware_visitors`表中查看
|
记录访客CPU架构与核心数,对于非Apple平台可靠度99.9%。
|
||||||
|
记录GPU型号,可靠度90%,目前测试可以读出安卓具体GPU型号。
|
||||||
后续会加入可视化面板
|
记录访客ip,并附加访客时区检测用于排除代理。
|
||||||
|
下个版本会接入geo数据库解析ip归属地。
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const collectData = async () => {
|
const collectData = async () => {
|
||||||
// 基础信息
|
|
||||||
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||||
let osName = 'unknown', osVersion = 'unknown';
|
let osName = 'unknown', osVersion = 'unknown';
|
||||||
|
|
||||||
// 操作系统检测
|
|
||||||
if (navigator.userAgentData) {
|
if (navigator.userAgentData) {
|
||||||
try {
|
try {
|
||||||
const data = await navigator.userAgentData.getHighEntropyValues([
|
const data = await navigator.userAgentData.getHighEntropyValues([
|
||||||
@@ -16,13 +14,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
osName = data.platform.toLowerCase();
|
osName = data.platform.toLowerCase();
|
||||||
osVersion = data.platformVersion;
|
osVersion = data.platformVersion;
|
||||||
|
|
||||||
// Windows版本处理
|
|
||||||
if (osName === 'windows') {
|
if (osName === 'windows') {
|
||||||
const majorVer = parseInt(osVersion.split('.')[0]);
|
const majorVer = parseInt(osVersion.split('.')[0]);
|
||||||
osVersion = majorVer >= 13 ? '11' : majorVer > 0 ? '10' : '8.1';
|
osVersion = majorVer >= 13 ? '11' : majorVer > 0 ? '10' : '8.1';
|
||||||
}
|
}
|
||||||
|
|
||||||
// macOS版本转换
|
|
||||||
if (osName === 'macos') {
|
if (osName === 'macos') {
|
||||||
const macVersionMap = {
|
const macVersionMap = {
|
||||||
'13': 'Ventura', '12': 'Monterey',
|
'13': 'Ventura', '12': 'Monterey',
|
||||||
@@ -31,17 +27,15 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
osVersion = macVersionMap[osVersion.split('.')[0]] || osVersion;
|
osVersion = macVersionMap[osVersion.split('.')[0]] || osVersion;
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.error('High Entropy API error:', e);
|
// 错误静默处理
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 传统User-Agent分析
|
|
||||||
const ua = navigator.userAgent;
|
const ua = navigator.userAgent;
|
||||||
if (/Windows NT 10/.test(ua)) osName = 'windows', osVersion = '10';
|
if (/Windows NT 10/.test(ua)) osName = 'windows', osVersion = '10';
|
||||||
if (/Mac OS X 10_15/.test(ua)) osName = 'macos', osVersion = 'Catalina';
|
if (/Mac OS X 10_15/.test(ua)) osName = 'macos', osVersion = 'Catalina';
|
||||||
if (/iPhone OS 16_/.test(ua)) osName = 'ios', osVersion = '16';
|
if (/iPhone OS 16_/.test(ua)) osName = 'ios', osVersion = '16';
|
||||||
}
|
}
|
||||||
|
|
||||||
// CPU架构检测
|
|
||||||
let cpuArch = 'unknown';
|
let cpuArch = 'unknown';
|
||||||
if (navigator.userAgentData?.architecture) {
|
if (navigator.userAgentData?.architecture) {
|
||||||
cpuArch = navigator.userAgentData.architecture;
|
cpuArch = navigator.userAgentData.architecture;
|
||||||
@@ -50,7 +44,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
/arm|aarch64/i.test(navigator.userAgent) ? 'arm' : 'x86';
|
/arm|aarch64/i.test(navigator.userAgent) ? 'arm' : 'x86';
|
||||||
}
|
}
|
||||||
|
|
||||||
// GPU检测
|
|
||||||
let gpuVendor = 'unknown', gpuModel = 'unknown';
|
let gpuVendor = 'unknown', gpuModel = 'unknown';
|
||||||
try {
|
try {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
@@ -61,18 +54,17 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
gpuModel = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
gpuModel = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.error('GPU detection failed:', e);
|
// 错误静默处理
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送数据
|
fetch(hardwareTrackerDev.ajax_url, {
|
||||||
fetch(hardwareTracker.ajax_url, {
|
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
},
|
},
|
||||||
body: new URLSearchParams({
|
body: new URLSearchParams({
|
||||||
action: 'hardware_tracker',
|
action: 'hardware_tracker_dev',
|
||||||
security: hardwareTracker.security,
|
security: hardwareTrackerDev.security,
|
||||||
os_name: osName,
|
os_name: osName,
|
||||||
os_version: osVersion,
|
os_version: osVersion,
|
||||||
cpu_arch: cpuArch,
|
cpu_arch: cpuArch,
|
||||||
@@ -84,6 +76,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 延迟2秒执行避免影响首屏加载
|
setTimeout(collectData, 300);
|
||||||
collectData();
|
// 延迟300ms错开稳定版
|
||||||
});
|
});
|
||||||
@@ -1,19 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
Plugin Name: 硬件级访客记录
|
Plugin Name: 硬件级访客追踪 (开发版)
|
||||||
Description: 记录操作系统/CPU架构/GPU信息/IP/时区
|
Description: 开发环境专用版本
|
||||||
Version: 1.0
|
Version: 1.0-dev
|
||||||
Author: Hansjakob Florian
|
Author: Hansjakob Florian
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// 安全验证
|
|
||||||
if (!defined('ABSPATH')) exit;
|
if (!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
// 创建数据库表
|
// 开发版数据表
|
||||||
register_activation_hook(__FILE__, 'hardware_tracker_create_table');
|
register_activation_hook(__FILE__, 'hardware_tracker_dev_create_table');
|
||||||
function hardware_tracker_create_table() {
|
function hardware_tracker_dev_create_table() {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
$table_name = $wpdb->prefix . 'hardware_visitors';
|
$table_name = $wpdb->prefix . 'hardware_visitors_dev';
|
||||||
$charset = $wpdb->get_charset_collate();
|
$charset = $wpdb->get_charset_collate();
|
||||||
|
|
||||||
$sql = "CREATE TABLE $table_name (
|
$sql = "CREATE TABLE $table_name (
|
||||||
@@ -37,10 +36,10 @@ function hardware_tracker_create_table() {
|
|||||||
dbDelta($sql);
|
dbDelta($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 数据入库函数
|
// 数据库操作
|
||||||
function hardware_tracker_insert_data($data) {
|
function hardware_tracker_dev_insert_data($data) {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
$table = $wpdb->prefix . 'hardware_visitors';
|
$table = $wpdb->prefix . 'hardware_visitors_dev';
|
||||||
|
|
||||||
$wpdb->insert($table,
|
$wpdb->insert($table,
|
||||||
[
|
[
|
||||||
@@ -64,40 +63,47 @@ function hardware_tracker_insert_data($data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AJAX处理
|
// AJAX处理
|
||||||
add_action('wp_ajax_hardware_tracker', 'hardware_tracker_handle');
|
add_action('wp_ajax_hardware_tracker_dev', 'hardware_tracker_dev_handle');
|
||||||
add_action('wp_ajax_nopriv_hardware_tracker', 'hardware_tracker_handle');
|
add_action('wp_ajax_nopriv_hardware_tracker_dev', 'hardware_tracker_dev_handle');
|
||||||
function hardware_tracker_handle() {
|
function hardware_tracker_dev_handle() {
|
||||||
check_ajax_referer('hardware_tracker_nonce', 'security');
|
check_ajax_referer('hardware_tracker_dev_nonce', 'security');
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'os_name' => isset($_POST['os_name']) ? $_POST['os_name'] : 'unknown',
|
'os_name' => $_POST['os_name'] ?? 'unknown',
|
||||||
'os_version' => isset($_POST['os_version']) ? $_POST['os_version'] : 'unknown',
|
'os_version' => $_POST['os_version'] ?? 'unknown',
|
||||||
'cpu_arch' => isset($_POST['cpu_arch']) ? $_POST['cpu_arch'] : 'unknown',
|
'cpu_arch' => $_POST['cpu_arch'] ?? 'unknown',
|
||||||
'cpu_cores' => isset($_POST['cpu_cores']) ? intval($_POST['cpu_cores']) : 0,
|
'cpu_cores' => isset($_POST['cpu_cores']) ? intval($_POST['cpu_cores']) : 0,
|
||||||
'gpu_vendor' => isset($_POST['gpu_vendor']) ? $_POST['gpu_vendor'] : 'unknown',
|
'gpu_vendor' => $_POST['gpu_vendor'] ?? 'unknown',
|
||||||
'gpu_model' => isset($_POST['gpu_model']) ? $_POST['gpu_model'] : 'unknown',
|
'gpu_model' => $_POST['gpu_model'] ?? 'unknown',
|
||||||
'ip' => $_SERVER['REMOTE_ADDR'],
|
'ip' => $_SERVER['REMOTE_ADDR'],
|
||||||
'timezone' => isset($_POST['timezone']) ? $_POST['timezone'] : 'unknown',
|
'timezone' => $_POST['timezone'] ?? 'unknown',
|
||||||
'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''
|
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? ''
|
||||||
];
|
];
|
||||||
|
|
||||||
hardware_tracker_insert_data($data);
|
hardware_tracker_dev_insert_data($data);
|
||||||
wp_send_json_success();
|
wp_send_json_success();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 前端脚本
|
// 前端资源
|
||||||
add_action('wp_enqueue_scripts', 'hardware_tracker_scripts');
|
add_action('wp_enqueue_scripts', 'hardware_tracker_dev_scripts');
|
||||||
function hardware_tracker_scripts() {
|
function hardware_tracker_dev_scripts() {
|
||||||
wp_enqueue_script(
|
wp_enqueue_script(
|
||||||
'hardware-tracker',
|
'hardware-tracker-dev',
|
||||||
plugins_url('tracker.js', __FILE__),
|
plugins_url('/assets/tracker-dev.js', __FILE__),
|
||||||
[],
|
[],
|
||||||
'1.0',
|
'1.0-dev',
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
wp_localize_script('hardware-tracker', 'hardwareTracker', [
|
wp_localize_script('hardware-tracker-dev', 'hardwareTrackerDev', [
|
||||||
'ajax_url' => admin_url('admin-ajax.php'),
|
'ajax_url' => admin_url('admin-ajax.php'),
|
||||||
'security' => wp_create_nonce('hardware_tracker_nonce')
|
'security' => wp_create_nonce('hardware_tracker_dev_nonce')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 卸载处理
|
||||||
|
register_uninstall_hook(__FILE__, 'hardware_tracker_dev_uninstall');
|
||||||
|
function hardware_tracker_dev_uninstall() {
|
||||||
|
global $wpdb;
|
||||||
|
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}hardware_visitors_dev");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user