317 lines
11 KiB
PHP
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');
|
|
}
|