Files
wp_hardware_tracker/wp-hardware-tracker.php
2025-04-12 16:42:49 +08:00

317 lines
11 KiB
PHP

<?php
/*
Plugin Name: WP Hardware Tracker
Description: 访客UA收集,硬件级追踪,获取高熵数据,智能解析GeoIP属地。
Version: 2.0
Author: Hansjakob Florian
*/
if (!defined('ABSPATH')) exit;
// 加载依赖库
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/includes/geoip/class-geoip-resolver.php';
// 加载访客信息展示 UI
require_once plugin_dir_path(__FILE__) . 'includes/dashboard/class-ui.php';
new Hardware_Tracker_UI();
// 待开发。。。
// ==================== 数据库设置 ====================
register_activation_hook(__FILE__, 'hardware_tracker_create_table');
function hardware_tracker_create_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'hardware_visitors';
$charset = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
os_name VARCHAR(50) NOT NULL DEFAULT 'unknown',
os_version VARCHAR(50) NOT NULL DEFAULT 'unknown',
cpu_arch VARCHAR(20) NOT NULL DEFAULT 'unknown',
cpu_cores SMALLINT NOT NULL DEFAULT 0,
gpu_vendor VARCHAR(50) NOT NULL DEFAULT 'unknown',
gpu_model VARCHAR(100) NOT NULL DEFAULT 'unknown',
ip VARCHAR(45) NOT NULL DEFAULT '0.0.0.0',
timezone VARCHAR(50) NOT NULL DEFAULT 'unknown',
user_agent TEXT NOT NULL,
browser_name VARCHAR(50) NOT NULL DEFAULT 'unknown',
browser_version VARCHAR(50) NOT NULL DEFAULT 'unknown',
ua_ch TEXT NOT NULL,
country VARCHAR(50) NOT NULL DEFAULT 'unknown',
region VARCHAR(50) NOT NULL DEFAULT 'unknown',
city VARCHAR(50) NOT NULL DEFAULT 'unknown',
district VARCHAR(50) NOT NULL DEFAULT 'unknown',
geo_timezone VARCHAR(50) NOT NULL DEFAULT 'unknown',
latitude DECIMAL(10,6) NOT NULL DEFAULT 0.0,
longitude DECIMAL(10,6) NOT NULL DEFAULT 0.0,
created_at DATETIME NOT NULL,
PRIMARY KEY (id)
) $charset;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建数据目录
if (!file_exists(plugin_dir_path(__FILE__) . 'data')) {
mkdir(plugin_dir_path(__FILE__) . 'data', 0755, true);
}
}
// ==================== 数据收集处理 ====================
function hardware_tracker_get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
$proxy_headers = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED'
];
foreach ($proxy_headers as $header) {
if (!empty($_SERVER[$header])) {
$ip_list = explode(',', $_SERVER[$header]);
foreach ($ip_list as $ip_candidate) {
$ip_candidate = trim($ip_candidate);
if (filter_var($ip_candidate, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) {
return $ip_candidate;
}
}
}
}
return $ip;
}
// 数据入库函数
function hardware_tracker_insert_data($data) {
global $wpdb;
$table = $wpdb->prefix . 'hardware_visitors';
// GeoIP解析
$geo_data = [
'country' => 'unknown',
'region' => 'unknown',
'city' => 'unknown',
'district' => 'unknown',
'latitude' => 0.0,
'longitude' => 0.0,
'geo_timezone' => 'unknown'
];
if (get_option('hardware_tracker_geoip_enabled', 0)) {
$resolver = new Hardware_Tracker_GeoIP_Resolver();
$location = $resolver->resolve_ip($data['ip']);
if ($location && is_array($location)) {
$geo_data = array_merge($geo_data, $location); // 安全合并
}
}
if (!get_option('hardware_tracker_ua_ch_enabled', 1)) {
$data['ua_ch'] = '{}'; // 关闭时存储空JSON
}
// 合并所有数据
$insert_data = array_merge($data, $geo_data);
$format = [
'%s', '%s', '%s', '%d', // os_name, os_version, cpu_arch, cpu_cores
'%s', '%s', // gpu_vendor, gpu_model
'%s', '%s', // ip, timezone
'%s', // user_agent
'%s', '%s', // browser_name, browser_version
'%s', // ua_ch
'%s', '%s', '%s', '%s', // country, region, city, district
'%f', '%f', '%s', // latitude, longitude, geo_timezone
'%s' // created_at
];
// 执行数据库插入
return $wpdb->insert($table, $insert_data, $format);
}
// ==================== AJAX处理 ====================
add_action('wp_ajax_hardware_tracker', 'hardware_tracker_handle');
add_action('wp_ajax_nopriv_hardware_tracker', 'hardware_tracker_handle');
function hardware_tracker_handle() {
check_ajax_referer('hardware_tracker_nonce', 'security');
$data = [
'os_name' => sanitize_text_field($_POST['os_name'] ?? 'unknown'),
'os_version' => sanitize_text_field($_POST['os_version'] ?? 'unknown'),
'cpu_arch' => sanitize_text_field($_POST['cpu_arch'] ?? 'unknown'),
'cpu_cores' => absint($_POST['cpu_cores'] ?? 0),
'gpu_vendor' => sanitize_text_field($_POST['gpu_vendor'] ?? 'unknown'),
'gpu_model' => sanitize_text_field($_POST['gpu_model'] ?? 'unknown'),
'ip' => hardware_tracker_get_client_ip(),
'timezone' => sanitize_text_field($_POST['timezone'] ?? 'unknown'),
'user_agent' => sanitize_textarea_field($_SERVER['HTTP_USER_AGENT'] ?? ''),
'browser_name' => sanitize_text_field($_POST['browser_name'] ?? 'unknown'),
'browser_version'=> sanitize_text_field($_POST['browser_version'] ?? 'unknown'),
'ua_ch' => sanitize_textarea_field($_POST['ua_ch'] ?? '{}'),
'created_at' => current_time('mysql')
];
hardware_tracker_insert_data($data);
wp_send_json_success(['message' => '数据记录成功']);
}
// ==================== 后台设置 ====================
add_action('admin_menu', 'hardware_tracker_add_settings_menu');
function hardware_tracker_add_settings_menu() {
add_options_page(
'硬件级访客追踪设置',
'硬件级访客追踪',
'manage_options',
'hardware-tracker-settings',
'hardware_tracker_settings_page'
);
}
function hardware_tracker_settings_page() {
?>
<div class="wrap">
<h1>硬件级访客追踪设置</h1>
<form action="options.php" method="post">
<?php
settings_fields('hardware_tracker_options');
do_settings_sections('hardware-tracker-settings');
submit_button('保存配置');
?>
</form>
<div class="card">
<h3>功能状态</h3>
<table class="status-table">
<tr>
<td>GeoIP数据库:</td>
<td>
<?php if (file_exists(plugin_dir_path(__FILE__) . 'data/GeoLite2-City.mmdb')): ?>
<span class="dashicons dashicons-yes-alt" style="color:#46b450;"></span> 已安装
<?php else: ?>
<span class="dashicons dashicons-warning" style="color:#dc3232;"></span> 未安装
<?php endif; ?>
</td>
</tr>
<tr>
<td>UA客户端提示:</td>
<td>
<?php if (get_option('hardware_tracker_ua_ch_enabled', 1)): ?>
<span class="dashicons dashicons-yes-alt" style="color:#46b450;"></span> 已启用
<?php else: ?>
<span class="dashicons dashicons-dismiss" style="color:#dc3232;"></span> 已禁用
<?php endif; ?>
</td>
</tr>
</table>
<h4>数据库路径</h4>
<code><?= plugin_dir_path(__FILE__) ?>data/GeoLite2-City.mmdb</code>
</div>
</div>
<style>
.status-table {
border-spacing: 0;
width: 100%;
}
.status-table td {
padding: 8px 0;
border-bottom: 1px solid #eee;
}
.status-table td:first-child {
width: 150px;
font-weight: 500;
}
</style>
<?php
}
add_action('admin_init', 'hardware_tracker_register_settings');
function hardware_tracker_register_settings() {
// GeoIP设置
register_setting(
'hardware_tracker_options',
'hardware_tracker_geoip_enabled',
['sanitize_callback' => 'absint']
);
// UA客户端提示设置
register_setting(
'hardware_tracker_options',
'hardware_tracker_ua_ch_enabled',
['sanitize_callback' => 'absint']
);
add_settings_section(
'geoip_settings',
'数据收集设置',
function() {
echo '<p>控制不同类型数据的收集功能</p>';
},
'hardware-tracker-settings'
);
// GeoIP字段
add_settings_field(
'geoip_enabled',
'地理位置解析',
function() {
$enabled = get_option('hardware_tracker_geoip_enabled', 0);
echo '<label><input type="checkbox" name="hardware_tracker_geoip_enabled" value="1" '
. checked(1, $enabled, false) . '> 启用IP地理位置解析</label>';
},
'hardware-tracker-settings',
'geoip_settings'
);
// UA客户端提示字段
add_settings_field(
'ua_ch_enabled',
'高级浏览器特征',
function() {
$enabled = get_option('hardware_tracker_ua_ch_enabled', 1);
echo '<label><input type="checkbox" name="hardware_tracker_ua_ch_enabled" value="1" '
. checked(1, $enabled, false) . '> 收集UA客户端提示数据</label>';
},
'hardware-tracker-settings',
'geoip_settings'
);
}
// ==================== 前端脚本 ====================
add_action('wp_enqueue_scripts', 'hardware_tracker_scripts');
function hardware_tracker_scripts() {
wp_enqueue_script(
'hardware-tracker',
plugins_url('/assets/tracker.js', __FILE__),
[],
'2.0',
['in_footer' => true]
);
wp_localize_script('hardware-tracker', 'hardwareTracker', [
'ajax_url' => admin_url('admin-ajax.php'),
'security' => wp_create_nonce('hardware_tracker_nonce'),
'ua_ch_enabled' => (int)get_option('hardware_tracker_ua_ch_enabled', 1)
]);
}
// ==================== 卸载处理 ====================
register_uninstall_hook(__FILE__, 'hardware_tracker_uninstall');
function hardware_tracker_uninstall() {
global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}hardware_visitors");
delete_option('hardware_tracker_geoip_enabled');
delete_option('hardware_tracker_ua_ch_enabled');
}