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() | |