minor locating feature fixes #7
44
app.py
44
app.py
@@ -39,30 +39,42 @@ app.logger.addHandler(handler)
|
|||||||
|
|
||||||
@app.route('/get-location')
|
@app.route('/get-location')
|
||||||
def get_location():
|
def get_location():
|
||||||
# 1. Try to get the forwarded IP first (for Docker/Production)
|
# Since you said /check-ip shows the correct IP, we use it directly
|
||||||
user_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
|
user_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
|
||||||
|
|
||||||
# 2. If it's a list (e.g. "1.2.3.4, 172.17.0.1"), take the first one
|
# Clean the IP if it's a list
|
||||||
if user_ip and ',' in user_ip:
|
if user_ip and ',' in user_ip:
|
||||||
user_ip = user_ip.split(',')[0].strip()
|
user_ip = user_ip.split(',')[0].strip()
|
||||||
|
|
||||||
# 3. Clean up any weird local addresses
|
|
||||||
if user_ip in ['127.0.0.1', 'localhost', '::1'] or user_ip.startswith('172.'):
|
|
||||||
# Fallback for testing only
|
|
||||||
return jsonify({"status": "success", "city": "Seoul", "country": "South Korea", "isp": "Test ISP"})
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Use HTTPS to be safer
|
# 1. We MUST send a User-Agent header or the API will block the request
|
||||||
response = requests.get(f'https://ipapi.co/{user_ip}/json/', timeout=5)
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2. Use ip-api.com (it's the most 'forgiving' for free testing)
|
||||||
|
response = requests.get(
|
||||||
|
f'http://ip-api.com/json/{user_ip}',
|
||||||
|
headers=headers,
|
||||||
|
timeout=5
|
||||||
|
)
|
||||||
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
return jsonify({
|
|
||||||
"status": "success",
|
if data.get('status') == 'success':
|
||||||
"city": data.get('city', 'Unknown'),
|
return jsonify({
|
||||||
"country": data.get('country_name', 'Unknown'),
|
"status": "success",
|
||||||
"isp": data.get('org', 'Unknown ISP')
|
"city": data.get('city'),
|
||||||
})
|
"country": data.get('country')
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
# This helps you debug: what did the API actually say?
|
||||||
|
print(f"API Error Message: {data.get('message')}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"status": "fail", "error": str(e)}), 500
|
print(f"Python Request Failed: {e}")
|
||||||
|
|
||||||
|
return jsonify({"status": "fail", "city": "Unknown", "country": "Location"})
|
||||||
|
|
||||||
@app.route('/check-ip')
|
@app.route('/check-ip')
|
||||||
def check_ip():
|
def check_ip():
|
||||||
|
|||||||
@@ -226,21 +226,24 @@
|
|||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
async function loadLocation() {
|
async function loadLocation() {
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/get-location');
|
// This calls the API from the USER'S browser.
|
||||||
const data = await response.json();
|
// The API will see the User's Real IP directly.
|
||||||
|
const response = await fetch('https://ipapi.co/json/');
|
||||||
if (data.status === 'success') {
|
const data = await response.json();
|
||||||
document.getElementById('location-display').innerHTML =
|
|
||||||
`${data.city}, ${data.country} <small>(${data.isp})</small>`;
|
if (data.city && data.country_name) {
|
||||||
document.getElementById('location-display').classList.remove('loading');
|
document.getElementById('location-display').innerText =
|
||||||
} else {
|
`${data.city}, ${data.country_name}`;
|
||||||
throw new Error();
|
document.getElementById('location-display').classList.remove('loading');
|
||||||
}
|
} else {
|
||||||
} catch (err) {
|
throw new Error("Missing data");
|
||||||
document.getElementById('location-display').innerText = "Unknown Location";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Location Error:", err);
|
||||||
|
document.getElementById('location-display').innerText = "Unknown Location";
|
||||||
|
}
|
||||||
|
}
|
||||||
loadLocation();
|
loadLocation();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user