File size: 3,642 Bytes
f02770e
409c813
ceb6868
9fe0994
8b21f9c
851f58a
8b21f9c
 
 
 
 
 
 
 
 
 
 
 
 
 
ceb6868
5a18aa8
851f58a
5a18aa8
851f58a
5a18aa8
851f58a
8b21f9c
5a18aa8
8b21f9c
 
436f2c6
8b21f9c
 
851f58a
8b21f9c
 
 
 
 
851f58a
 
8b21f9c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436f2c6
8b21f9c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
851f58a
9fe0994
 
851f58a
8b21f9c
 
9fe0994
8b21f9c
 
851f58a
8b21f9c
 
 
 
 
 
851f58a
8b21f9c
f02770e
8b21f9c
f02770e
8b21f9c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import gradio as gr
import requests

def search_searx(query, instance_url='https://searx.org', categories='general'):
    """
    Perform a search using the Searx API.
    :param query: The search query string.
    :param instance_url: The URL of the Searx instance.
    :param categories: Categories to search in (e.g., 'general', 'images', 'videos').
    :return: A list of formatted search results or an error message.
    """
    search_endpoint = f"{instance_url}/search"
    params = {
        'q': query,
        'format': 'json',
        'categories': categories,
        'pageno': 1,          # Page number
        'time_range': '',     # Time range filter
        'engines': '',        # Specify search engines, comma-separated
        'safesearch': '0'     # Safe search (0: off, 1: moderate, 2: strict)
    }
    
    # Define a user agent
    headers = {
        'User-Agent': 'SearxGradioApp/1.0 (https://github.com/yourusername/searx-gradio-app)'
    }
    
    try:
        response = requests.get(search_endpoint, params=params, headers=headers, timeout=10)
        response.raise_for_status()  # Raise an error for bad status codes
        data = response.json()
        
        if 'results' not in data or not data['results']:
            return "No results found."
        
        formatted_results = ""
        for idx, result in enumerate(data['results'], start=1):
            title = result.get('title', 'No Title')
            url = result.get('url', 'No URL')
            snippet = result.get('content', 'No Description')
            formatted_results += f"**{idx}. {title}**\n[{url}]({url})\n{snippet}\n\n"
        
        return formatted_results
    except requests.exceptions.RequestException as e:
        return f"An error occurred while searching: {e}"

def create_gradio_interface():
    """
    Creates and returns the Gradio interface.
    """
    with gr.Blocks() as demo:
        gr.Markdown("# 🕵️‍♂️ Private Search with Searx and Gradio")
        gr.Markdown(
            "This application allows you to perform private searches using the [Searx](https://searx.org/) metasearch engine."
        )
        with gr.Row():
            with gr.Column():
                query = gr.Textbox(
                    label="Search Query",
                    placeholder="Enter your search query here...",
                    lines=1
                )
                instance_url = gr.Textbox(
                    label="Searx Instance URL",
                    value="https://searx.org",
                    placeholder="https://searx.instance.url",
                    lines=1
                )
                categories = gr.Textbox(
                    label="Categories",
                    value="general",
                    placeholder="e.g., general, images, videos",
                    lines=1
                )
                search_button = gr.Button("Search")
            with gr.Column():
                results = gr.Markdown("### Search Results will appear here...")
        
        def perform_search(q, url, cats):
            return search_searx(q, instance_url=url, categories=cats)
        
        search_button.click(
            perform_search,
            inputs=[query, instance_url, categories],
            outputs=results
        )
        
        gr.Markdown(
            """
            ---
            **Note:** This application uses the Searx metasearch engine to fetch results from multiple sources while preserving your privacy.
            """
        )
    
    return demo

iface = create_gradio_interface()

if __name__ == "__main__":
    iface.launch()