import pandas as pd import streamlit as st 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() # # # [Work]code for instering youtube videos # # 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()