add testing page to plot visitor location
This commit is contained in:
@@ -1,8 +1,54 @@
|
||||
import pandas as pd
|
||||
import streamlit as st
|
||||
import subprocess
|
||||
import requests
|
||||
import folium
|
||||
from streamlit_folium import folium_static
|
||||
import sqlite3
|
||||
from datetime import datetime
|
||||
|
||||
from webpages import code_editor as ce
|
||||
|
||||
|
||||
def get_ip():
|
||||
try:
|
||||
response = requests.get('https://api.ipify.org')
|
||||
return response.text
|
||||
except:
|
||||
return "Unable to get IP"
|
||||
|
||||
def get_location(ip_address):
|
||||
try:
|
||||
response = requests.get(f'https://ipapi.co/{ip_address}/json/')
|
||||
data = response.json()
|
||||
return data['latitude'], data['longitude'], data['city'], data['country_name']
|
||||
except:
|
||||
return None, None, "Unknown", "Unknown"
|
||||
|
||||
def save_visitor(conn, lat, lon, city, country):
|
||||
timestamp = datetime.now()
|
||||
c = conn.cursor()
|
||||
c.execute("INSERT INTO visitors (latitude, longitude, city, country, timestamp) VALUES (?, ?, ?, ?, ?)",
|
||||
(lat, lon, city, country, timestamp))
|
||||
conn.commit()
|
||||
|
||||
def get_all_visitors(conn):
|
||||
df = pd.read_sql_query("SELECT * from visitors", conn)
|
||||
return df
|
||||
|
||||
|
||||
|
||||
def create_map(df):
|
||||
m = folium.Map(location=[41.2706, -97.1749], zoom_start=4)
|
||||
# Create a custom icon
|
||||
|
||||
for _, row in df.iterrows():
|
||||
folium.Marker(
|
||||
location = [row['latitude'], row['longitude']],
|
||||
popup=f"{row['city']}",
|
||||
tooltip=f"{row['city']}"
|
||||
).add_to(m)
|
||||
return m
|
||||
|
||||
def testing():
|
||||
st.title("Testing Page")
|
||||
# ce.code_editor()
|
||||
@@ -11,3 +57,55 @@ def testing():
|
||||
# # video = "https://youtu.be/HluANRwPyNo?feature=shared"
|
||||
# # st.video(video)
|
||||
|
||||
|
||||
# Initialize the database
|
||||
conn = sqlite3.connect('./files/visitor_locations.db')
|
||||
c = conn.cursor()
|
||||
c.execute('''CREATE TABLE IF NOT EXISTS visitors
|
||||
(id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
latitude REAL,
|
||||
longitude REAL,
|
||||
city TEXT,
|
||||
country TEXT,
|
||||
timestamp DATETIME)''')
|
||||
conn.commit()
|
||||
|
||||
|
||||
|
||||
st.title('Visitor Location Tracker')
|
||||
|
||||
# Get and save current visitor's location
|
||||
ip = get_ip()
|
||||
lat, lon, city, country = get_location(ip)
|
||||
if lat and lon:
|
||||
save_visitor(conn, lat, lon, city, country)
|
||||
st.write(f"Your location: {city}, {country}")
|
||||
else:
|
||||
st.write("Unable to determine your location")
|
||||
|
||||
# Display all visitors on a map
|
||||
st.subheader('All Visitor Locations')
|
||||
df = get_all_visitors(conn)
|
||||
if not df.empty:
|
||||
m = create_map(df)
|
||||
folium_static(m)
|
||||
else:
|
||||
st.write("No visitor data available yet.")
|
||||
|
||||
# Display visitor statistics
|
||||
st.subheader('Visitor Statistics')
|
||||
col_visitors, col_cities, col_countries = st.columns(3)
|
||||
if not df.empty:
|
||||
with col_visitors:
|
||||
st.metric(label="Total visitors", value= df['id'].nunique())
|
||||
with col_cities:
|
||||
st.metric(label="Total cities", value= df['city'].nunique())
|
||||
with col_countries:
|
||||
st.metric(label="Total countries", value= df['country'].nunique())
|
||||
st.write("Top 5 cities:")
|
||||
st.write(df['city'].value_counts().head())
|
||||
else:
|
||||
st.write("No visitor data available yet.")
|
||||
|
||||
# Close the database connection
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user