ISE / app.py
fikird
Update dependencies and push enhanced features to Space
d6bf15a
raw
history blame
11.1 kB
import gradio as gr
import asyncio
from search_engine import search, advanced_search
from osint_engine import create_report
import time
def format_results(results):
if not results:
return "No results found."
if isinstance(results, list):
# Format web search results
formatted_results = []
for result in results:
formatted_result = f"""
### [{result['title']}]({result['url']})
{result['summary']}
**Source:** {result['url']}
**Published:** {result.get('published_date', 'N/A')}
"""
formatted_results.append(formatted_result)
return "\n---\n".join(formatted_results)
elif isinstance(results, dict):
# Format OSINT results
if "error" in results:
return f"Error: {results['error']}"
formatted = []
# Web results
if "web" in results:
formatted.append(format_results(results["web"]))
# Username/Platform results
if "platforms" in results:
platforms = results["platforms"]
if platforms:
formatted.append("\n### πŸ” Platform Results\n")
for platform in platforms:
formatted.append(f"""
- **Platform:** {platform['platform']}
**URL:** [{platform['url']}]({platform['url']})
**Status:** {'Found βœ…' if platform.get('exists', False) else 'Not Found ❌'}
""")
# Image analysis
if "analysis" in results:
analysis = results["analysis"]
if analysis:
formatted.append("\n### πŸ–ΌοΈ Image Analysis\n")
for key, value in analysis.items():
formatted.append(f"- **{key.title()}:** {value}")
# Similar images
if "similar_images" in results:
similar = results["similar_images"]
if similar:
formatted.append("\n### πŸ” Similar Images\n")
for img in similar:
formatted.append(f"- [{img['source']}]({img['url']})")
# Location info
if "location" in results:
location = results["location"]
if location and not isinstance(location, str):
formatted.append("\n### πŸ“ Location Information\n")
for key, value in location.items():
if key != 'raw':
formatted.append(f"- **{key.title()}:** {value}")
# Domain info
if "domain" in results:
domain = results["domain"]
if domain and not isinstance(domain, str):
formatted.append("\n### 🌐 Domain Information\n")
for key, value in domain.items():
formatted.append(f"- **{key.title()}:** {value}")
# Historical data
if "historical" in results:
historical = results["historical"]
if historical:
formatted.append("\n### πŸ“… Historical Data\n")
for entry in historical[:5]: # Limit to 5 entries
formatted.append(f"""
- **Date:** {entry.get('timestamp', 'N/A')}
**URL:** [{entry.get('url', 'N/A')}]({entry.get('url', '#')})
**Type:** {entry.get('mime_type', 'N/A')}
""")
return "\n".join(formatted) if formatted else "No relevant information found."
else:
return str(results)
def safe_search(query, search_type="web", max_results=5, platform=None,
image_url=None, phone=None, location=None, domain=None,
name=None, address=None, progress=gr.Progress()):
"""Safe wrapper for search functions"""
try:
kwargs = {
"max_results": max_results,
"platform": platform,
"phone": phone,
"location": location,
"domain": domain,
"name": name,
"address": address
}
progress(0, desc="Initializing search...")
time.sleep(0.5) # Show loading state
if search_type == "web":
progress(0.3, desc="Searching web...")
results = search(query, max_results)
else:
# For async searches
if search_type == "image" and image_url:
query = image_url
progress(0.5, desc=f"Performing {search_type} search...")
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
results = loop.run_until_complete(advanced_search(query, search_type, **kwargs))
loop.close()
progress(0.8, desc="Processing results...")
time.sleep(0.5) # Show processing state
progress(1.0, desc="Done!")
return format_results(results)
except Exception as e:
return f"Error: {str(e)}"
# Create Gradio interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# πŸ” Intelligent Search Engine")
gr.Markdown("""
An AI-powered search engine with advanced OSINT capabilities.
Features:
- Web search with AI summaries
- Username search across platforms
- Image search and analysis
- Social media profile search
- Personal information gathering
- Historical data search
""")
with gr.Tab("Web Search"):
with gr.Row():
query_input = gr.Textbox(
label="Search Query",
placeholder="Enter your search query...",
lines=2
)
max_results = gr.Slider(
minimum=1,
maximum=10,
value=5,
step=1,
label="Number of Results"
)
search_button = gr.Button("πŸ” Search", variant="primary")
results_output = gr.Markdown(label="Search Results")
search_button.click(
fn=safe_search,
inputs=[query_input, gr.State("web"), max_results],
outputs=results_output,
show_progress=True
)
with gr.Tab("Username Search"):
username_input = gr.Textbox(
label="Username",
placeholder="Enter username to search..."
)
username_button = gr.Button("πŸ” Search Username", variant="primary")
username_output = gr.Markdown(label="Username Search Results")
username_button.click(
fn=safe_search,
inputs=[username_input, gr.State("username")],
outputs=username_output,
show_progress=True
)
with gr.Tab("Image Search"):
with gr.Row():
image_url = gr.Textbox(
label="Image URL",
placeholder="Enter image URL to search..."
)
image_upload = gr.Image(
label="Or Upload Image",
type="filepath"
)
image_button = gr.Button("πŸ” Search Image", variant="primary")
image_output = gr.Markdown(label="Image Search Results")
def handle_image_search(url, uploaded_image):
if uploaded_image:
return safe_search(uploaded_image, "image", image_url=uploaded_image)
return safe_search(url, "image", image_url=url)
image_button.click(
fn=handle_image_search,
inputs=[image_url, image_upload],
outputs=image_output,
show_progress=True
)
with gr.Tab("Social Media Search"):
with gr.Row():
social_username = gr.Textbox(
label="Username",
placeholder="Enter username..."
)
platform = gr.Dropdown(
choices=[
"all", "twitter", "instagram", "facebook", "linkedin",
"github", "reddit", "youtube", "tiktok", "pinterest",
"snapchat", "twitch", "medium", "devto", "stackoverflow"
],
value="all",
label="Platform"
)
social_button = gr.Button("πŸ” Search Social Media", variant="primary")
social_output = gr.Markdown(label="Social Media Results")
social_button.click(
fn=safe_search,
inputs=[social_username, gr.State("social"), gr.State(5), platform],
outputs=social_output,
show_progress=True
)
with gr.Tab("Personal Info"):
with gr.Group():
with gr.Row():
name = gr.Textbox(label="Full Name", placeholder="John Doe")
address = gr.Textbox(label="Address/Location", placeholder="City, Country")
initial_search = gr.Button("πŸ” Find Possible Matches", variant="primary")
matches_output = gr.Markdown(label="Possible Matches")
with gr.Row(visible=False) as details_row:
selected_person = gr.Dropdown(
choices=[],
label="Select Person",
interactive=True
)
details_button = gr.Button("πŸ” Get Detailed Info", variant="secondary")
details_output = gr.Markdown(label="Detailed Information")
def find_matches(name, address):
return safe_search(name, "personal", name=name, location=address)
def get_details(person):
if not person:
return "Please select a person first."
return safe_search(person, "personal", name=person)
initial_search.click(
fn=find_matches,
inputs=[name, address],
outputs=matches_output
).then(
lambda: gr.Row(visible=True),
None,
details_row
)
details_button.click(
fn=get_details,
inputs=[selected_person],
outputs=details_output,
show_progress=True
)
with gr.Tab("Historical Data"):
url_input = gr.Textbox(
label="URL",
placeholder="Enter URL to search historical data..."
)
historical_button = gr.Button("πŸ” Search Historical Data", variant="primary")
historical_output = gr.Markdown(label="Historical Data Results")
historical_button.click(
fn=safe_search,
inputs=[url_input, gr.State("historical")],
outputs=historical_output,
show_progress=True
)
gr.Markdown("""
### Examples
Try these example searches:
- Web Search: "Latest developments in artificial intelligence"
- Username: "johndoe"
- Image URL: "https://images.app.goo.gl/w5BtxZKvzg6BdkGE8"
- Social Media: "techuser" on Twitter
- Personal Info: "John Smith" in "New York, USA"
- Historical Data: "example.com"
""")
# Launch the app
if __name__ == "__main__":
demo.launch()