import streamlit as st import pandas as pd import plotly.express as px import plotly.graph_objects as go import numpy as np import altair as alt from datetime import datetime, timedelta def render_dashboard(): st.title("Dark Web Intelligence Dashboard") # Date range selector col1, col2 = st.columns([3, 1]) with col1: st.markdown("## Overview") st.markdown("Real-time monitoring of dark web activities, data breaches, and emerging threats.") with col2: date_range = st.selectbox( "Time Range", ["Last 24 Hours", "Last 7 Days", "Last 30 Days", "Last Quarter", "Custom Range"], index=1 ) # Dashboard metrics row metric_col1, metric_col2, metric_col3, metric_col4 = st.columns(4) with metric_col1: st.metric( label="Active Threats", value="27", delta="4", delta_color="inverse" ) with metric_col2: st.metric( label="Data Breaches", value="3", delta="-2", delta_color="normal" ) with metric_col3: st.metric( label="Credential Leaks", value="1,247", delta="89", delta_color="inverse" ) with metric_col4: st.metric( label="Threat Score", value="72/100", delta="12", delta_color="inverse" ) # First row - Threat map and category distribution row1_col1, row1_col2 = st.columns([2, 1]) with row1_col1: st.subheader("Global Threat Origin Map") # World map of threat origins fig = go.Figure(data=go.Choropleth( locations=['USA', 'RUS', 'CHN', 'IRN', 'PRK', 'UKR', 'DEU', 'GBR', 'CAN', 'BRA', 'IND'], z=[25, 42, 37, 30, 28, 18, 15, 20, 12, 14, 23], colorscale='Reds', autocolorscale=False, reversescale=False, marker_line_color='#2C3E50', marker_line_width=0.5, colorbar_title='Threat
Index', )) fig.update_layout( geo=dict( showframe=False, showcoastlines=True, projection_type='equirectangular', bgcolor='rgba(26, 26, 26, 0)', coastlinecolor='#2C3E50', landcolor='#1A1A1A', oceancolor='#2C3E50', ), paper_bgcolor='rgba(26, 26, 26, 0)', plot_bgcolor='rgba(26, 26, 26, 0)', margin=dict(l=0, r=0, t=0, b=0), height=400, ) st.plotly_chart(fig, use_container_width=True) with row1_col2: st.subheader("Threat Categories") # Threat category distribution categories = ['Data Breach', 'Ransomware', 'Phishing', 'Malware', 'Identity Theft'] values = [38, 24, 18, 14, 6] fig = px.pie( names=categories, values=values, hole=0.6, color_discrete_sequence=['#E74C3C', '#F1C40F', '#3498DB', '#2ECC71', '#9B59B6'] ) fig.update_layout( paper_bgcolor='rgba(26, 26, 26, 0)', plot_bgcolor='rgba(26, 26, 26, 0)', showlegend=True, legend=dict( orientation="v", yanchor="middle", y=0.5, xanchor="center", x=0.5 ), margin=dict(l=0, r=0, t=30, b=0), height=300, ) st.plotly_chart(fig, use_container_width=True) # Second row - Trend and recent activities row2_col1, row2_col2 = st.columns([3, 2]) with row2_col1: st.subheader("Threat Activity Trend") # Generate dates for the past 14 days dates = [(datetime.now() - timedelta(days=i)).strftime('%Y-%m-%d') for i in range(14, 0, -1)] # Sample data for threats over time threat_data = { 'Date': dates, 'High': [12, 10, 15, 11, 14, 16, 18, 20, 17, 12, 14, 13, 19, 22], 'Medium': [23, 25, 22, 20, 24, 25, 26, 24, 22, 21, 23, 25, 28, 27], 'Low': [32, 30, 35, 34, 36, 33, 30, 34, 38, 37, 35, 34, 32, 30] } df = pd.DataFrame(threat_data) # Create stacked area chart fig = go.Figure() fig.add_trace(go.Scatter( x=df['Date'], y=df['High'], mode='lines', line=dict(width=0.5, color='#E74C3C'), stackgroup='one', name='High' )) fig.add_trace(go.Scatter( x=df['Date'], y=df['Medium'], mode='lines', line=dict(width=0.5, color='#F1C40F'), stackgroup='one', name='Medium' )) fig.add_trace(go.Scatter( x=df['Date'], y=df['Low'], mode='lines', line=dict(width=0.5, color='#2ECC71'), stackgroup='one', name='Low' )) fig.update_layout( paper_bgcolor='rgba(26, 26, 26, 0)', plot_bgcolor='rgba(26, 26, 26, 0)', legend=dict( orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1 ), margin=dict(l=0, r=0, t=30, b=0), xaxis=dict( showgrid=False, title=None, tickfont=dict(color='#ECF0F1') ), yaxis=dict( showgrid=True, gridcolor='rgba(44, 62, 80, 0.3)', title=None, tickfont=dict(color='#ECF0F1') ), height=300 ) st.plotly_chart(fig, use_container_width=True) with row2_col2: st.subheader("Recent Intelligence Feeds") # Recent dark web activities activities = [ {"time": "10 mins ago", "event": "New ransomware group identified", "severity": "High"}, {"time": "43 mins ago", "event": "Database with 50K credentials for sale", "severity": "High"}, {"time": "2 hours ago", "event": "Zero-day exploit being discussed", "severity": "Medium"}, {"time": "3 hours ago", "event": "New phishing campaign detected", "severity": "Medium"}, {"time": "5 hours ago", "event": "PII data from financial institution leaked", "severity": "High"} ] for activity in activities: severity_color = "#E74C3C" if activity["severity"] == "High" else "#F1C40F" if activity["severity"] == "Medium" else "#2ECC71" cols = st.columns([1, 4, 1]) cols[0].caption(activity["time"]) cols[1].markdown(activity["event"]) cols[2].markdown(f"{activity['severity']}", unsafe_allow_html=True) st.markdown("---") # Third row - Sectors at risk and trending keywords row3_col1, row3_col2 = st.columns(2) with row3_col1: st.subheader("Sectors at Risk") # Horizontal bar chart for sectors at risk sectors = ['Healthcare', 'Finance', 'Technology', 'Education', 'Government', 'Manufacturing'] risk_scores = [87, 82, 75, 63, 78, 56] sector_data = pd.DataFrame({ 'Sector': sectors, 'Risk Score': risk_scores }) fig = px.bar( sector_data, x='Risk Score', y='Sector', orientation='h', color='Risk Score', color_continuous_scale=['#2ECC71', '#F1C40F', '#E74C3C'], range_color=[50, 100] ) fig.update_layout( paper_bgcolor='rgba(26, 26, 26, 0)', plot_bgcolor='rgba(26, 26, 26, 0)', margin=dict(l=0, r=0, t=0, b=0), height=250, coloraxis_showscale=False, xaxis=dict( showgrid=False, title=None, tickfont=dict(color='#ECF0F1') ), yaxis=dict( showgrid=False, title=None, tickfont=dict(color='#ECF0F1') ) ) st.plotly_chart(fig, use_container_width=True) with row3_col2: st.subheader("Trending Keywords") # Word cloud alternative - trending keywords with frequency keywords = [ {"word": "ransomware", "count": 42}, {"word": "zero-day", "count": 37}, {"word": "botnet", "count": 31}, {"word": "credentials", "count": 28}, {"word": "bitcoin", "count": 25}, {"word": "exploit", "count": 23}, {"word": "malware", "count": 21}, {"word": "backdoor", "count": 18}, {"word": "phishing", "count": 16}, {"word": "darknet", "count": 15} ] keyword_data = pd.DataFrame(keywords) # Calculate sizes for visual representation max_count = max(keyword_data['count']) keyword_data['size'] = keyword_data['count'].apply(lambda x: int((x / max_count) * 100) + 70) # Create a simple horizontal bar to represent frequency chart = alt.Chart(keyword_data).mark_bar().encode( x=alt.X('count:Q', title=None), y=alt.Y('word:N', title=None, sort='-x'), color=alt.Color('count:Q', scale=alt.Scale(scheme='reds'), legend=None) ).properties( height=250 ) st.altair_chart(chart, use_container_width=True) # Fourth row - Latest intelligence reports st.subheader("Latest Intelligence Reports") reports = [ { "title": "Major Healthcare Breach Analysis", "date": "2025-04-08", "summary": "Analysis of recent healthcare data breach affecting over 500,000 patient records.", "severity": "Critical" }, { "title": "Emerging Ransomware Group Activities", "date": "2025-04-07", "summary": "New ransomware group targeting financial institutions with sophisticated techniques.", "severity": "High" }, { "title": "Credential Harvesting Campaign", "date": "2025-04-05", "summary": "Widespread phishing campaign targeting corporate credentials across multiple sectors.", "severity": "Medium" } ] row4_cols = st.columns(3) for i, report in enumerate(reports): with row4_cols[i]: severity_color = "#E74C3C" if report["severity"] == "Critical" else "#F1C40F" if report["severity"] == "High" else "#2ECC71" st.markdown(f"#### {report['title']}") st.markdown(f"{report['severity']} | {report['date']}", unsafe_allow_html=True) st.markdown(report["summary"]) st.button("View Full Report", key=f"report_{i}")