soiz1 commited on
Commit
7ca19d8
·
1 Parent(s): 22e572e

Update web-socket.html

Browse files
Files changed (1) hide show
  1. web-socket.html +28 -38
web-socket.html CHANGED
@@ -4,14 +4,14 @@
4
  <meta charset="UTF-8" />
5
  <title>管理ページ(IP・接続時間表示 + 地図表示)</title>
6
  <script src="https://cdn.socket.io/4.0.1/socket.io.min.js"></script>
7
- <script src="https://soiz1-eruda3.hf.space/eruda.js"></script>
8
- <script>eruda.init();</script>
9
  <link
10
  rel="stylesheet"
11
  href="https://unpkg.com/[email protected]/dist/leaflet.css"
 
12
  />
13
  <script
14
  src="https://unpkg.com/[email protected]/dist/leaflet.js"
 
15
  ></script>
16
  <style>
17
  #map {
@@ -66,7 +66,6 @@
66
  const userCountElem = document.getElementById("userCount");
67
  const tbody = document.getElementById("userTableBody");
68
 
69
- // Leafletマップ初期化(東京近辺)
70
  const map = L.map('map').setView([35.681236, 139.767125], 5);
71
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
72
  maxZoom: 18,
@@ -75,15 +74,27 @@
75
 
76
  let markers = {};
77
 
78
- // --- 簡易テスト用IP座標返し関数 ---
79
  async function fetchGeo(ip) {
80
- const knownIPs = {
81
- "8.8.8.8": {lat: 37.386, lon: -122.0838}, // Google DNS
82
- "1.1.1.1": {lat: -33.4940, lon: 143.2104} // Cloudflare DNS
83
- };
84
- return knownIPs[ip] || null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
- // ----------------------------------
87
 
88
  function createCircleMarker(lat, lon, color, popupText) {
89
  return L.circleMarker([lat, lon], {
@@ -105,13 +116,11 @@
105
 
106
  tbody.innerHTML = "";
107
 
108
- // 既存マーカーを削除
109
- for(let key in markers) {
110
  map.removeLayer(markers[key]);
111
  }
112
  markers = {};
113
 
114
- // IPごとの位置情報を取得
115
  const positions = {};
116
  await Promise.all(Object.entries(userSessions).map(async ([socketId, info]) => {
117
  positions[socketId] = await fetchGeo(info.ip);
@@ -127,7 +136,7 @@
127
  const prevValue = previousSessions[socketId] ? previousSessions[socketId][elementKey] : undefined;
128
  const currValue = info[elementKey];
129
 
130
- let changed = prevValue !== currValue;
131
 
132
  if (changed) {
133
  td.classList.add("highlight");
@@ -137,7 +146,7 @@
137
  return td;
138
  }
139
 
140
- tr.appendChild(createTd(socketId, "socketId"));
141
  tr.appendChild(createTd(info.ip || "-", "ip"));
142
  tr.appendChild(createTd(info.connectTime ? new Date(info.connectTime).toLocaleString() : "-", "connectTime"));
143
  tr.appendChild(createTd(info.disconnectTime ? new Date(info.disconnectTime).toLocaleString() : "-", "disconnectTime"));
@@ -145,10 +154,10 @@
145
  tbody.appendChild(tr);
146
 
147
  const pos = positions[socketId];
148
- if(pos) {
149
  const prevPos = previousSessions[socketId]?.geoPosition;
150
  let changedPos = true;
151
- if(prevPos && Math.abs(prevPos.lat - pos.lat) < 0.0001 && Math.abs(prevPos.lon - pos.lon) < 0.0001) {
152
  changedPos = false;
153
  }
154
  const color = changedPos ? 'red' : 'black';
@@ -159,42 +168,23 @@
159
  }
160
  }
161
 
162
- // マーカー全体を囲んで地図を移動
163
  const markerPositions = Object.values(markers).map(m => m.getLatLng());
164
- if(markerPositions.length > 0) {
165
  const group = L.featureGroup(Object.values(markers));
166
  map.fitBounds(group.getBounds().pad(0.5));
167
  }
168
 
169
- // localStorageに保存
170
  const sessionsToStore = {};
171
- for(const [socketId, info] of Object.entries(userSessions)) {
172
  sessionsToStore[socketId] = {
173
  ...info,
174
  geoPosition: positions[socketId] || null
175
  };
176
  }
177
-
178
  localStorage.setItem(STORAGE_KEY, JSON.stringify(sessionsToStore));
179
  previousSessions = sessionsToStore;
180
  });
181
 
182
- // テスト用に手動発火
183
- window.addEventListener("load", () => {
184
- const testData = {
185
- "test-socket-1": {
186
- ip: "8.8.8.8",
187
- connectTime: Date.now(),
188
- disconnectTime: null
189
- },
190
- "test-socket-2": {
191
- ip: "1.1.1.1",
192
- connectTime: Date.now(),
193
- disconnectTime: null
194
- }
195
- };
196
- socket.emit("userSessionsUpdate", testData);
197
- });
198
  </script>
199
  </body>
200
  </html>
 
4
  <meta charset="UTF-8" />
5
  <title>管理ページ(IP・接続時間表示 + 地図表示)</title>
6
  <script src="https://cdn.socket.io/4.0.1/socket.io.min.js"></script>
 
 
7
  <link
8
  rel="stylesheet"
9
  href="https://unpkg.com/[email protected]/dist/leaflet.css"
10
+ crossorigin=""
11
  />
12
  <script
13
  src="https://unpkg.com/[email protected]/dist/leaflet.js"
14
+ crossorigin=""
15
  ></script>
16
  <style>
17
  #map {
 
66
  const userCountElem = document.getElementById("userCount");
67
  const tbody = document.getElementById("userTableBody");
68
 
 
69
  const map = L.map('map').setView([35.681236, 139.767125], 5);
70
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
71
  maxZoom: 18,
 
74
 
75
  let markers = {};
76
 
 
77
  async function fetchGeo(ip) {
78
+ try {
79
+ const response = await fetch("https://soiz1-ip-address-api.hf.space/ip", {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify({ ip: ip })
83
+ });
84
+ if (!response.ok) {
85
+ console.error("APIエラー:", response.status);
86
+ return null;
87
+ }
88
+ const data = await response.json();
89
+ if (data && data.location && typeof data.location.latitude === "number" && typeof data.location.longitude === "number") {
90
+ return { lat: data.location.latitude, lon: data.location.longitude };
91
+ }
92
+ return null;
93
+ } catch (error) {
94
+ console.error("fetchGeo失敗:", error);
95
+ return null;
96
+ }
97
  }
 
98
 
99
  function createCircleMarker(lat, lon, color, popupText) {
100
  return L.circleMarker([lat, lon], {
 
116
 
117
  tbody.innerHTML = "";
118
 
119
+ for (let key in markers) {
 
120
  map.removeLayer(markers[key]);
121
  }
122
  markers = {};
123
 
 
124
  const positions = {};
125
  await Promise.all(Object.entries(userSessions).map(async ([socketId, info]) => {
126
  positions[socketId] = await fetchGeo(info.ip);
 
136
  const prevValue = previousSessions[socketId] ? previousSessions[socketId][elementKey] : undefined;
137
  const currValue = info[elementKey];
138
 
139
+ const changed = prevValue !== currValue;
140
 
141
  if (changed) {
142
  td.classList.add("highlight");
 
146
  return td;
147
  }
148
 
149
+ tr.appendChild(createTd(socketId, "socketId"));
150
  tr.appendChild(createTd(info.ip || "-", "ip"));
151
  tr.appendChild(createTd(info.connectTime ? new Date(info.connectTime).toLocaleString() : "-", "connectTime"));
152
  tr.appendChild(createTd(info.disconnectTime ? new Date(info.disconnectTime).toLocaleString() : "-", "disconnectTime"));
 
154
  tbody.appendChild(tr);
155
 
156
  const pos = positions[socketId];
157
+ if (pos) {
158
  const prevPos = previousSessions[socketId]?.geoPosition;
159
  let changedPos = true;
160
+ if (prevPos && Math.abs(prevPos.lat - pos.lat) < 0.0001 && Math.abs(prevPos.lon - pos.lon) < 0.0001) {
161
  changedPos = false;
162
  }
163
  const color = changedPos ? 'red' : 'black';
 
168
  }
169
  }
170
 
 
171
  const markerPositions = Object.values(markers).map(m => m.getLatLng());
172
+ if (markerPositions.length > 0) {
173
  const group = L.featureGroup(Object.values(markers));
174
  map.fitBounds(group.getBounds().pad(0.5));
175
  }
176
 
 
177
  const sessionsToStore = {};
178
+ for (const [socketId, info] of Object.entries(userSessions)) {
179
  sessionsToStore[socketId] = {
180
  ...info,
181
  geoPosition: positions[socketId] || null
182
  };
183
  }
 
184
  localStorage.setItem(STORAGE_KEY, JSON.stringify(sessionsToStore));
185
  previousSessions = sessionsToStore;
186
  });
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  </script>
189
  </body>
190
  </html>