5 Commits

Author SHA1 Message Date
Hansjakob R. Florian 0771c54e6d Update tracker-dev.js 2025-04-10 21:54:28 +08:00
Hansjakob R. Florian b8879c238d Update and rename tracker.js to tracker-dev.js 2025-04-10 21:49:49 +08:00
Hansjakob R. Florian 44ab3922f1 Update and rename hardware-tracker.php to hardware-tracker-dev.php 2025-04-10 21:48:02 +08:00
Hansjakob R. Florian 9bf598102d Update hardware-tracker.php 2025-04-10 21:39:21 +08:00
Hansjakob R. Florian c65a14f7cc Update README.md 2025-04-10 21:02:59 +08:00
3 changed files with 51 additions and 52 deletions
+7 -6
View File
@@ -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归属地。
+7 -15
View File
@@ -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");
}