Spaces:
Runtime error
Runtime error
import gradio as gr | |
import asyncio | |
from search_engine import search, advanced_search | |
from osint_engine import create_report | |
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): | |
"""Safe wrapper for search functions""" | |
try: | |
kwargs = { | |
"max_results": max_results, | |
"platform": platform, | |
"phone": phone, | |
"location": location, | |
"domain": domain | |
} | |
if search_type == "web": | |
results = search(query, max_results) | |
else: | |
# For async searches | |
if search_type == "image" and image_url: | |
query = image_url | |
loop = asyncio.new_event_loop() | |
asyncio.set_event_loop(loop) | |
results = loop.run_until_complete(advanced_search(query, search_type, **kwargs)) | |
loop.close() | |
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") | |
results_output = gr.Markdown(label="Search Results") | |
search_button.click( | |
fn=lambda q, n: safe_search(q, "web", n), | |
inputs=[query_input, max_results], | |
outputs=results_output | |
) | |
with gr.Tab("Username Search"): | |
username_input = gr.Textbox( | |
label="Username", | |
placeholder="Enter username to search..." | |
) | |
username_button = gr.Button("Search Username") | |
username_output = gr.Markdown(label="Username Search Results") | |
username_button.click( | |
fn=lambda u: safe_search(u, "username"), | |
inputs=username_input, | |
outputs=username_output | |
) | |
with gr.Tab("Image Search"): | |
image_url = gr.Textbox( | |
label="Image URL", | |
placeholder="Enter image URL to search..." | |
) | |
image_button = gr.Button("Search Image") | |
image_output = gr.Markdown(label="Image Search Results") | |
image_button.click( | |
fn=lambda u: safe_search(u, "image", image_url=u), | |
inputs=image_url, | |
outputs=image_output | |
) | |
with gr.Tab("Social Media Search"): | |
with gr.Row(): | |
social_username = gr.Textbox( | |
label="Username", | |
placeholder="Enter username..." | |
) | |
platform = gr.Dropdown( | |
choices=["all", "instagram", "twitter", "reddit"], | |
value="all", | |
label="Platform" | |
) | |
social_button = gr.Button("Search Social Media") | |
social_output = gr.Markdown(label="Social Media Results") | |
social_button.click( | |
fn=lambda u, p: safe_search(u, "social", platform=p), | |
inputs=[social_username, platform], | |
outputs=social_output | |
) | |
with gr.Tab("Personal Info"): | |
with gr.Row(): | |
phone = gr.Textbox(label="Phone Number", placeholder="+1234567890") | |
location = gr.Textbox(label="Location", placeholder="City, Country") | |
domain = gr.Textbox(label="Domain", placeholder="example.com") | |
personal_button = gr.Button("Gather Information") | |
personal_output = gr.Markdown(label="Personal Information Results") | |
personal_button.click( | |
fn=lambda p, l, d: safe_search("", "personal", phone=p, location=l, domain=d), | |
inputs=[phone, location, domain], | |
outputs=personal_output | |
) | |
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") | |
historical_output = gr.Markdown(label="Historical Data Results") | |
historical_button.click( | |
fn=lambda u: safe_search(u, "historical"), | |
inputs=url_input, | |
outputs=historical_output | |
) | |
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 | |
- Historical Data: "example.com" | |
""") | |
# Launch the app | |
if __name__ == "__main__": | |
demo.launch() | |