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

317 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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');
}