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 return create_report(results) 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://example.com/image.jpg" - Social Media: "techuser" on Twitter - Historical Data: "example.com" """) # Launch the app if __name__ == "__main__": demo.launch()